From c235333041ad683c003c071ad0233c60ccea8484 Mon Sep 17 00:00:00 2001 From: Steve Howell Date: Tue, 10 Mar 2020 10:48:26 +0000 Subject: [PATCH] test performance: Pass in users to api_* helpers. This reduces query counts in some cases, since we no longer need to look up the user again. In particular, it reduces some noise when we count queries for O(N)-related tests. The query count is usually reduced by 2 per API call. We no longer need to look up Realm and UserProfile. In most cases we are saving these lookups for the whole tests, since we usually already have the `user` objects for other reasons. In a few places we are simply moving where that query happens within the test. In some places I shorten names like `test_user` or `user_profile` to just be `user`. --- zerver/lib/test_classes.py | 36 ++-- zerver/tests/test_bots.py | 2 +- zerver/tests/test_bugdown.py | 4 +- zerver/tests/test_decorators.py | 25 ++- zerver/tests/test_events.py | 18 +- zerver/tests/test_external.py | 32 ++-- zerver/tests/test_messages.py | 136 +++++++------- zerver/tests/test_muting.py | 22 +-- zerver/tests/test_presence.py | 47 ++--- zerver/tests/test_push_notifications.py | 29 +-- zerver/tests/test_reactions.py | 54 +++--- zerver/tests/test_realm.py | 6 +- zerver/tests/test_subs.py | 229 +++++++++++------------- zerver/tests/test_thumbnail.py | 9 +- zerver/tests/test_typing.py | 30 ++-- zerver/tests/test_unread.py | 6 +- zerver/tests/test_upload.py | 26 +-- zerver/tests/test_user_groups.py | 2 +- zerver/tests/test_users.py | 4 +- zerver/tests/test_widgets.py | 20 +-- zerver/webhooks/beanstalk/tests.py | 28 +-- zerver/webhooks/bitbucket/tests.py | 18 +- zerver/webhooks/deskdotcom/tests.py | 8 +- zerver/webhooks/freshdesk/tests.py | 14 +- zerver/webhooks/zendesk/tests.py | 2 +- 25 files changed, 401 insertions(+), 406 deletions(-) diff --git a/zerver/lib/test_classes.py b/zerver/lib/test_classes.py index 71faf60673..36acb7d947 100644 --- a/zerver/lib/test_classes.py +++ b/zerver/lib/test_classes.py @@ -430,14 +430,16 @@ class ZulipTestCase(TestCase): return self.encode_credentials(uuid, api_key) + def encode_user(self, user: UserProfile) -> str: + email = user.delivery_email + api_key = user.api_key + return self.encode_credentials(email, api_key) + def encode_email(self, email: str, realm: str="zulip") -> str: + # TODO: use encode_user where possible assert '@' in email - if email in self.API_KEYS: - api_key = self.API_KEYS[email] - else: - user = get_user_by_delivery_email(email, get_realm(realm)) - api_key = get_api_key(user) - self.API_KEYS[email] = api_key + user = get_user_by_delivery_email(email, get_realm(realm)) + api_key = get_api_key(user) return self.encode_credentials(email, api_key) @@ -456,20 +458,20 @@ class ZulipTestCase(TestCase): kwargs['HTTP_AUTHORIZATION'] = self.encode_uuid(identifier) return self.client_post(*args, **kwargs) - def api_get(self, identifier: str, *args: Any, **kwargs: Any) -> HttpResponse: - kwargs['HTTP_AUTHORIZATION'] = self.encode_email(identifier, kwargs.get('subdomain', 'zulip')) + def api_get(self, user: UserProfile, *args: Any, **kwargs: Any) -> HttpResponse: + kwargs['HTTP_AUTHORIZATION'] = self.encode_user(user) return self.client_get(*args, **kwargs) - def api_post(self, identifier: str, *args: Any, **kwargs: Any) -> HttpResponse: - kwargs['HTTP_AUTHORIZATION'] = self.encode_email(identifier, kwargs.get('subdomain', 'zulip')) + def api_post(self, user: UserProfile, *args: Any, **kwargs: Any) -> HttpResponse: + kwargs['HTTP_AUTHORIZATION'] = self.encode_user(user) return self.client_post(*args, **kwargs) - def api_patch(self, identifier: str, *args: Any, **kwargs: Any) -> HttpResponse: - kwargs['HTTP_AUTHORIZATION'] = self.encode_email(identifier, kwargs.get('subdomain', 'zulip')) + def api_patch(self, user: UserProfile, *args: Any, **kwargs: Any) -> HttpResponse: + kwargs['HTTP_AUTHORIZATION'] = self.encode_user(user) return self.client_patch(*args, **kwargs) - def api_delete(self, identifier: str, *args: Any, **kwargs: Any) -> HttpResponse: - kwargs['HTTP_AUTHORIZATION'] = self.encode_email(identifier, kwargs.get('subdomain', 'zulip')) + def api_delete(self, user: UserProfile, *args: Any, **kwargs: Any) -> HttpResponse: + kwargs['HTTP_AUTHORIZATION'] = self.encode_user(user) return self.client_delete(*args, **kwargs) def get_streams(self, user_profile: UserProfile) -> List[str]: @@ -696,7 +698,7 @@ class ZulipTestCase(TestCase): post_data = {'subscriptions': ujson.dumps([{"name": stream} for stream in streams]), 'invite_only': ujson.dumps(invite_only)} post_data.update(extra_post_data) - result = self.api_post(user.email, "/api/v1/users/me/subscriptions", post_data, **kwargs) + result = self.api_post(user, "/api/v1/users/me/subscriptions", post_data, **kwargs) return result def check_user_subscribed_only_to_streams(self, user_name: str, @@ -865,8 +867,8 @@ class WebhookTestCase(ZulipTestCase): super().setUp() self.url = self.build_webhook_url() - def api_stream_message(self, email: str, *args: Any, **kwargs: Any) -> HttpResponse: - kwargs['HTTP_AUTHORIZATION'] = self.encode_email(email) + def api_stream_message(self, user: UserProfile, *args: Any, **kwargs: Any) -> HttpResponse: + kwargs['HTTP_AUTHORIZATION'] = self.encode_user(user) return self.send_and_test_stream_message(*args, **kwargs) def send_and_test_stream_message(self, fixture_name: str, expected_topic: Optional[str]=None, diff --git a/zerver/tests/test_bots.py b/zerver/tests/test_bots.py index cf15d3fd84..6def44679b 100644 --- a/zerver/tests/test_bots.py +++ b/zerver/tests/test_bots.py @@ -1179,7 +1179,7 @@ class BotTest(ZulipTestCase, UploadSerializeMixin): # Make sure the bot cannot create their own default stream. url = "/api/v1/bots/{}".format(bot_user.id) - result = self.api_patch(bot_user.email, url, bot_info) + result = self.api_patch(bot_user, url, bot_info) self.assert_json_error_contains(result, 'endpoint does not accept') def test_patch_bot_events_register_stream_allowed(self) -> None: diff --git a/zerver/tests/test_bugdown.py b/zerver/tests/test_bugdown.py index d02f652407..f9ff086568 100644 --- a/zerver/tests/test_bugdown.py +++ b/zerver/tests/test_bugdown.py @@ -1970,7 +1970,7 @@ class BugdownApiTests(ZulipTestCase): def test_render_message_api(self) -> None: content = 'That is a **bold** statement' result = self.api_post( - self.example_email("othello"), + self.example_user("othello"), '/api/v1/messages/render', dict(content=content) ) @@ -1982,7 +1982,7 @@ class BugdownApiTests(ZulipTestCase): """Determines whether we're correctly passing the realm context""" content = 'This mentions #**Denmark** and @**King Hamlet**.' result = self.api_post( - self.example_email("othello"), + self.example_user("othello"), '/api/v1/messages/render', dict(content=content) ) diff --git a/zerver/tests/test_decorators.py b/zerver/tests/test_decorators.py index b5935b373a..f8b23d68a9 100644 --- a/zerver/tests/test_decorators.py +++ b/zerver/tests/test_decorators.py @@ -1014,7 +1014,7 @@ class DeactivatedRealmTest(ZulipTestCase): "to": self.example_email("othello")}) self.assert_json_error_contains(result, "has been deactivated", status_code=400) - result = self.api_post(self.example_email("hamlet"), + result = self.api_post(self.example_user("hamlet"), "/api/v1/messages", {"type": "private", "content": "Test message", "client": "test suite", @@ -1142,7 +1142,7 @@ class InactiveUserTest(ZulipTestCase): "to": self.example_email("othello")}) self.assert_json_error_contains(result, "Account is deactivated", status_code=400) - result = self.api_post(self.example_email("hamlet"), + result = self.api_post(self.example_user("hamlet"), "/api/v1/messages", {"type": "private", "content": "Test message", "client": "test suite", @@ -1238,20 +1238,16 @@ class InactiveUserTest(ZulipTestCase): class TestIncomingWebhookBot(ZulipTestCase): - def setUp(self) -> None: - super().setUp() - zulip_realm = get_realm('zulip') - self.webhook_bot = get_user('webhook-bot@zulip.com', zulip_realm) - def test_webhook_bot_permissions(self) -> None: - result = self.api_post("webhook-bot@zulip.com", + webhook_bot = self.example_user('webhook_bot') + result = self.api_post(webhook_bot, "/api/v1/messages", {"type": "private", "content": "Test message", "client": "test suite", "to": self.example_email("othello")}) self.assert_json_success(result) post_params = {"anchor": 1, "num_before": 1, "num_after": 1} - result = self.api_get("webhook-bot@zulip.com", "/api/v1/messages", dict(post_params)) + result = self.api_get(webhook_bot, "/api/v1/messages", dict(post_params)) self.assert_json_error(result, 'This API is not available to incoming webhook bots.', status_code=401) @@ -1405,6 +1401,8 @@ class TestInternalNotifyView(TestCase): class TestHumanUsersOnlyDecorator(ZulipTestCase): def test_human_only_endpoints(self) -> None: + default_bot = self.example_user('default_bot') + post_endpoints = [ "/api/v1/users/me/apns_device_token", "/api/v1/users/me/android_gcm_reg_id", @@ -1417,7 +1415,7 @@ class TestHumanUsersOnlyDecorator(ZulipTestCase): "/api/v1/report/unnarrow_times", ] for endpoint in post_endpoints: - result = self.api_post('default-bot@zulip.com', endpoint) + result = self.api_post(default_bot, endpoint) self.assert_json_error(result, "This endpoint does not accept bot requests.") patch_endpoints = [ @@ -1427,7 +1425,7 @@ class TestHumanUsersOnlyDecorator(ZulipTestCase): "/api/v1/users/me/profile_data" ] for endpoint in patch_endpoints: - result = self.api_patch('default-bot@zulip.com', endpoint) + result = self.api_patch(default_bot, endpoint) self.assert_json_error(result, "This endpoint does not accept bot requests.") delete_endpoints = [ @@ -1435,7 +1433,7 @@ class TestHumanUsersOnlyDecorator(ZulipTestCase): "/api/v1/users/me/android_gcm_reg_id", ] for endpoint in delete_endpoints: - result = self.api_delete('default-bot@zulip.com', endpoint) + result = self.api_delete(default_bot, endpoint) self.assert_json_error(result, "This endpoint does not accept bot requests.") class TestAuthenticatedJsonPostViewDecorator(ZulipTestCase): @@ -1650,7 +1648,8 @@ class TestRequireDecorators(ZulipTestCase): self.assert_json_error(result, "Not allowed for guest users") def test_require_member_or_admin_decorator(self) -> None: - result = self.api_get("outgoing-webhook@zulip.com", '/api/v1/bots') + outgoing_webhook_bot = self.example_user('outgoing_webhook_bot') + result = self.api_get(outgoing_webhook_bot, '/api/v1/bots') self.assert_json_error(result, "This endpoint does not accept bot requests.") guest_user = self.example_user('polonius') diff --git a/zerver/tests/test_events.py b/zerver/tests/test_events.py index b646a3141e..65dce6de49 100644 --- a/zerver/tests/test_events.py +++ b/zerver/tests/test_events.py @@ -178,13 +178,13 @@ class EventsEndpointTest(ZulipTestCase): # This test is intended to get minimal coverage on the # events_register code paths - email = self.example_email("hamlet") + user = self.example_user("hamlet") with mock.patch('zerver.views.events_register.do_events_register', return_value={}): - result = self.api_post(email, '/json/register') + result = self.api_post(user, '/json/register') self.assert_json_success(result) with mock.patch('zerver.lib.events.request_event_queue', return_value=None): - result = self.api_post(email, '/json/register') + result = self.api_post(user, '/json/register') self.assert_json_error(result, "Could not allocate event queue") return_event_queue = '15:11' @@ -193,11 +193,11 @@ class EventsEndpointTest(ZulipTestCase): # Test that call is made to deal with a returning soft deactivated user. with mock.patch('zerver.lib.events.reactivate_user_if_soft_deactivated') as fa: with stub_event_queue_user_events(return_event_queue, return_user_events): - result = self.api_post(email, '/json/register', dict(event_types=ujson.dumps(['pointer']))) + result = self.api_post(user, '/json/register', dict(event_types=ujson.dumps(['pointer']))) self.assertEqual(fa.call_count, 1) with stub_event_queue_user_events(return_event_queue, return_user_events): - result = self.api_post(email, '/json/register', dict(event_types=ujson.dumps(['pointer']))) + result = self.api_post(user, '/json/register', dict(event_types=ujson.dumps(['pointer']))) self.assert_json_success(result) result_dict = result.json() self.assertEqual(result_dict['last_event_id'], -1) @@ -212,7 +212,7 @@ class EventsEndpointTest(ZulipTestCase): } ] with stub_event_queue_user_events(return_event_queue, return_user_events): - result = self.api_post(email, '/json/register', dict(event_types=ujson.dumps(['pointer']))) + result = self.api_post(user, '/json/register', dict(event_types=ujson.dumps(['pointer']))) self.assert_json_success(result) result_dict = result.json() @@ -223,7 +223,7 @@ class EventsEndpointTest(ZulipTestCase): # Now test with `fetch_event_types` not matching the event return_event_queue = '15:13' with stub_event_queue_user_events(return_event_queue, return_user_events): - result = self.api_post(email, '/json/register', + result = self.api_post(user, '/json/register', dict(event_types=ujson.dumps(['pointer']), fetch_event_types=ujson.dumps(['message']))) self.assert_json_success(result) @@ -237,7 +237,7 @@ class EventsEndpointTest(ZulipTestCase): # Now test with `fetch_event_types` matching the event with stub_event_queue_user_events(return_event_queue, return_user_events): - result = self.api_post(email, '/json/register', + result = self.api_post(user, '/json/register', dict(fetch_event_types=ujson.dumps(['pointer']), event_types=ujson.dumps(['message']))) self.assert_json_success(result) @@ -1214,7 +1214,7 @@ class EventsRegisterTest(ZulipTestCase): ])), ]) - self.api_post(self.user_profile.email, "/api/v1/users/me/presence", {'status': 'idle'}, + self.api_post(self.user_profile, "/api/v1/users/me/presence", {'status': 'idle'}, HTTP_USER_AGENT="ZulipAndroid/1.0") self.do_test(lambda: do_update_user_presence( self.user_profile, get_client("website"), timezone_now(), UserPresence.ACTIVE)) diff --git a/zerver/tests/test_external.py b/zerver/tests/test_external.py index 3a2933ad9a..66e9e54bda 100644 --- a/zerver/tests/test_external.py +++ b/zerver/tests/test_external.py @@ -18,6 +18,10 @@ from zerver.lib.test_classes import ( ZulipTestCase, ) +from zerver.models import ( + UserProfile, +) + import DNS import mock import time @@ -58,43 +62,40 @@ class RateLimitTests(ZulipTestCase): super().tearDown() - def send_api_message(self, email: str, content: str) -> HttpResponse: - return self.api_post(email, "/api/v1/messages", {"type": "stream", - "to": "Verona", - "client": "test suite", - "content": content, - "topic": "whatever"}) + def send_api_message(self, user: UserProfile, content: str) -> HttpResponse: + return self.api_post(user, "/api/v1/messages", {"type": "stream", + "to": "Verona", + "client": "test suite", + "content": content, + "topic": "whatever"}) def test_headers(self) -> None: user = self.example_user('hamlet') - email = user.email clear_history(RateLimitedUser(user)) - result = self.send_api_message(email, "some stuff") + result = self.send_api_message(user, "some stuff") self.assertTrue('X-RateLimit-Remaining' in result) self.assertTrue('X-RateLimit-Limit' in result) self.assertTrue('X-RateLimit-Reset' in result) def test_ratelimit_decrease(self) -> None: user = self.example_user('hamlet') - email = user.email clear_history(RateLimitedUser(user)) - result = self.send_api_message(email, "some stuff") + result = self.send_api_message(user, "some stuff") limit = int(result['X-RateLimit-Remaining']) - result = self.send_api_message(email, "some stuff 2") + result = self.send_api_message(user, "some stuff 2") newlimit = int(result['X-RateLimit-Remaining']) self.assertEqual(limit, newlimit + 1) def test_hit_ratelimits(self) -> None: user = self.example_user('cordelia') - email = user.email clear_history(RateLimitedUser(user)) start_time = time.time() for i in range(6): with mock.patch('time.time', return_value=(start_time + i * 0.1)): - result = self.send_api_message(email, "some stuff %s" % (i,)) + result = self.send_api_message(user, "some stuff %s" % (i,)) self.assertEqual(result.status_code, 429) json = result.json() @@ -108,19 +109,18 @@ class RateLimitTests(ZulipTestCase): # to make sure the rate-limiting code automatically forgives a user # after some time has passed. with mock.patch('time.time', return_value=(start_time + 1.0)): - result = self.send_api_message(email, "Good message") + result = self.send_api_message(user, "Good message") self.assert_json_success(result) @mock.patch('zerver.lib.rate_limiter.logger.warning') def test_hit_ratelimiterlockingexception(self, mock_warn: mock.MagicMock) -> None: user = self.example_user('cordelia') - email = user.email clear_history(RateLimitedUser(user)) with mock.patch('zerver.lib.rate_limiter.incr_ratelimit', side_effect=RateLimiterLockingException): - result = self.send_api_message(email, "some stuff") + result = self.send_api_message(user, "some stuff") self.assertEqual(result.status_code, 429) mock_warn.assert_called_with("Deadlock trying to incr_ratelimit for RateLimitedUser:Id: %s" % (user.id,)) diff --git a/zerver/tests/test_messages.py b/zerver/tests/test_messages.py index 1fbe9f343e..4d0a6f68f8 100644 --- a/zerver/tests/test_messages.py +++ b/zerver/tests/test_messages.py @@ -1153,29 +1153,28 @@ class StreamMessagesTest(ZulipTestCase): self.assertTrue(user_message.flags.mentioned) def test_stream_message_mirroring(self) -> None: - user_profile = self.mit_user('starnine') - email = user_profile.email - self.subscribe(user_profile, 'Verona') + user = self.mit_user('starnine') + self.subscribe(user, 'Verona') - do_change_is_admin(user_profile, True, 'api_super_user') - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "to": "Verona", - "sender": self.mit_email("sipbtest"), - "client": "zephyr_mirror", - "topic": "announcement", - "content": "Everyone knows Iago rules", - "forged": "true"}, + do_change_is_admin(user, True, 'api_super_user') + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "to": "Verona", + "sender": self.mit_email("sipbtest"), + "client": "zephyr_mirror", + "topic": "announcement", + "content": "Everyone knows Iago rules", + "forged": "true"}, subdomain="zephyr") self.assert_json_success(result) - do_change_is_admin(user_profile, False, 'api_super_user') - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "to": "Verona", - "sender": self.mit_email("sipbtest"), - "client": "zephyr_mirror", - "topic": "announcement", - "content": "Everyone knows Iago rules", - "forged": "true"}, + do_change_is_admin(user, False, 'api_super_user') + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "to": "Verona", + "sender": self.mit_email("sipbtest"), + "client": "zephyr_mirror", + "topic": "announcement", + "content": "Everyone knows Iago rules", + "forged": "true"}, subdomain="zephyr") self.assert_json_error(result, "User not authorized for this query") @@ -1471,7 +1470,7 @@ class MessagePOSTTest(ZulipTestCase): def _send_and_verify_message(self, user: UserProfile, stream_name: str, error_msg: str=None) -> None: if error_msg is None: msg_id = self.send_stream_message(user, stream_name) - result = self.api_get(user.email, '/json/messages/' + str(msg_id)) + result = self.api_get(user, '/json/messages/' + str(msg_id)) self.assert_json_success(result) else: with self.assertRaisesRegex(JsonableError, error_msg): @@ -1494,12 +1493,12 @@ class MessagePOSTTest(ZulipTestCase): """ Same as above, but for the API view """ - email = self.example_email("hamlet") - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "to": "Verona", - "client": "test suite", - "content": "Test message", - "topic": "Test topic"}) + user = self.example_user('hamlet') + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "to": "Verona", + "client": "test suite", + "content": "Test message", + "topic": "Test topic"}) self.assert_json_success(result) def test_message_to_stream_with_nonexistent_id(self) -> None: @@ -1509,7 +1508,7 @@ class MessagePOSTTest(ZulipTestCase): user_profile=cordelia, ) result = self.api_post( - bot.email, "/api/v1/messages", + bot, "/api/v1/messages", { "type": "stream", "to": ujson.dumps([99999]), @@ -1664,14 +1663,13 @@ class MessagePOSTTest(ZulipTestCase): Sending messages without a to field should be sent to the default stream for the user_profile. """ - user_profile = self.example_user('hamlet') - email = user_profile.email - user_profile.default_sending_stream_id = get_stream('Verona', user_profile.realm).id - user_profile.save() - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "client": "test suite", - "content": "Test message no to", - "topic": "Test topic"}) + user = self.example_user('hamlet') + user.default_sending_stream_id = get_stream('Verona', user.realm).id + user.save() + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "client": "test suite", + "content": "Test message no to", + "topic": "Test topic"}) self.assert_json_success(result) sent_message = self.get_last_message() @@ -1911,7 +1909,7 @@ class MessagePOSTTest(ZulipTestCase): """ Sending a mirrored huddle message works """ - result = self.api_post(self.mit_email("starnine"), + result = self.api_post(self.mit_user("starnine"), "/json/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -1925,7 +1923,7 @@ class MessagePOSTTest(ZulipTestCase): """ Sending a mirrored personal message works """ - result = self.api_post(self.mit_email("starnine"), + result = self.api_post(self.mit_user("starnine"), "/json/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -1952,7 +1950,7 @@ class MessagePOSTTest(ZulipTestCase): """ Sending a mirrored personal message to someone else is not allowed. """ - result = self.api_post(self.mit_email("starnine"), "/api/v1/messages", + result = self.api_post(self.mit_user("starnine"), "/api/v1/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -1973,12 +1971,12 @@ class MessagePOSTTest(ZulipTestCase): self.mit_email("starnine")])} with mock.patch('DNS.dnslookup', return_value=[['starnine:*:84233:101:Athena Consulting Exchange User,,,:/mit/starnine:/bin/bash']]): - result1 = self.api_post(self.mit_email("starnine"), "/api/v1/messages", msg, + result1 = self.api_post(self.mit_user("starnine"), "/api/v1/messages", msg, subdomain="zephyr") self.assert_json_success(result1) with mock.patch('DNS.dnslookup', return_value=[['espuser:*:95494:101:Esp Classroom,,,:/mit/espuser:/bin/athena/bash']]): - result2 = self.api_post(self.mit_email("espuser"), "/api/v1/messages", msg, + result2 = self.api_post(self.mit_user("espuser"), "/api/v1/messages", msg, subdomain="zephyr") self.assert_json_success(result2) @@ -2065,7 +2063,7 @@ class MessagePOSTTest(ZulipTestCase): user.set_password(password) user.is_api_super_user = True user.save() - result = self.api_post(user.email, + result = self.api_post(user, "/api/v1/messages", {"type": "stream", "to": "Verona", "client": "test suite", @@ -2077,7 +2075,7 @@ class MessagePOSTTest(ZulipTestCase): self.assert_json_error(result, "Unknown organization 'non-existing'") def test_send_message_when_sender_is_not_set(self) -> None: - result = self.api_post(self.mit_email("starnine"), "/api/v1/messages", + result = self.api_post(self.mit_user("starnine"), "/api/v1/messages", {"type": "private", "content": "Test message", "client": "zephyr_mirror", @@ -2086,7 +2084,7 @@ class MessagePOSTTest(ZulipTestCase): self.assert_json_error(result, "Missing sender") def test_send_message_as_not_superuser_when_type_is_not_private(self) -> None: - result = self.api_post(self.mit_email("starnine"), "/api/v1/messages", + result = self.api_post(self.mit_user("starnine"), "/api/v1/messages", {"type": "not-private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -2099,7 +2097,7 @@ class MessagePOSTTest(ZulipTestCase): def test_send_message_create_mirrored_message_user_returns_invalid_input( self, create_mirrored_message_users_mock: Any) -> None: create_mirrored_message_users_mock.side_effect = InvalidMirrorInput() - result = self.api_post(self.mit_email("starnine"), "/api/v1/messages", + result = self.api_post(self.mit_user("starnine"), "/api/v1/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -2115,7 +2113,7 @@ class MessagePOSTTest(ZulipTestCase): user = self.mit_user("starnine") user.realm.string_id = 'notzephyr' user.realm.save() - result = self.api_post(user.email, "/api/v1/messages", + result = self.api_post(user, "/api/v1/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -2130,7 +2128,7 @@ class MessagePOSTTest(ZulipTestCase): create_mirrored_message_users_mock.return_value = mock.Mock() user = self.mit_user("starnine") user_id = user.id - result = self.api_post(user.email, "/api/v1/messages", + result = self.api_post(user, "/api/v1/messages", {"type": "private", "sender": self.mit_email("sipbtest"), "content": "Test message", @@ -2159,14 +2157,14 @@ class MessagePOSTTest(ZulipTestCase): fake_date_sent = timezone_now() - datetime.timedelta(minutes=37) fake_timestamp = datetime_to_timestamp(fake_date_sent) - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "forged": "true", - "time": fake_timestamp, - "sender": "irc-user@irc.zulip.com", - "content": "Test message", - "client": "irc_mirror", - "topic": "from irc", - "to": "IRCLand"}) + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "forged": "true", + "time": fake_timestamp, + "sender": "irc-user@irc.zulip.com", + "content": "Test message", + "client": "irc_mirror", + "topic": "from irc", + "to": "IRCLand"}) self.assert_json_success(result) msg = self.get_last_message() @@ -2176,14 +2174,14 @@ class MessagePOSTTest(ZulipTestCase): fake_date_sent = timezone_now() - datetime.timedelta(minutes=22) fake_timestamp = datetime_to_timestamp(fake_date_sent) - result = self.api_post(email, "/api/v1/messages", {"type": "stream", - "forged": "yes", - "time": fake_timestamp, - "sender": "irc-user@irc.zulip.com", - "content": "Test message", - "client": "irc_mirror", - "topic": "from irc", - "to": "IRCLand"}) + result = self.api_post(user, "/api/v1/messages", {"type": "stream", + "forged": "yes", + "time": fake_timestamp, + "sender": "irc-user@irc.zulip.com", + "content": "Test message", + "client": "irc_mirror", + "topic": "from irc", + "to": "IRCLand"}) self.assert_json_success(result) msg = self.get_last_message() @@ -2217,13 +2215,13 @@ class MessagePOSTTest(ZulipTestCase): cordelia.is_api_super_user = False cordelia.save() - result = self.api_post(cordelia.email, "/api/v1/messages", payload) + result = self.api_post(cordelia, "/api/v1/messages", payload) self.assert_json_error_contains(result, 'authorized') cordelia.is_api_super_user = True cordelia.save() - result = self.api_post(cordelia.email, "/api/v1/messages", payload) + result = self.api_post(cordelia, "/api/v1/messages", payload) self.assert_json_success(result) test_with( @@ -2256,13 +2254,13 @@ class MessagePOSTTest(ZulipTestCase): content='whatever', ) - result = self.api_post(bot.email, "/api/v1/messages", payload) + result = self.api_post(bot, "/api/v1/messages", payload) self.assert_json_error_contains(result, 'Not authorized to send') # We subscribe the bot owner! (aka cordelia) self.subscribe(bot.bot_owner, stream_name) - result = self.api_post(bot.email, "/api/v1/messages", payload) + result = self.api_post(bot, "/api/v1/messages", payload) self.assert_json_success(result) def test_cross_realm_bots_can_use_api_on_own_subdomain(self) -> None: @@ -2270,7 +2268,7 @@ class MessagePOSTTest(ZulipTestCase): notification_bot = self.notification_bot() stream = self.make_stream("notify_channel", get_realm("zulipinternal")) - result = self.api_post(notification_bot.email, + result = self.api_post(notification_bot, "/api/v1/messages", {"type": "stream", "to": "notify_channel", @@ -2332,12 +2330,12 @@ class MessagePOSTTest(ZulipTestCase): ) # Guest user can't send message to unsubscribed public streams - result = self.api_post(sender.email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_error(result, "Not authorized to send to stream 'public stream'") self.subscribe(sender, stream_name) # Guest user can send message to subscribed public streams - result = self.api_post(sender.email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_success(result) class ScheduledMessageTest(ZulipTestCase): diff --git a/zerver/tests/test_muting.py b/zerver/tests/test_muting.py index 98b7b81ecd..ef20e9e4bf 100644 --- a/zerver/tests/test_muting.py +++ b/zerver/tests/test_muting.py @@ -70,7 +70,7 @@ class MutedTopicsTests(ZulipTestCase): ] for data in payloads: - result = self.api_patch(user.email, url, data) + result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) @@ -109,7 +109,7 @@ class MutedTopicsTests(ZulipTestCase): ) self.assertIn([stream.name, 'Verona3'], get_topic_mutes(user)) - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_success(result) self.assertNotIn([stream.name, 'Verona3'], get_topic_mutes(user)) @@ -134,19 +134,19 @@ class MutedTopicsTests(ZulipTestCase): url = '/api/v1/users/me/subscriptions/muted_topics' data = {'stream': stream.name, 'topic': 'Verona3', 'op': 'add'} # type: Dict[str, Any] - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Topic already muted") data = {'stream_id': 999999999, 'topic': 'Verona3', 'op': 'add'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Invalid stream id") data = {'topic': 'Verona3', 'op': 'add'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Please supply 'stream'.") data = {'stream': stream.name, 'stream_id': stream.id, 'topic': 'Verona3', 'op': 'add'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Please choose one: 'stream' or 'stream_id'.") def test_muted_topic_remove_invalid(self) -> None: @@ -158,21 +158,21 @@ class MutedTopicsTests(ZulipTestCase): url = '/api/v1/users/me/subscriptions/muted_topics' data = {'stream': 'BOGUS', 'topic': 'Verona3', 'op': 'remove'} # type: Dict[str, Any] - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Topic is not muted") data = {'stream': stream.name, 'topic': 'BOGUS', 'op': 'remove'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Topic is not muted") data = {'stream_id': 999999999, 'topic': 'BOGUS', 'op': 'remove'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Topic is not muted") data = {'topic': 'Verona3', 'op': 'remove'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Please supply 'stream'.") data = {'stream': stream.name, 'stream_id': stream.id, 'topic': 'Verona3', 'op': 'remove'} - result = self.api_patch(email, url, data) + result = self.api_patch(user, url, data) self.assert_json_error(result, "Please choose one: 'stream' or 'stream_id'.") diff --git a/zerver/tests/test_presence.py b/zerver/tests/test_presence.py index 98dda2c4f6..a8233c9f5c 100644 --- a/zerver/tests/test_presence.py +++ b/zerver/tests/test_presence.py @@ -356,12 +356,12 @@ class SingleUserPresenceTests(ZulipTestCase): def test_single_user_get(self) -> None: # First, we setup the test with some data - email = self.example_email("othello") + user = self.example_user("othello") self.login(self.example_email("othello")) result = self.client_post("/json/users/me/presence", {'status': 'active'}) result = self.client_post("/json/users/me/presence", {'status': 'active'}, HTTP_USER_AGENT="ZulipDesktop/1.0") - result = self.api_post(email, "/api/v1/users/me/presence", {'status': 'idle'}, + result = self.api_post(user, "/api/v1/users/me/presence", {'status': 'idle'}, HTTP_USER_AGENT="ZulipAndroid/1.0") self.assert_json_success(result) @@ -404,17 +404,18 @@ class SingleUserPresenceTests(ZulipTestCase): self.assertEqual(result.json()['msg'], '') class UserPresenceAggregationTests(ZulipTestCase): - def _send_presence_for_aggregated_tests(self, email: str, status: str, + def _send_presence_for_aggregated_tests(self, user: UserProfile, status: str, validate_time: datetime.datetime) -> Dict[str, Dict[str, Any]]: + email = user.email self.login(email) timezone_util = 'zerver.views.presence.timezone_now' with mock.patch(timezone_util, return_value=validate_time - datetime.timedelta(seconds=5)): self.client_post("/json/users/me/presence", {'status': status}) with mock.patch(timezone_util, return_value=validate_time - datetime.timedelta(seconds=2)): - self.api_post(email, "/api/v1/users/me/presence", {'status': status}, + self.api_post(user, "/api/v1/users/me/presence", {'status': status}, HTTP_USER_AGENT="ZulipAndroid/1.0") with mock.patch(timezone_util, return_value=validate_time - datetime.timedelta(seconds=7)): - latest_result = self.api_post(email, "/api/v1/users/me/presence", {'status': status}, + latest_result = self.api_post(user, "/api/v1/users/me/presence", {'status': status}, HTTP_USER_AGENT="ZulipIOS/1.0") latest_result_dict = latest_result.json() self.assertDictEqual( @@ -429,16 +430,16 @@ class UserPresenceAggregationTests(ZulipTestCase): return result.json() def test_aggregated_info(self) -> None: - email = self.example_email("othello") + user = self.example_user("othello") validate_time = timezone_now() - self._send_presence_for_aggregated_tests(str(self.example_email("othello")), 'active', validate_time) + self._send_presence_for_aggregated_tests(user, 'active', validate_time) with mock.patch('zerver.views.presence.timezone_now', return_value=validate_time - datetime.timedelta(seconds=1)): - result = self.api_post(email, "/api/v1/users/me/presence", {'status': 'active'}, + result = self.api_post(user, "/api/v1/users/me/presence", {'status': 'active'}, HTTP_USER_AGENT="ZulipTestDev/1.0") result_dict = result.json() self.assertDictEqual( - result_dict['presences'][email]['aggregated'], + result_dict['presences'][user.email]['aggregated'], { 'status': 'active', 'timestamp': datetime_to_timestamp(validate_time - datetime.timedelta(seconds=1)), @@ -447,8 +448,9 @@ class UserPresenceAggregationTests(ZulipTestCase): ) def test_aggregated_presense_active(self) -> None: + user = self.example_user('othello') validate_time = timezone_now() - result_dict = self._send_presence_for_aggregated_tests(str(self.example_email("othello")), 'active', + result_dict = self._send_presence_for_aggregated_tests(user, 'active', validate_time) self.assertDictEqual( result_dict['presence']['aggregated'], @@ -459,8 +461,9 @@ class UserPresenceAggregationTests(ZulipTestCase): ) def test_aggregated_presense_idle(self) -> None: + user = self.example_user('othello') validate_time = timezone_now() - result_dict = self._send_presence_for_aggregated_tests(str(self.example_email("othello")), 'idle', + result_dict = self._send_presence_for_aggregated_tests(user, 'idle', validate_time) self.assertDictEqual( result_dict['presence']['aggregated'], @@ -471,14 +474,14 @@ class UserPresenceAggregationTests(ZulipTestCase): ) def test_aggregated_presense_mixed(self) -> None: - email = self.example_email("othello") - self.login(email) + user = self.example_user("othello") + self.login(user.email) validate_time = timezone_now() with mock.patch('zerver.views.presence.timezone_now', return_value=validate_time - datetime.timedelta(seconds=3)): - self.api_post(email, "/api/v1/users/me/presence", {'status': 'active'}, + self.api_post(user, "/api/v1/users/me/presence", {'status': 'active'}, HTTP_USER_AGENT="ZulipTestDev/1.0") - result_dict = self._send_presence_for_aggregated_tests(str(email), 'idle', validate_time) + result_dict = self._send_presence_for_aggregated_tests(user, 'idle', validate_time) self.assertDictEqual( result_dict['presence']['aggregated'], { @@ -488,11 +491,11 @@ class UserPresenceAggregationTests(ZulipTestCase): ) def test_aggregated_presense_offline(self) -> None: - email = self.example_email("othello") - self.login(email) + user = self.example_user("othello") + self.login(user.email) validate_time = timezone_now() with self.settings(OFFLINE_THRESHOLD_SECS=1): - result_dict = self._send_presence_for_aggregated_tests(str(email), 'idle', validate_time) + result_dict = self._send_presence_for_aggregated_tests(user, 'idle', validate_time) self.assertDictEqual( result_dict['presence']['aggregated'], { @@ -507,18 +510,18 @@ class GetRealmStatusesTest(ZulipTestCase): othello = self.example_user("othello") hamlet = self.example_user("hamlet") - result = self.api_post(othello.email, "/api/v1/users/me/presence", + result = self.api_post(othello, "/api/v1/users/me/presence", dict(status='active'), HTTP_USER_AGENT="ZulipAndroid/1.0") - result = self.api_post(hamlet.email, "/api/v1/users/me/presence", + result = self.api_post(hamlet, "/api/v1/users/me/presence", dict(status='idle'), HTTP_USER_AGENT="ZulipDesktop/1.0") self.assert_json_success(result) json = result.json() self.assertEqual(set(json['presences'].keys()), {hamlet.email, othello.email}) - result = self.api_post(hamlet.email, "/api/v1/users/me/presence", + result = self.api_post(hamlet, "/api/v1/users/me/presence", dict(status='active', slim_presence='true'), HTTP_USER_AGENT="ZulipDesktop/1.0") self.assert_json_success(result) @@ -526,7 +529,7 @@ class GetRealmStatusesTest(ZulipTestCase): self.assertEqual(set(json['presences'].keys()), {str(hamlet.id), str(othello.id)}) # Check that a bot can fetch the presence data for the realm. - result = self.api_get(self.example_email("default_bot"), "/api/v1/realm/presence") + result = self.api_get(self.example_user("default_bot"), "/api/v1/realm/presence") self.assert_json_success(result) json = result.json() self.assertEqual(set(json['presences'].keys()), {hamlet.email, othello.email}) diff --git a/zerver/tests/test_push_notifications.py b/zerver/tests/test_push_notifications.py index f9de22e51c..64c1d5dba6 100644 --- a/zerver/tests/test_push_notifications.py +++ b/zerver/tests/test_push_notifications.py @@ -138,14 +138,17 @@ class PushBouncerNotificationTest(BouncerTestCase): # We need the root ('') subdomain to be in use for this next # test, since the push bouncer API is only available there: + hamlet = self.example_user('hamlet') realm = get_realm("zulip") realm.string_id = "" realm.save() - result = self.api_post(self.example_email("hamlet"), endpoint, {'token': token, - 'user_id': 15, - 'token_kind': token_kind}, - subdomain="") + result = self.api_post( + hamlet, + endpoint, + dict(user_id=15, token=token, token_kind=token_kind), + subdomain='', + ) self.assert_json_error(result, "Must validate with valid Zulip server API key") def test_register_remote_push_user_paramas(self) -> None: @@ -164,21 +167,27 @@ class PushBouncerNotificationTest(BouncerTestCase): result = self.uuid_post(self.server_uuid, endpoint, {'user_id': user_id, 'token': token, 'token_kind': 17}) self.assert_json_error(result, "Invalid token type") - result = self.api_post(self.example_email("hamlet"), endpoint, {'user_id': user_id, - 'token_kind': token_kind, - 'token': token}) + result = self.api_post( + self.example_user("hamlet"), + endpoint, + dict(user_id=user_id, token_kin=token_kind, token=token), + ) self.assert_json_error(result, "Account is not associated with this subdomain", status_code=401) + hamlet = self.example_user('hamlet') + # We need the root ('') subdomain to be in use for this next # test, since the push bouncer API is only available there: realm = get_realm("zulip") realm.string_id = "" realm.save() - result = self.api_post(self.example_email("hamlet"), endpoint, {'user_id': user_id, - 'token_kind': token_kind, - 'token': token}) + result = self.api_post( + hamlet, + endpoint, + dict(user_id=user_id, token_kind=token_kind, token=token), + ) self.assert_json_error(result, "Must validate with valid Zulip server API key") result = self.uuid_post( diff --git a/zerver/tests/test_reactions.py b/zerver/tests/test_reactions.py index 87d5f90675..743ed20d3b 100644 --- a/zerver/tests/test_reactions.py +++ b/zerver/tests/test_reactions.py @@ -16,7 +16,7 @@ class ReactionEmojiTest(ZulipTestCase): """ Sending reaction without emoji fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': '' } @@ -29,7 +29,7 @@ class ReactionEmojiTest(ZulipTestCase): """ Sending invalid emoji fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'foo' } @@ -45,7 +45,7 @@ class ReactionEmojiTest(ZulipTestCase): emoji = RealmEmoji.objects.get(name="green_tick") emoji.deactivated = True emoji.save(update_fields=['deactivated']) - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'green_tick', 'reaction_type': 'realm_emoji' @@ -59,7 +59,7 @@ class ReactionEmojiTest(ZulipTestCase): """ Reacting with valid emoji succeeds """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'smile' } @@ -73,7 +73,7 @@ class ReactionEmojiTest(ZulipTestCase): """ Reacting with zulip emoji succeeds """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'zulip', 'reaction_type': 'zulip_extra_emoji' @@ -93,7 +93,7 @@ class ReactionEmojiTest(ZulipTestCase): message_id = self.send_stream_message(self.example_user("cordelia"), stream_name) user_profile = self.example_user('hamlet') - sender = user_profile.email + sender = user_profile # Verify that hamlet did not receive the message. self.assertFalse(UserMessage.objects.filter(user_profile=user_profile, @@ -118,7 +118,7 @@ class ReactionEmojiTest(ZulipTestCase): """ Reacting with valid realm emoji succeeds """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'green_tick', @@ -189,7 +189,7 @@ class ReactionMessageIDTest(ZulipTestCase): """ Reacting without a message_id fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'smile' } @@ -202,7 +202,7 @@ class ReactionMessageIDTest(ZulipTestCase): """ Reacting to an invalid message id fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") reaction_info = { 'emoji_name': 'smile' } @@ -215,9 +215,9 @@ class ReactionMessageIDTest(ZulipTestCase): """ Reacting to a inaccessible (for instance, private) message fails """ - pm_sender = self.example_email("hamlet") + pm_sender = self.example_user("hamlet") pm_recipient = self.example_email("othello") - reaction_sender = self.example_email("iago") + reaction_sender = self.example_user("iago") result = self.api_post(pm_sender, "/api/v1/messages", {"type": "private", @@ -238,14 +238,14 @@ class ReactionTest(ZulipTestCase): """ Creating the same reaction twice fails """ - pm_sender = self.example_email("hamlet") - pm_recipient = self.example_email("othello") + pm_sender = self.example_user("hamlet") + pm_recipient = self.example_user("othello") reaction_sender = pm_recipient pm = self.api_post(pm_sender, "/api/v1/messages", {"type": "private", "content": "Test message", - "to": pm_recipient}) + "to": pm_recipient.email}) self.assert_json_success(pm) content = ujson.loads(pm.content) @@ -267,14 +267,14 @@ class ReactionTest(ZulipTestCase): """ Removing a reaction twice fails """ - pm_sender = self.example_email("hamlet") - pm_recipient = self.example_email("othello") + pm_sender = self.example_user("hamlet") + pm_recipient = self.example_user("othello") reaction_sender = pm_recipient pm = self.api_post(pm_sender, "/api/v1/messages", {"type": "private", "content": "Test message", - "to": pm_recipient}) + "to": pm_recipient.email}) self.assert_json_success(pm) content = ujson.loads(pm.content) @@ -301,7 +301,7 @@ class ReactionTest(ZulipTestCase): various emoji infra changes. """ realm = get_realm('zulip') - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") emoji_code, reaction_type = emoji_name_to_emoji_code(realm, 'smile') reaction_info = { 'emoji_name': 'smile', @@ -320,7 +320,7 @@ class ReactionTest(ZulipTestCase): """ Removes an old existing reaction but the realm emoji used there has been deactivated. """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") emoji = RealmEmoji.objects.get(name="green_tick") @@ -349,7 +349,7 @@ class ReactionEventTest(ZulipTestCase): pm_recipient = self.example_user('othello') reaction_sender = pm_recipient - result = self.api_post(pm_sender.email, + result = self.api_post(pm_sender, "/api/v1/messages", {"type": "private", "content": "Test message", "to": pm_recipient.email}) @@ -364,7 +364,7 @@ class ReactionEventTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] with tornado_redirected_to_list(events): - result = self.api_post(reaction_sender.email, '/api/v1/messages/%s/reactions' % (pm_id,), + result = self.api_post(reaction_sender, '/api/v1/messages/%s/reactions' % (pm_id,), reaction_info) self.assert_json_success(result) self.assertEqual(len(events), 1) @@ -388,7 +388,7 @@ class ReactionEventTest(ZulipTestCase): pm_recipient = self.example_user('othello') reaction_sender = pm_recipient - result = self.api_post(pm_sender.email, + result = self.api_post(pm_sender, "/api/v1/messages", {"type": "private", "content": "Test message", "to": pm_recipient.email}) @@ -402,13 +402,13 @@ class ReactionEventTest(ZulipTestCase): 'emoji_name': 'smile' } - add = self.api_post(reaction_sender.email, '/api/v1/messages/%s/reactions' % (pm_id,), + add = self.api_post(reaction_sender, '/api/v1/messages/%s/reactions' % (pm_id,), reaction_info) self.assert_json_success(add) events = [] # type: List[Mapping[str, Any]] with tornado_redirected_to_list(events): - result = self.api_delete(reaction_sender.email, '/api/v1/messages/%s/reactions' % (pm_id,), + result = self.api_delete(reaction_sender, '/api/v1/messages/%s/reactions' % (pm_id,), reaction_info) self.assert_json_success(result) self.assertEqual(len(events), 1) @@ -434,7 +434,7 @@ class EmojiReactionBase(ZulipTestCase): sender: str='hamlet') -> HttpResponse: if 'reaction_type' not in reaction_info: reaction_info['reaction_type'] = self.reaction_type - sender = self.example_email(sender) + sender = self.example_user(sender) result = self.api_post(sender, '/api/v1/messages/%s/reactions' % (message_id,), reaction_info) return result @@ -453,7 +453,7 @@ class EmojiReactionBase(ZulipTestCase): sender: str='hamlet') -> HttpResponse: if 'reaction_type' not in reaction_info: reaction_info['reaction_type'] = self.reaction_type - sender = self.example_email(sender) + sender = self.example_user(sender) result = self.api_delete(sender, '/api/v1/messages/%s/reactions' % (message_id,), reaction_info) return result @@ -799,7 +799,7 @@ class RealmEmojiReactionTests(EmojiReactionBase): 'emoji_code': 'zulip', 'reaction_type': 'nonexistent_emoji_type', } - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") message_id = 1 result = self.api_post(sender, '/api/v1/messages/%s/reactions' % (message_id,), reaction_info) diff --git a/zerver/tests/test_realm.py b/zerver/tests/test_realm.py index 580ef2cc2f..a993e76a30 100644 --- a/zerver/tests/test_realm.py +++ b/zerver/tests/test_realm.py @@ -419,14 +419,14 @@ class RealmTest(ZulipTestCase): self.assertEqual(edited_user_profile.email, "user%s@zulip.testserver" % (edited_user_profile.id,)) # Check normal user cannot access email - result = self.api_get(cordelia.delivery_email, "/api/v1/users/%s" % (hamlet.id,)) + result = self.api_get(cordelia, "/api/v1/users/%s" % (hamlet.id,)) self.assert_json_success(result) self.assertEqual(result.json()['user']['email'], 'user%s@zulip.testserver' % (hamlet.id,)) self.assertEqual(result.json()['user'].get('delivery_email'), None) # Check administrator gets delivery_email with EMAIL_ADDRESS_VISIBILITY_ADMINS - result = self.api_get(user_profile.delivery_email, "/api/v1/users/%s" % (hamlet.id,)) + result = self.api_get(user_profile, "/api/v1/users/%s" % (hamlet.id,)) self.assert_json_success(result) self.assertEqual(result.json()['user']['email'], 'user%s@zulip.testserver' % (hamlet.id,)) @@ -444,7 +444,7 @@ class RealmTest(ZulipTestCase): # Check even administrator doesn't get delivery_email with # EMAIL_ADDRESS_VISIBILITY_NOBODY - result = self.api_get(user_profile.delivery_email, "/api/v1/users/%s" % (hamlet.id,)) + result = self.api_get(user_profile, "/api/v1/users/%s" % (hamlet.id,)) self.assert_json_success(result) self.assertEqual(result.json()['user']['email'], 'user%s@zulip.testserver' % (hamlet.id,)) diff --git a/zerver/tests/test_subs.py b/zerver/tests/test_subs.py index 144b064f4e..60bcb9bd64 100644 --- a/zerver/tests/test_subs.py +++ b/zerver/tests/test_subs.py @@ -180,7 +180,7 @@ class TestCreateStreams(ZulipTestCase): post_data = {'subscriptions': ujson.dumps([{"name": 'new_stream', "description": "multi\nline\ndescription"}]), 'invite_only': ujson.dumps(False)} - result = self.api_post(user.email, "/api/v1/users/me/subscriptions", post_data, + result = self.api_post(user, "/api/v1/users/me/subscriptions", post_data, subdomain="zulip") self.assert_json_success(result) stream = get_stream("new_stream", realm) @@ -1536,21 +1536,19 @@ class SubscriptionPropertiesTest(ZulipTestCase): any invalid hex color codes are bounced. """ test_user = self.example_user('hamlet') - test_email = test_user.email - test_realm = test_user.realm - self.login(test_email) + self.login(test_user.email) old_subs, _ = gather_subscriptions(test_user) sub = old_subs[0] stream_id = sub['stream_id'] new_color = "#ffffff" # TODO: ensure that this is different from old_color - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "color", "stream_id": stream_id, "value": "#ffffff"}])}) self.assert_json_success(result) - new_subs = gather_subscriptions(get_user(test_email, test_realm))[0] + new_subs = gather_subscriptions(test_user)[0] found_sub = None for sub in new_subs: if sub['stream_id'] == stream_id: @@ -1569,7 +1567,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): self.assertEqual(old_subs, new_subs) invalid_color = "3ffrff" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "color", "stream_id": stream_id, "value": invalid_color}])}) @@ -1580,9 +1578,8 @@ class SubscriptionPropertiesTest(ZulipTestCase): Updating the color property requires a `stream_id` key. """ test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + self.login(test_user.email) + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "color", "value": "#ffffff"}])}) self.assert_json_error( @@ -1592,14 +1589,12 @@ class SubscriptionPropertiesTest(ZulipTestCase): """ Updating the color property requires a subscribed stream. """ - test_email = self.example_email("hamlet") - self.login(test_email) - test_realm = get_realm("zulip") + test_user = self.example_user("hamlet") + self.login(test_user.email) - subscribed, unsubscribed, never_subscribed = gather_subscriptions_helper( - get_user(test_email, test_realm)) + subscribed, unsubscribed, never_subscribed = gather_subscriptions_helper(test_user) not_subbed = unsubscribed + never_subscribed - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "color", "stream_id": not_subbed[0]["stream_id"], "value": "#ffffff"}])}) @@ -1611,10 +1606,9 @@ class SubscriptionPropertiesTest(ZulipTestCase): Updating the color property requires a color. """ test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) + self.login(test_user.email) subs = gather_subscriptions(test_user)[0] - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "color", "stream_id": subs[0]["stream_id"]}])}) self.assert_json_error( @@ -1626,12 +1620,11 @@ class SubscriptionPropertiesTest(ZulipTestCase): sets the property. """ test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) + self.login(test_user.email) subs = gather_subscriptions(test_user)[0] sub = subs[0] - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "wildcard_mentions_notify", "stream_id": sub["stream_id"], "value": True}])}) @@ -1647,29 +1640,27 @@ class SubscriptionPropertiesTest(ZulipTestCase): A POST request to /api/v1/users/me/subscriptions/properties with stream_id and pin_to_top data pins the stream. """ - user_profile = self.example_user('hamlet') - test_email = user_profile.email - self.login(test_email) + user = self.example_user('hamlet') + self.login(user.email) - old_subs, _ = gather_subscriptions(user_profile) + old_subs, _ = gather_subscriptions(user) sub = old_subs[0] stream_id = sub['stream_id'] new_pin_to_top = not sub['pin_to_top'] - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "pin_to_top", "stream_id": stream_id, "value": new_pin_to_top}])}) self.assert_json_success(result) - updated_sub = get_subscription(sub['name'], user_profile) + updated_sub = get_subscription(sub['name'], user) self.assertIsNotNone(updated_sub) self.assertEqual(updated_sub.pin_to_top, new_pin_to_top) def test_change_is_muted(self) -> None: test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) + self.login(test_user.email) subs = gather_subscriptions(test_user)[0] sub = Subscription.objects.get(recipient__type=Recipient.STREAM, @@ -1680,7 +1671,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] property_name = "is_muted" with tornado_redirected_to_list(events): - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": True, "stream_id": subs[0]["stream_id"]}])}) @@ -1696,7 +1687,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): events = [] legacy_property_name = 'in_home_view' with tornado_redirected_to_list(events): - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": legacy_property_name, "value": True, "stream_id": subs[0]["stream_id"]}])}) @@ -1712,7 +1703,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): events = [] with tornado_redirected_to_list(events): - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": legacy_property_name, "value": False, "stream_id": subs[0]["stream_id"]}])}) @@ -1731,12 +1722,11 @@ class SubscriptionPropertiesTest(ZulipTestCase): Trying to set a property incorrectly returns a JSON error. """ test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) + self.login(test_user.email) subs = gather_subscriptions(test_user)[0] property_name = "is_muted" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1744,7 +1734,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "in_home_view" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1752,7 +1742,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "desktop_notifications" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1760,7 +1750,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "audible_notifications" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1768,7 +1758,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "push_notifications" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1776,7 +1766,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "email_notifications" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1784,7 +1774,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a boolean' % (property_name,)) property_name = "wildcard_mentions_notify" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1793,7 +1783,7 @@ class SubscriptionPropertiesTest(ZulipTestCase): "%s is not a boolean" % (property_name,)) property_name = "color" - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": False, "stream_id": subs[0]["stream_id"]}])}) @@ -1801,11 +1791,11 @@ class SubscriptionPropertiesTest(ZulipTestCase): '%s is not a string' % (property_name,)) def test_json_subscription_property_invalid_stream(self) -> None: - test_email = self.example_email("hamlet") - self.login(test_email) + test_user = self.example_user("hamlet") + self.login(test_user.email) stream_id = 1000 - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "is_muted", "stream_id": stream_id, "value": False}])}) @@ -1816,10 +1806,9 @@ class SubscriptionPropertiesTest(ZulipTestCase): Trying to set an invalid property returns a JSON error. """ test_user = self.example_user('hamlet') - test_email = test_user.email - self.login(test_email) + self.login(test_user.email) subs = gather_subscriptions(test_user)[0] - result = self.api_post(test_email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(test_user, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": "bad", "value": "bad", "stream_id": subs[0]["stream_id"]}])}) @@ -1828,56 +1817,54 @@ class SubscriptionPropertiesTest(ZulipTestCase): class SubscriptionRestApiTest(ZulipTestCase): def test_basic_add_delete(self) -> None: - hamlet = self.example_user('hamlet') - email = hamlet.email - self.login(hamlet.email) + user = self.example_user('hamlet') + self.login(user.email) # add request = { 'add': ujson.dumps([{'name': 'my_test_stream_1'}]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_success(result) - streams = self.get_streams(hamlet) + streams = self.get_streams(user) self.assertTrue('my_test_stream_1' in streams) # now delete the same stream request = { 'delete': ujson.dumps(['my_test_stream_1']) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_success(result) - streams = self.get_streams(hamlet) + streams = self.get_streams(user) self.assertTrue('my_test_stream_1' not in streams) def test_add_with_color(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) # add with color proposition request = { 'add': ujson.dumps([{'name': 'my_test_stream_2', 'color': '#afafaf'}]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_success(result) # incorrect color format request = { 'subscriptions': ujson.dumps([{'name': 'my_test_stream_3', 'color': '#0g0g0g'}]) } - result = self.api_post(email, "/api/v1/users/me/subscriptions", request) + result = self.api_post(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, 'subscriptions[0]["color"] is not a valid hex color code') def test_api_valid_property(self) -> None: """ Trying to set valid json returns success message. """ - test_user = self.example_user('hamlet') - test_email = test_user.email + user = self.example_user('hamlet') - self.login(test_email) - subs = gather_subscriptions(test_user)[0] - result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), + self.login(user.email) + subs = gather_subscriptions(user)[0] + result = self.api_patch(user, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), {'property': 'color', 'value': '#c2c2c2'}) self.assert_json_success(result) @@ -1886,13 +1873,12 @@ class SubscriptionRestApiTest(ZulipTestCase): Trying to set an invalid property returns a JSON error. """ - test_user = self.example_user('hamlet') - test_email = test_user.email + user = self.example_user('hamlet') - self.login(test_email) - subs = gather_subscriptions(test_user)[0] + self.login(user.email) + subs = gather_subscriptions(user)[0] - result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), + result = self.api_patch(user, "/api/v1/users/me/subscriptions/%d" % (subs[0]["stream_id"],), {'property': 'invalid', 'value': 'somevalue'}) self.assert_json_error(result, "Unknown subscription property: invalid") @@ -1901,22 +1887,22 @@ class SubscriptionRestApiTest(ZulipTestCase): """ Trying to set an invalid stream id returns a JSON error. """ - test_email = self.example_email("hamlet") - self.login(test_email) - result = self.api_patch(test_email, "/api/v1/users/me/subscriptions/121", + user = self.example_user("hamlet") + self.login(user.email) + result = self.api_patch(user, "/api/v1/users/me/subscriptions/121", {'property': 'is_muted', 'value': 'somevalue'}) self.assert_json_error(result, "Invalid stream id") def test_bad_add_parameters(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) def check_for_error(val: Any, expected_message: str) -> None: request = { 'add': ujson.dumps(val) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, expected_message) check_for_error(['foo'], 'add[0] is not a dict') @@ -1924,31 +1910,31 @@ class SubscriptionRestApiTest(ZulipTestCase): check_for_error([{'name': {}}], 'add[0]["name"] is not a string') def test_bad_principals(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) request = { 'add': ujson.dumps([{'name': 'my_new_stream'}]), 'principals': ujson.dumps([{}]), } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, 'principals[0] is not a string') def test_bad_delete_parameters(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) request = { 'delete': ujson.dumps([{'name': 'my_test_stream_1'}]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, "delete[0] is not a string") def test_add_or_delete_not_specified(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) - result = self.api_patch(email, "/api/v1/users/me/subscriptions", {}) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", {}) self.assert_json_error(result, 'Nothing to do. Specify at least one of "add" or "delete".') @@ -1956,38 +1942,38 @@ class SubscriptionRestApiTest(ZulipTestCase): """ Only way to force an error is with a empty string. """ - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) invalid_stream_name = "" request = { 'delete': ujson.dumps([invalid_stream_name]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, "Invalid stream name '%s'" % (invalid_stream_name,)) def test_stream_name_too_long(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) long_stream_name = "a" * 61 request = { 'delete': ujson.dumps([long_stream_name]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, "Stream name too long (limit: 60 characters).") def test_stream_name_contains_null(self) -> None: - email = self.example_email('hamlet') - self.login(email) + user = self.example_user('hamlet') + self.login(user.email) stream_name = "abc\000" request = { 'delete': ujson.dumps([stream_name]) } - result = self.api_patch(email, "/api/v1/users/me/subscriptions", request) + result = self.api_patch(user, "/api/v1/users/me/subscriptions", request) self.assert_json_error(result, "Stream name '%s' contains NULL (0x00) characters." % (stream_name,)) @@ -2051,8 +2037,7 @@ class SubscriptionAPITest(ZulipTestCase): """ Calling /api/v1/users/me/subscriptions should successfully return your subscriptions. """ - email = self.test_email - result = self.api_get(email, "/api/v1/users/me/subscriptions") + result = self.api_get(self.test_user, "/api/v1/users/me/subscriptions") self.assert_json_success(result) json = result.json() self.assertIn("subscriptions", json) @@ -2442,7 +2427,7 @@ class SubscriptionAPITest(ZulipTestCase): streams_to_sub, dict(principals=ujson.dumps([user1.email, user2.email])), ) - self.assert_length(queries, 42) + self.assert_length(queries, 40) self.assert_length(events, 7) for ev in [x for x in events if x['event']['type'] not in ('message', 'stream')]: @@ -2815,7 +2800,7 @@ class SubscriptionAPITest(ZulipTestCase): # Make sure Zephyr mirroring realms such as MIT do not get # any tornado subscription events self.assert_length(events, 0) - self.assert_length(queries, 7) + self.assert_length(queries, 5) events = [] with tornado_redirected_to_list(events): @@ -2841,7 +2826,7 @@ class SubscriptionAPITest(ZulipTestCase): dict(principals=ujson.dumps([self.test_email])), ) # Make sure we don't make O(streams) queries - self.assert_length(queries, 18) + self.assert_length(queries, 16) def test_subscriptions_add_for_principal(self) -> None: """ @@ -3231,7 +3216,7 @@ class SubscriptionAPITest(ZulipTestCase): [new_streams[0]], dict(principals=ujson.dumps([user1.email, user2.email])), ) - self.assert_length(queries, 42) + self.assert_length(queries, 40) # Test creating private stream. with queries_captured() as queries: @@ -3269,9 +3254,9 @@ class GetStreamsTest(ZulipTestCase): # Check it correctly lists the bot owner's subs with # include_owner_subscribed=true result = self.api_get( - test_bot.email, + test_bot, "/api/v1/streams?include_owner_subscribed=true&include_public=false&include_subscribed=false") - owner_subs = self.api_get(hamlet.email, "/api/v1/users/me/subscriptions") + owner_subs = self.api_get(hamlet, "/api/v1/users/me/subscriptions") self.assert_json_success(result) json = result.json() @@ -3288,7 +3273,7 @@ class GetStreamsTest(ZulipTestCase): # bot's subs self.subscribe(test_bot, 'Scotland') result = self.api_get( - test_bot.email, + test_bot, "/api/v1/streams?include_owner_subscribed=true&include_public=false&include_subscribed=true" ) @@ -3308,7 +3293,7 @@ class GetStreamsTest(ZulipTestCase): self.make_stream('private_stream', realm=realm, invite_only=True) self.subscribe(test_bot, 'private_stream') result = self.api_get( - test_bot.email, + test_bot, "/api/v1/streams?include_owner_subscribed=true&include_public=true&include_subscribed=false" ) @@ -3327,7 +3312,7 @@ class GetStreamsTest(ZulipTestCase): # Check it correctly lists the bot owner's subs + all public streams + # the bot's subs result = self.api_get( - test_bot.email, + test_bot, "/api/v1/streams?include_owner_subscribed=true&include_public=true&include_subscribed=true" ) @@ -3348,14 +3333,14 @@ class GetStreamsTest(ZulipTestCase): # Check non-superuser can't use include_all_active normal_user = self.example_user('cordelia') - result = self.api_get(normal_user.email, url) + result = self.api_get(normal_user, url) self.assertEqual(result.status_code, 400) # Even realm admin users can't see all # active streams (without additional privileges). admin_user = self.example_user('iago') self.assertTrue(admin_user.is_realm_admin) - result = self.api_get(admin_user.email, url) + result = self.api_get(admin_user, url) self.assertEqual(result.status_code, 400) ''' @@ -3371,7 +3356,7 @@ class GetStreamsTest(ZulipTestCase): super_user.is_api_super_user = True super_user.save() - result = self.api_get(super_user.email, url) + result = self.api_get(super_user, url) self.assert_json_success(result) json = result.json() @@ -3390,13 +3375,13 @@ class GetStreamsTest(ZulipTestCase): Ensure that the query we use to get public streams successfully returns a list of streams """ - email = self.example_email('hamlet') + user = self.example_user('hamlet') realm = get_realm('zulip') - self.login(email) + self.login(user.email) # Check it correctly lists the user's subs with include_public=false - result = self.api_get(email, "/api/v1/streams?include_public=false") - result2 = self.api_get(email, "/api/v1/users/me/subscriptions") + result = self.api_get(user, "/api/v1/streams?include_public=false") + result2 = self.api_get(user, "/api/v1/users/me/subscriptions") self.assert_json_success(result) json = result.json() @@ -3412,7 +3397,7 @@ class GetStreamsTest(ZulipTestCase): sorted([s["name"] for s in json2["subscriptions"]])) # Check it correctly lists all public streams with include_subscribed=false - result = self.api_get(email, "/api/v1/streams?include_public=true&include_subscribed=false") + result = self.api_get(user, "/api/v1/streams?include_public=true&include_subscribed=false") self.assert_json_success(result) json = result.json() @@ -3468,7 +3453,7 @@ class InviteOnlyStreamTest(ZulipTestCase): self.assert_json_success(result1) result2 = self.common_subscribe_to_streams(user, ["Normandy"], invite_only=False) self.assert_json_success(result2) - result = self.api_get(user.email, "/api/v1/users/me/subscriptions") + result = self.api_get(user, "/api/v1/users/me/subscriptions") self.assert_json_success(result) self.assertIn("subscriptions", result.json()) for sub in result.json()["subscriptions"]: @@ -3512,8 +3497,7 @@ class InviteOnlyStreamTest(ZulipTestCase): # Inviting another user to an invite-only stream is allowed user_profile = self.example_user('hamlet') - email = user_profile.email - self.login(email) + self.login(user_profile.email) result = self.common_subscribe_to_streams( user_profile, [stream_name], extra_post_data={'principals': ujson.dumps([self.example_email("othello")])}) @@ -3524,7 +3508,7 @@ class InviteOnlyStreamTest(ZulipTestCase): # Make sure both users are subscribed to this stream stream_id = get_stream(stream_name, user_profile.realm).id - result = self.api_get(email, "/api/v1/streams/%d/members" % (stream_id,)) + result = self.api_get(user_profile, "/api/v1/streams/%d/members" % (stream_id,)) self.assert_json_success(result) json = result.json() @@ -3565,10 +3549,10 @@ class GetSubscribersTest(ZulipTestCase): stream_name, realm)] self.assertEqual(sorted(result["subscribers"]), sorted(true_subscribers)) - def make_subscriber_request(self, stream_id: int, email: Optional[str]=None) -> HttpResponse: - if email is None: - email = self.email - return self.api_get(email, "/api/v1/streams/%d/members" % (stream_id,)) + def make_subscriber_request(self, stream_id: int, user: Optional[UserProfile]=None) -> HttpResponse: + if user is None: + user = self.user_profile + return self.api_get(user, "/api/v1/streams/%d/members" % (stream_id,)) def make_successful_subscriber_request(self, stream_name: str) -> None: stream_id = get_stream(stream_name, self.user_profile.realm).id @@ -3910,11 +3894,10 @@ class GetSubscribersTest(ZulipTestCase): self.common_subscribe_to_streams(self.user_profile, [stream_name], invite_only=True) user_profile = self.example_user('othello') - other_email = user_profile.email # Try to fetch the subscriber list as a non-member & non-realm-admin-user. stream_id = get_stream(stream_name, user_profile.realm).id - result = self.make_subscriber_request(stream_id, email=other_email) + result = self.make_subscriber_request(stream_id, user=user_profile) self.assert_json_error(result, "Invalid stream id") # Try to fetch the subscriber list as a non-member & realm-admin-user. diff --git a/zerver/tests/test_thumbnail.py b/zerver/tests/test_thumbnail.py index 1cfe2d57c1..53234fd278 100644 --- a/zerver/tests/test_thumbnail.py +++ b/zerver/tests/test_thumbnail.py @@ -33,7 +33,8 @@ class ThumbnailTest(ZulipTestCase): settings.S3_AUTH_UPLOADS_BUCKET, settings.S3_AVATAR_BUCKET) - self.login(self.example_email("hamlet")) + hamlet = self.example_user('hamlet') + self.login(hamlet.email) fp = StringIO("zulip!") fp.name = "zulip.jpeg" @@ -79,7 +80,7 @@ class ThumbnailTest(ZulipTestCase): # Tests the /api/v1/thumbnail api endpoint with standard API auth self.logout() result = self.api_get( - self.example_email("hamlet"), + hamlet, '/thumbnail?url=%s&size=full' % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) @@ -112,7 +113,7 @@ class ThumbnailTest(ZulipTestCase): # Test api endpoint with standard API authentication. self.logout() user_profile = self.example_user("hamlet") - result = self.api_get(user_profile.email, + result = self.api_get(user_profile, "/thumbnail?url=%s&size=thumbnail" % (quoted_url,)) self.assertEqual(result.status_code, 302, result) expected_part_url = '/0x300/smart/filters:no_upscale():sharpen(0.5,0.2,true)/' + encoded_url + '/source_type/external' @@ -227,7 +228,7 @@ class ThumbnailTest(ZulipTestCase): self.logout() user_profile = self.example_user("hamlet") result = self.api_get( - self.example_email("hamlet"), + user_profile, '/thumbnail?url=%s&size=full' % (quoted_uri,)) self.assertEqual(result.status_code, 302, result) diff --git a/zerver/tests/test_typing.py b/zerver/tests/test_typing.py index a2e81ad84c..fa8a4a15d4 100644 --- a/zerver/tests/test_typing.py +++ b/zerver/tests/test_typing.py @@ -24,7 +24,7 @@ class TypingValidateOperatorTest(ZulipTestCase): params = dict( to=ujson.dumps([sender.id]), ) - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_error(result, 'Missing \'op\' argument') def test_invalid_parameter(self) -> None: @@ -36,7 +36,7 @@ class TypingValidateOperatorTest(ZulipTestCase): to=ujson.dumps([sender.id]), op='foo' ) - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_error(result, 'Invalid \'op\' value (should be start or stop)') class TypingValidateUsersTest(ZulipTestCase): @@ -44,7 +44,7 @@ class TypingValidateUsersTest(ZulipTestCase): """ Sending typing notification without recipient fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") result = self.api_post(sender, '/api/v1/typing', {'op': 'start', 'to': '[]'}) self.assert_json_error(result, 'Missing parameter: \'to\' (recipient)') @@ -52,7 +52,7 @@ class TypingValidateUsersTest(ZulipTestCase): """ Sending typing notification without recipient fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") result = self.api_post(sender, '/api/v1/typing', {'op': 'start'}) self.assert_json_error(result, "Missing parameter: 'to' (recipient)") @@ -60,7 +60,7 @@ class TypingValidateUsersTest(ZulipTestCase): """ Sending typing notification to invalid recipient fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") invalid = 'bad email' result = self.api_post(sender, '/api/v1/typing', {'op': 'start', 'to': invalid}) self.assert_json_error(result, "Invalid email 'bad email'") @@ -69,7 +69,7 @@ class TypingValidateUsersTest(ZulipTestCase): """ Sending typing notification to invalid recipient fails """ - sender = self.example_email("hamlet") + sender = self.example_user("hamlet") invalid = '[9999999]' result = self.api_post(sender, '/api/v1/typing', {'op': 'start', 'to': invalid}) self.assert_json_error(result, 'Invalid user ID 9999999') @@ -90,11 +90,11 @@ class TypingHappyPathTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] with queries_captured() as queries: with tornado_redirected_to_list(events): - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_success(result) self.assertEqual(len(events), 1) - self.assertEqual(len(queries), 6) + self.assertEqual(len(queries), 4) event = events[0]['event'] event_recipient_emails = set(user['email'] for user in event['recipients']) @@ -127,10 +127,10 @@ class TypingHappyPathTest(ZulipTestCase): with queries_captured() as queries: with tornado_redirected_to_list(events): - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_success(result) self.assertEqual(len(events), 1) - self.assertEqual(len(queries), 7) + self.assertEqual(len(queries), 5) # We should not be adding new Huddles just because # a user started typing in the compose box. Let's @@ -161,7 +161,7 @@ class TypingHappyPathTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] with tornado_redirected_to_list(events): result = self.api_post( - email, + user, '/api/v1/typing', { 'to': ujson.dumps([user.id]), @@ -201,7 +201,7 @@ class TypingHappyPathTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] with tornado_redirected_to_list(events): - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_success(result) self.assertEqual(len(events), 1) @@ -234,7 +234,7 @@ class TypingHappyPathTest(ZulipTestCase): to=ujson.dumps([user.id]), op='stop' ) - result = self.api_post(email, '/api/v1/typing', params) + result = self.api_post(user, '/api/v1/typing', params) self.assert_json_success(result) self.assertEqual(len(events), 1) @@ -268,7 +268,7 @@ class TypingHappyPathTest(ZulipTestCase): to=ujson.dumps([recipient.id]), op='stop' ) - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_success(result) self.assertEqual(len(events), 1) @@ -305,7 +305,7 @@ class TypingLegacyMobileSupportTest(ZulipTestCase): events = [] # type: List[Mapping[str, Any]] with tornado_redirected_to_list(events): - result = self.api_post(sender.email, '/api/v1/typing', params) + result = self.api_post(sender, '/api/v1/typing', params) self.assert_json_success(result) event = events[0]['event'] diff --git a/zerver/tests/test_unread.py b/zerver/tests/test_unread.py index 18fa35fc45..adaa4e6a2a 100644 --- a/zerver/tests/test_unread.py +++ b/zerver/tests/test_unread.py @@ -52,7 +52,7 @@ class PointerTest(ZulipTestCase): email = user.email self.assertEqual(user.pointer, -1) msg_id = self.send_stream_message(self.example_user("othello"), "Verona") - result = self.api_post(email, "/api/v1/users/me/pointer", {"pointer": msg_id}) + result = self.api_post(user, "/api/v1/users/me/pointer", {"pointer": msg_id}) self.assert_json_success(result) self.assertEqual(get_user(email, user.realm).pointer, msg_id) @@ -496,11 +496,11 @@ class PushNotificationMarkReadFlowsTest(ZulipTestCase): second_stream = self.subscribe(user_profile, "second_stream") property_name = "push_notifications" - result = self.api_post(user_profile.email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(user_profile, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": True, "stream_id": stream.id}])}) - result = self.api_post(user_profile.email, "/api/v1/users/me/subscriptions/properties", + result = self.api_post(user_profile, "/api/v1/users/me/subscriptions/properties", {"subscription_data": ujson.dumps([{"property": property_name, "value": True, "stream_id": second_stream.id}])}) diff --git a/zerver/tests/test_upload.py b/zerver/tests/test_upload.py index fabda45623..d35a163952 100644 --- a/zerver/tests/test_upload.py +++ b/zerver/tests/test_upload.py @@ -73,7 +73,7 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): fp.name = "zulip.txt" # Upload file via API - result = self.api_post(self.example_email("hamlet"), '/api/v1/user_uploads', {'file': fp}) + result = self.api_post(self.example_user("hamlet"), '/api/v1/user_uploads', {'file': fp}) self.assertIn("uri", result.json()) uri = result.json()['uri'] base = '/user_uploads/' @@ -81,7 +81,7 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): # Download file via API self.logout() - response = self.api_get(self.example_email("hamlet"), uri) + response = self.api_get(self.example_user("hamlet"), uri) self.assertEqual(response.status_code, 200) data = b"".join(response.streaming_content) self.assertEqual(b"zulip!", data) @@ -100,7 +100,7 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): fp.name = "zulip.txt" # Upload file via API - result = self.api_post(self.example_email("hamlet"), '/api/v1/user_uploads', {'file': fp}) + result = self.api_post(self.example_user("hamlet"), '/api/v1/user_uploads', {'file': fp}) self.assertIn("uri", result.json()) uri = result.json()['uri'] base = '/user_uploads/' @@ -127,7 +127,7 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): """ fp = StringIO("zulip!") fp.name = "pasted_file" - result = self.api_post(self.example_email("hamlet"), + result = self.api_post(self.example_user("hamlet"), "/api/v1/user_uploads?mimetype=image/png", {"file": fp}) self.assertEqual(result.status_code, 200) @@ -497,7 +497,7 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): def test_file_download_authorization_invite_only(self) -> None: user = self.example_user("hamlet") subscribed_emails = [user.email, self.example_email("cordelia")] - unsubscribed_emails = [self.example_email("othello"), self.example_email("prospero")] + unsubscribed_users = [self.example_user("othello"), self.example_user("prospero")] stream_name = "test-subscribe" self.make_stream(stream_name, realm=user.realm, invite_only=True, history_public_to_subscribers=False) @@ -534,17 +534,17 @@ class FileUploadTest(UploadSerializeMixin, ZulipTestCase): self.logout() self.assertEqual(len(queries), 6) - def assert_cannot_access_file(user_email: str) -> None: - response = self.api_get(user_email, uri) + def assert_cannot_access_file(user: UserProfile) -> None: + response = self.api_get(user, uri) self.assertEqual(response.status_code, 403) self.assert_in_response("You are not authorized to view this file.", response) late_subscribed_user = self.example_user("aaron") self.subscribe(late_subscribed_user, stream_name) - assert_cannot_access_file(late_subscribed_user.email) + assert_cannot_access_file(late_subscribed_user) # Unsubscribed user should not be able to view file - for unsubscribed_user in unsubscribed_emails: + for unsubscribed_user in unsubscribed_users: assert_cannot_access_file(unsubscribed_user) def test_file_download_authorization_invite_only_with_shared_history(self) -> None: @@ -858,8 +858,8 @@ class AvatarTest(UploadSerializeMixin, ZulipTestCase): self.assertTrue(redirect_url.endswith(str(avatar_url(cordelia)) + '&foo=bar')) def test_get_user_avatar(self) -> None: - hamlet = self.example_email("hamlet") - self.login(hamlet) + hamlet = self.example_user("hamlet") + self.login(hamlet.email) cordelia = self.example_user('cordelia') cross_realm_bot = get_system_bot(settings.WELCOME_BOT) @@ -902,8 +902,8 @@ class AvatarTest(UploadSerializeMixin, ZulipTestCase): status_code=401) def test_get_user_avatar_medium(self) -> None: - hamlet = self.example_email("hamlet") - self.login(hamlet) + hamlet = self.example_user("hamlet") + self.login(hamlet.email) cordelia = self.example_user('cordelia') cordelia.avatar_source = UserProfile.AVATAR_FROM_USER diff --git a/zerver/tests/test_user_groups.py b/zerver/tests/test_user_groups.py index 55a718d07e..fdd7e3d42a 100644 --- a/zerver/tests/test_user_groups.py +++ b/zerver/tests/test_user_groups.py @@ -429,7 +429,7 @@ class UserGroupAPITestCase(ZulipTestCase): ) with mock.patch('logging.info'): - result = self.api_post(sender.email, "/json/messages", payload) + result = self.api_post(sender, "/json/messages", payload) self.assert_json_success(result) diff --git a/zerver/tests/test_users.py b/zerver/tests/test_users.py index 3ac152a9a1..4093731e3e 100644 --- a/zerver/tests/test_users.py +++ b/zerver/tests/test_users.py @@ -1286,7 +1286,7 @@ class GetProfileTest(ZulipTestCase): user_profile = self.example_user(user_id) self.send_stream_message(user_profile, "Verona", "hello") - result = self.api_get(user_profile.email, "/api/v1/users/me") + result = self.api_get(user_profile, "/api/v1/users/me") max_id = most_recent_message(user_profile).id @@ -1384,7 +1384,7 @@ class GetProfileTest(ZulipTestCase): def test_get_all_profiles_avatar_urls(self) -> None: user_profile = self.example_user('hamlet') - result = self.api_get(self.example_email("hamlet"), "/api/v1/users") + result = self.api_get(self.example_user("hamlet"), "/api/v1/users") self.assert_json_success(result) for user in result.json()['members']: diff --git a/zerver/tests/test_widgets.py b/zerver/tests/test_widgets.py index b819196d0a..4cb54a541e 100644 --- a/zerver/tests/test_widgets.py +++ b/zerver/tests/test_widgets.py @@ -62,7 +62,7 @@ class WidgetContentTestCase(ZulipTestCase): self.assertEqual(check_widget_content(obj), None) def test_message_error_handling(self) -> None: - sender_email = self.example_email('cordelia') + sender = self.example_user('cordelia') stream_name = 'Verona' payload = dict( @@ -74,12 +74,12 @@ class WidgetContentTestCase(ZulipTestCase): ) payload['widget_content'] = '{{{{{{' # unparsable - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_error_contains(result, 'Widgets: API programmer sent invalid JSON') bogus_data = dict(color='red', foo='bar', x=2) payload['widget_content'] = ujson.dumps(bogus_data) - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_error_contains(result, 'Widgets: widget_type is not in widget_content') def test_get_widget_data_for_non_widget_messages(self) -> None: @@ -106,7 +106,7 @@ class WidgetContentTestCase(ZulipTestCase): # Users can send widget_content directly on messages # using the `widget_content` field. - sender_email = self.example_email('cordelia') + sender = self.example_user('cordelia') stream_name = 'Verona' content = 'does-not-matter' zform_data = dict( @@ -130,7 +130,7 @@ class WidgetContentTestCase(ZulipTestCase): content=content, widget_content=widget_content, ) - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_success(result) message = self.get_last_message() @@ -150,7 +150,7 @@ class WidgetContentTestCase(ZulipTestCase): # and it also helps us get test coverage that could apply # to future widgets. - sender_email = self.example_email('cordelia') + sender = self.example_user('cordelia') stream_name = 'Verona' content = '/tictactoe' @@ -161,7 +161,7 @@ class WidgetContentTestCase(ZulipTestCase): topic='whatever', content=content, ) - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_success(result) message = self.get_last_message() @@ -177,7 +177,7 @@ class WidgetContentTestCase(ZulipTestCase): self.assertEqual(ujson.loads(submessage.content), expected_submessage_content) def test_poll_command_extra_data(self) -> None: - sender_email = self.example_email('cordelia') + sender = self.example_user('cordelia') stream_name = 'Verona' # We test for both trailing and leading spaces, along with blank lines # for the poll options. @@ -190,7 +190,7 @@ class WidgetContentTestCase(ZulipTestCase): topic='whatever', content=content, ) - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_success(result) message = self.get_last_message() @@ -212,7 +212,7 @@ class WidgetContentTestCase(ZulipTestCase): content = '/poll' payload['content'] = content - result = self.api_post(sender_email, "/api/v1/messages", payload) + result = self.api_post(sender, "/api/v1/messages", payload) self.assert_json_success(result) expected_submessage_content = dict( diff --git a/zerver/webhooks/beanstalk/tests.py b/zerver/webhooks/beanstalk/tests.py index 42dfecd323..e7e9f49540 100644 --- a/zerver/webhooks/beanstalk/tests.py +++ b/zerver/webhooks/beanstalk/tests.py @@ -16,7 +16,7 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi [pushed](http://lfranchi-svn.beanstalkapp.com/work-test) 1 commit to branch master. * add some stuff ([e50508d](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/e50508df))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_singlecommit', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_singlecommit', expected_topic, expected_message, content_type=None) def test_git_single_filtered_by_branches(self) -> None: @@ -25,7 +25,7 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi [pushed](http://lfranchi-svn.beanstalkapp.com/work-test) 1 commit to branch master. * add some stuff ([e50508d](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/e50508df))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_singlecommit', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_singlecommit', expected_topic, expected_message, content_type=None) def test_git_multiple_committers(self) -> None: @@ -35,7 +35,7 @@ class BeanstalkHookTests(WebhookTestCase): * Added new file ([edf529c](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/edf529c7)) * Filled in new file with some stuff ([c2a191b](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/c2a191b9)) * More work to fix some bugs ([2009815](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/20098158))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_multiple_committers', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_multiple_committers', expected_topic, expected_message, content_type=None) def test_git_multiple_committers_filtered_by_branches(self) -> None: @@ -46,7 +46,7 @@ class BeanstalkHookTests(WebhookTestCase): * Added new file ([edf529c](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/edf529c7)) * Filled in new file with some stuff ([c2a191b](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/c2a191b9)) * More work to fix some bugs ([2009815](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/20098158))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_multiple_committers', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_multiple_committers', expected_topic, expected_message, content_type=None) def test_git_multiple(self) -> None: @@ -56,7 +56,7 @@ class BeanstalkHookTests(WebhookTestCase): * Added new file ([edf529c](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/edf529c7)) * Filled in new file with some stuff ([c2a191b](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/c2a191b9)) * More work to fix some bugs ([2009815](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/20098158))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_multiple', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_multiple', expected_topic, expected_message, content_type=None) def test_git_multiple_filtered_by_branches(self) -> None: @@ -67,7 +67,7 @@ class BeanstalkHookTests(WebhookTestCase): * Added new file ([edf529c](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/edf529c7)) * Filled in new file with some stuff ([c2a191b](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/c2a191b9)) * More work to fix some bugs ([2009815](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/20098158))""" - self.api_stream_message(self.TEST_USER_EMAIL, 'git_multiple', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_multiple', expected_topic, expected_message, content_type=None) def test_git_more_than_limit(self) -> None: @@ -76,7 +76,7 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi [pushed](http://lfranchi-svn.beanstalkapp.com/work-test) 50 commits to branch master. {}[and {} more commit(s)]""".format((commits_info * COMMITS_LIMIT), 50 - COMMITS_LIMIT) - self.api_stream_message(self.TEST_USER_EMAIL, 'git_morethanlimitcommits', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_morethanlimitcommits', expected_topic, expected_message, content_type=None) def test_git_more_than_limit_filtered_by_branches(self) -> None: @@ -86,14 +86,14 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi [pushed](http://lfranchi-svn.beanstalkapp.com/work-test) 50 commits to branch master. {}[and {} more commit(s)]""".format((commits_info * COMMITS_LIMIT), 50 - COMMITS_LIMIT) - self.api_stream_message(self.TEST_USER_EMAIL, 'git_morethanlimitcommits', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'git_morethanlimitcommits', expected_topic, expected_message, content_type=None) @patch('zerver.webhooks.beanstalk.view.check_send_webhook_message') def test_git_single_filtered_by_branches_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: self.url = self.build_webhook_url(branches='changes,development') payload = self.get_body('git_singlecommit') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload) + result = self.api_post(self.test_user, self.url, payload) self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) @@ -102,7 +102,7 @@ class BeanstalkHookTests(WebhookTestCase): self, check_send_webhook_message_mock: MagicMock) -> None: self.url = self.build_webhook_url(branches='changes,development') payload = self.get_body('git_multiple_committers') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload) + result = self.api_post(self.test_user, self.url, payload) self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) @@ -111,7 +111,7 @@ class BeanstalkHookTests(WebhookTestCase): self, check_send_webhook_message_mock: MagicMock) -> None: self.url = self.build_webhook_url(branches='changes,development') payload = self.get_body('git_multiple') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload) + result = self.api_post(self.test_user, self.url, payload) self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) @@ -120,7 +120,7 @@ class BeanstalkHookTests(WebhookTestCase): self, check_send_webhook_message_mock: MagicMock) -> None: self.url = self.build_webhook_url(branches='changes,development') payload = self.get_body('git_morethanlimitcommits') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload) + result = self.api_post(self.test_user, self.url, payload) self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) @@ -129,7 +129,7 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi pushed [revision 3](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/3): > Removed a file and added another one!""" - self.api_stream_message(self.TEST_USER_EMAIL, 'svn_addremove', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'svn_addremove', expected_topic, expected_message, content_type=None) def test_svn_changefile(self) -> None: @@ -137,7 +137,7 @@ class BeanstalkHookTests(WebhookTestCase): expected_message = """Leo Franchi pushed [revision 2](http://lfranchi-svn.beanstalkapp.com/work-test/changesets/2): > Added some code""" - self.api_stream_message(self.TEST_USER_EMAIL, 'svn_changefile', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'svn_changefile', expected_topic, expected_message, content_type=None) def get_body(self, fixture_name: str) -> Dict[str, str]: diff --git a/zerver/webhooks/bitbucket/tests.py b/zerver/webhooks/bitbucket/tests.py index f6901f5e9e..6dddc1dd33 100644 --- a/zerver/webhooks/bitbucket/tests.py +++ b/zerver/webhooks/bitbucket/tests.py @@ -18,7 +18,7 @@ class BitbucketHookTests(WebhookTestCase): self.url = self.build_webhook_url(payload=self.get_body(fixture_name)) commit_info = u'* c ([25f93d2](https://bitbucket.org/kolaszek/repository-name/commits/25f93d22b719e2d678a7ad5ee0ef0d1fcdf39c12))' expected_message = u"kolaszek pushed 1 commit to branch master.\n\n{}".format(commit_info) - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, expected_message) def test_bitbucket_on_push_event_without_user_info(self) -> None: @@ -26,7 +26,7 @@ class BitbucketHookTests(WebhookTestCase): self.url = self.build_webhook_url(payload=self.get_body(fixture_name)) commit_info = u'* c ([25f93d2](https://bitbucket.org/kolaszek/repository-name/commits/25f93d22b719e2d678a7ad5ee0ef0d1fcdf39c12))' expected_message = u"Someone pushed 1 commit to branch master. Commits by eeshangarg (1).\n\n{}".format(commit_info) - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, expected_message) def test_bitbucket_on_push_event_filtered_by_branches(self) -> None: @@ -35,7 +35,7 @@ class BitbucketHookTests(WebhookTestCase): branches='master,development') commit_info = u'* c ([25f93d2](https://bitbucket.org/kolaszek/repository-name/commits/25f93d22b719e2d678a7ad5ee0ef0d1fcdf39c12))' expected_message = u"kolaszek pushed 1 commit to branch master.\n\n{}".format(commit_info) - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, expected_message) def test_bitbucket_on_push_commits_above_limit_event(self) -> None: @@ -43,7 +43,7 @@ class BitbucketHookTests(WebhookTestCase): self.url = self.build_webhook_url(payload=self.get_body(fixture_name)) commit_info = u'* c ([25f93d2](https://bitbucket.org/kolaszek/repository-name/commits/25f93d22b719e2d678a7ad5ee0ef0d1fcdf39c12))\n' expected_message = u"kolaszek pushed 50 commits to branch master.\n\n{}[and 30 more commit(s)]".format(commit_info * 20) - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, expected_message) def test_bitbucket_on_push_commits_above_limit_event_filtered_by_branches(self) -> None: @@ -52,21 +52,21 @@ class BitbucketHookTests(WebhookTestCase): branches='master,development') commit_info = u'* c ([25f93d2](https://bitbucket.org/kolaszek/repository-name/commits/25f93d22b719e2d678a7ad5ee0ef0d1fcdf39c12))\n' expected_message = u"kolaszek pushed 50 commits to branch master.\n\n{}[and 30 more commit(s)]".format(commit_info * 20) - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC_BRANCH_EVENTS, expected_message) def test_bitbucket_on_force_push_event(self) -> None: fixture_name = 'force_push' self.url = self.build_webhook_url(payload=self.get_body(fixture_name)) expected_message = u"kolaszek [force pushed](https://bitbucket.org/kolaszek/repository-name)." - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC, expected_message) def test_bitbucket_on_force_push_event_without_user_info(self) -> None: fixture_name = 'force_push_without_user_info' self.url = self.build_webhook_url(payload=self.get_body(fixture_name)) expected_message = u"Someone [force pushed](https://bitbucket.org/kolaszek/repository-name/)." - self.api_stream_message(self.TEST_USER_EMAIL, fixture_name, self.EXPECTED_TOPIC, + self.api_stream_message(self.test_user, fixture_name, self.EXPECTED_TOPIC, expected_message) @patch('zerver.webhooks.bitbucket.view.check_send_webhook_message') @@ -75,7 +75,7 @@ class BitbucketHookTests(WebhookTestCase): payload = self.get_body(fixture_name) self.url = self.build_webhook_url(payload=payload, branches='changes,development') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload, content_type="application/json,") + result = self.api_post(self.test_user, self.url, payload, content_type="application/json,") self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) @@ -86,7 +86,7 @@ class BitbucketHookTests(WebhookTestCase): payload = self.get_body(fixture_name) self.url = self.build_webhook_url(payload=payload, branches='changes,development') - result = self.api_post(self.TEST_USER_EMAIL, self.url, payload, content_type="application/json,") + result = self.api_post(self.test_user, self.url, payload, content_type="application/json,") self.assertFalse(check_send_webhook_message_mock.called) self.assert_json_success(result) diff --git a/zerver/webhooks/deskdotcom/tests.py b/zerver/webhooks/deskdotcom/tests.py index a8d7b74c92..f067472e20 100644 --- a/zerver/webhooks/deskdotcom/tests.py +++ b/zerver/webhooks/deskdotcom/tests.py @@ -21,7 +21,7 @@ class DeskDotComHookTests(WebhookTestCase): expected_topic = u"static text notification" expected_message = u"This is a custom action." - self.api_stream_message(self.TEST_USER_EMAIL, 'static_text', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'static_text', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_case_updated_message(self) -> None: @@ -30,7 +30,7 @@ class DeskDotComHookTests(WebhookTestCase): u"Link: " u"I have a question") - self.api_stream_message(self.TEST_USER_EMAIL, 'case_updated', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'case_updated', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_unicode_text_italian(self) -> None: @@ -40,7 +40,7 @@ class DeskDotComHookTests(WebhookTestCase): u"Link: " u"Il mio hovercraft è pieno di anguille.") - self.api_stream_message(self.TEST_USER_EMAIL, 'unicode_text_italian', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'unicode_text_italian', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_unicode_text_japanese(self) -> None: @@ -50,7 +50,7 @@ class DeskDotComHookTests(WebhookTestCase): u"Link: " u"私のホバークラフトは鰻でいっぱいです") - self.api_stream_message(self.TEST_USER_EMAIL, 'unicode_text_japanese', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'unicode_text_japanese', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def get_body(self, fixture_name: str) -> str: diff --git a/zerver/webhooks/freshdesk/tests.py b/zerver/webhooks/freshdesk/tests.py index 1c2378abad..cd3707af61 100644 --- a/zerver/webhooks/freshdesk/tests.py +++ b/zerver/webhooks/freshdesk/tests.py @@ -26,7 +26,7 @@ Test ticket description ☃. * **Status**: Pending """.strip() - self.api_stream_message(self.TEST_USER_EMAIL, 'ticket_created', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'ticket_created', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_status_change(self) -> None: @@ -41,7 +41,7 @@ Requester Bob updated [ticket #11](http://test1234zz * **Status**: Resolved -> Waiting on Customer """.strip() - self.api_stream_message(self.TEST_USER_EMAIL, 'status_changed', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'status_changed', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_status_change_fixture_without_required_key(self) -> None: @@ -51,7 +51,7 @@ Requester Bob updated [ticket #11](http://test1234zz self.url = self.build_webhook_url() payload = self.get_body('status_changed_fixture_with_missing_key') kwargs = { - 'HTTP_AUTHORIZATION': self.encode_email(self.TEST_USER_EMAIL), + 'HTTP_AUTHORIZATION': self.encode_email(self.test_user.email), 'content_type': 'application/x-www-form-urlencoded', } result = self.client_post(self.url, payload, **kwargs) @@ -68,7 +68,7 @@ Requester Bob updated [ticket #11](http://test1234zz * **Priority**: High -> Low """.strip() - self.api_stream_message(self.TEST_USER_EMAIL, 'priority_changed', expected_topic, expected_message, + self.api_stream_message(self.test_user, 'priority_changed', expected_topic, expected_message, content_type="application/x-www-form-urlencoded") @patch('zerver.lib.webhooks.common.check_send_webhook_message') @@ -80,7 +80,7 @@ Requester Bob updated [ticket #11](http://test1234zz self.url = self.build_webhook_url() payload = self.get_body('unknown_payload') kwargs = { - 'HTTP_AUTHORIZATION': self.encode_email(self.TEST_USER_EMAIL), + 'HTTP_AUTHORIZATION': self.encode_email(self.test_user.email), 'content_type': 'application/x-www-form-urlencoded', } result = self.client_post(self.url, payload, **kwargs) @@ -97,7 +97,7 @@ Requester Bob updated [ticket #11](http://test1234zz Requester Bob added a {} note to \ [ticket #11](http://test1234zzz.freshdesk.com/helpdesk/tickets/11). """.strip().format(note_type) - self.api_stream_message(self.TEST_USER_EMAIL, fixture, expected_topic, expected_message, + self.api_stream_message(self.test_user, fixture, expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def test_private_note_change(self) -> None: @@ -116,7 +116,7 @@ Requester Bob added a {} note to \ expected_message = """ Requester \u2603 Bob created [ticket #12](http://test1234zzz.freshdesk.com/helpdesk/tickets/12):\n\n``` quote\nThere are too many cat pictures on the internet \u2603. We need more guinea pigs.\nExhibit 1:\n\n \n\n[guinea_pig.png](http://cdn.freshdesk.com/data/helpdesk/attachments/production/12744808/original/guinea_pig.png)\n```\n\n* **Type**: Problem\n* **Priority**: Urgent\n* **Status**: Open """.strip() - self.api_stream_message(self.TEST_USER_EMAIL, "inline_images", expected_topic, expected_message, + self.api_stream_message(self.test_user, "inline_images", expected_topic, expected_message, content_type="application/x-www-form-urlencoded") def get_body(self, fixture_name: str) -> str: diff --git a/zerver/webhooks/zendesk/tests.py b/zerver/webhooks/zendesk/tests.py index 43c69917cf..d3c25fe029 100644 --- a/zerver/webhooks/zendesk/tests.py +++ b/zerver/webhooks/zendesk/tests.py @@ -26,7 +26,7 @@ class ZenDeskHookTests(WebhookTestCase): } def do_test(self, expected_topic: Optional[str]=None, expected_message: Optional[str]=None) -> None: - self.api_stream_message(self.TEST_USER_EMAIL, "", expected_topic, expected_message, + self.api_stream_message(self.test_user, "", expected_topic, expected_message, content_type=None) self.TICKET_TITLE = self.DEFAULT_TICKET_TITLE self.TICKET_ID = self.DEFAULT_TICKET_ID