Esempio n. 1
0
    def test_add_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient

        result = self.api_post(pm_sender.email,
                               "/api/v1/messages", {"type": "private",
                                                    "content": "Test message",
                                                    "to": pm_recipient.email})
        self.assert_json_success(result)
        pm_id = result.json()['id']

        expected_recipient_ids = set([pm_sender.id, pm_recipient.id])

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.api_put(reaction_sender.email, '/api/v1/messages/%s/emoji_reactions/smile' % (pm_id,))
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'add')
        self.assertEqual(event['emoji_name'], 'smile')
        self.assertEqual(event['message_id'], pm_id)
Esempio n. 2
0
    def test_send_notification_to_self_event(self) -> None:
        """
        Sending stopped typing notification to yourself
        is successful.
        """
        user = self.example_user('hamlet')
        email = user.email
        expected_recipient_emails = set([email])
        expected_recipient_ids = set([user.id])

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.api_post(email, '/api/v1/typing', {'to': email,
                                                             'op': 'stop'})
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = set(user['email'] for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id'] for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['sender']['email'], email)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'stop')
Esempio n. 3
0
    def test_send_notification_to_another_user_event(self):
        # type: () -> None
        """
        Sending stopped typing notification to another user
        is successful.
        """
        sender = self.example_user('hamlet')
        recipient = self.example_user('othello')
        expected_recipients = set([sender, recipient])
        expected_recipient_emails = set([user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_post('/api/v1/typing', {'to': recipient.email,
                                                         'op': 'stop'},
                                      **self.api_auth(sender.email))
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = set(user['email'] for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id'] for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'stop')
Esempio n. 4
0
    def test_change_regular_member_to_guest(self) -> None:
        iago = self.example_user("iago")
        self.login(iago.email)

        hamlet = self.example_user("hamlet")
        self.assertFalse(hamlet.is_guest)

        # Test failure of making user both admin and guest
        req = dict(is_guest=ujson.dumps(True), is_admin=ujson.dumps(True))
        result = self.client_patch('/json/users/{}'.format(hamlet.id), req)
        self.assert_json_error(result, 'Guests cannot be organization administrators')
        self.assertFalse(hamlet.is_guest)
        self.assertFalse(hamlet.is_realm_admin)
        hamlet = self.example_user("hamlet")

        req = dict(is_guest=ujson.dumps(True))
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(hamlet.id), req)
        self.assert_json_success(result)

        hamlet = self.example_user("hamlet")
        self.assertTrue(hamlet.is_guest)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], hamlet.email)
        self.assertTrue(person['is_guest'])
Esempio n. 5
0
    def test_multiple_recipients(self):
        # type: () -> None
        """
        Sending typing notification to a single recipient is successful
        """
        sender = self.example_user('hamlet')
        recipient = [self.example_user('othello'), self.example_user('cordelia')]
        expected_recipients = set(recipient) | set([sender])
        expected_recipient_emails = set([user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_post('/api/v1/typing', {'to': ujson.dumps([user.email for user in recipient]),
                                                         'op': 'start'},
                                      **self.api_auth(sender.email))
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = set(user['email'] for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id'] for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 6
0
    def test_change_guest_to_admin(self) -> None:
        iago = self.example_user("iago")
        self.login(iago.email)
        polonius = self.example_user("polonius")
        self.assertTrue(polonius.is_guest)
        self.assertFalse(polonius.is_realm_admin)

        # Test failure of making a guest to admin without revoking guest status
        req = dict(is_admin=ujson.dumps(True))
        result = self.client_patch('/json/users/{}'.format(polonius.id), req)
        self.assert_json_error(result, 'Guests cannot be organization administrators')

        # Test changing a user from guest to admin and revoking guest status
        polonius = self.example_user("polonius")
        self.assertFalse(polonius.is_realm_admin)
        req = dict(is_admin=ujson.dumps(True), is_guest=ujson.dumps(False))
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(polonius.id), req)
        self.assert_json_success(result)

        polonius = self.example_user("polonius")
        self.assertFalse(polonius.is_guest)
        self.assertTrue(polonius.is_realm_admin)

        person = events[0]['event']['person']
        self.assertEqual(person['email'], polonius.email)
        self.assertTrue(person['is_admin'])

        person = events[1]['event']['person']
        self.assertEqual(person['email'], polonius.email)
        self.assertFalse(person['is_guest'])
Esempio n. 7
0
    def test_bot_add_subscription(self) -> None:
        """
        Calling POST /json/users/me/subscriptions should successfully add
        streams, and a stream to the
        list of subscriptions and confirm the right number of events
        are generated.
        When 'principals' has a bot, no notification message event or invitation email
        is sent when add_subscriptions_backend is called in the above api call.
        """
        self.login(self.example_email('hamlet'))

        # Normal user i.e. not a bot.
        request_data = {
            'principals': '["' + self.example_email('iago') + '"]'
        }
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.common_subscribe_to_streams(self.example_email('hamlet'), ['Rome'], request_data)
            self.assert_json_success(result)

        msg_event = [e for e in events if e['event']['type'] == 'message']
        self.assert_length(msg_event, 1)  # Notification message event is sent.

        # Create a bot.
        self.assert_num_bots_equal(0)
        result = self.create_bot()
        self.assert_num_bots_equal(1)

        # A bot
        bot_request_data = {
            'principals': '["*****@*****.**"]'
        }
        events_bot = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events_bot):
            result = self.common_subscribe_to_streams(self.example_email('hamlet'), ['Rome'], bot_request_data)
            self.assert_json_success(result)

        # No notification message event or invitation email is sent because of bot.
        msg_event = [e for e in events_bot if e['event']['type'] == 'message']
        self.assert_length(msg_event, 0)
        self.assertEqual(len(events_bot), len(events) - 1)

        # Test runner automatically redirects all sent email to a dummy 'outbox'.
        self.assertEqual(len(mail.outbox), 0)
Esempio n. 8
0
 def test_update_realm_name_events(self) -> None:
     realm = get_realm('zulip')
     new_name = u'Puliz'
     events = []  # type: List[Mapping[str, Any]]
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, 'name', new_name)
     event = events[0]['event']
     self.assertEqual(event, dict(
         type='realm',
         op='update',
         property='name',
         value=new_name,
     ))
Esempio n. 9
0
 def test_update_realm_description_events(self) -> None:
     realm = get_realm('zulip')
     new_description = u'zulip dev group'
     events = []  # type: List[Mapping[str, Any]]
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, 'description', new_description)
     event = events[0]['event']
     self.assertEqual(event, dict(
         type='realm',
         op='update',
         property='description',
         value=new_description,
     ))
Esempio n. 10
0
 def test_update_realm_description_events(self) -> None:
     realm = get_realm('zulip')
     new_description = u'zulip dev group'
     events = []  # type: List[Mapping[str, Any]]
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, 'description', new_description)
     event = events[0]['event']
     self.assertEqual(event, dict(
         type='realm',
         op='update',
         property='description',
         value=new_description,
     ))
Esempio n. 11
0
 def test_update_realm_name_events(self) -> None:
     realm = get_realm('zulip')
     new_name = u'Puliz'
     events = []  # type: List[Mapping[str, Any]]
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, 'name', new_name)
     event = events[0]['event']
     self.assertEqual(event, dict(
         type='realm',
         op='update',
         property='name',
         value=new_name,
     ))
Esempio n. 12
0
    def test_multiple_recipients_by_user_ids(self) -> None:
        """
        Sending typing notification to multiple recipients (using user IDs)
        is successful
        """
        sender = self.example_user('hamlet')
        recipient_users = [
            self.example_user('othello'),
            self.example_user('cordelia')
        ]
        expected_recipients = set(recipient_users) | set([sender])
        expected_recipient_emails = set(
            [user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])

        huddle_hash = get_huddle_hash(list(expected_recipient_ids))
        self.assertFalse(
            Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        events = []  # type: List[Mapping[str, Any]]

        params = dict(
            to=ujson.dumps([user.id for user in recipient_users]),
            op='start',
        )

        with queries_captured() as queries:
            with tornado_redirected_to_list(events):
                result = self.api_post(sender.email, '/api/v1/typing', params)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)
        self.assertEqual(len(queries), 15)

        # TODO: Fix this somewhat evil side effect of sending
        #       typing indicators.
        self.assertTrue(
            Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        event = events[0]['event']
        event_recipient_emails = set(user['email']
                                     for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id']
                                       for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 13
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user("hamlet")
        pm_recipient = self.example_user("othello")
        reaction_sender = pm_recipient

        result = self.api_post(
            pm_sender,
            "/api/v1/messages",
            {
                "type": "private",
                "content": "Test message",
                "to": pm_recipient.email
            },
        )
        self.assert_json_success(result)
        content = result.json()
        pm_id = content["id"]

        expected_recipient_ids = {pm_sender.id, pm_recipient.id}

        reaction_info = {
            "emoji_name": "smile",
        }

        add = self.api_post(reaction_sender,
                            f"/api/v1/messages/{pm_id}/reactions",
                            reaction_info)
        self.assert_json_success(add)

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_delete(reaction_sender,
                                     f"/api/v1/messages/{pm_id}/reactions",
                                     reaction_info)
        self.assert_json_success(result)
        self.assert_length(events, 1)

        event = events[0]["event"]
        event_user_ids = set(events[0]["users"])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event["user"]["email"], reaction_sender.email)
        self.assertEqual(event["type"], "reaction")
        self.assertEqual(event["op"], "remove")
        self.assertEqual(event["emoji_name"], "smile")
        self.assertEqual(event["message_id"], pm_id)
Esempio n. 14
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient

        result = self.client_post("/api/v1/messages", {"type": "private",
                                                       "content": "Test message",
                                                       "to": pm_recipient.email},
                                  **self.api_auth(pm_sender.email))
        self.assert_json_success(result)
        content = result.json()
        pm_id = content['id']

        expected_recipient_ids = set([pm_sender.id, pm_recipient.id])

        reaction_info = {
            'emoji_name': 'hamburger',
            'emoji_code': '1f354',
            'reaction_type': 'unicode_emoji',
        }
        add = self.client_post('/api/v1/messages/%s/reactions' % (pm_id,),
                               reaction_info,
                               **self.api_auth(reaction_sender.email))
        self.assert_json_success(add)

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_delete('/api/v1/messages/%s/reactions' % (pm_id,),
                                        reaction_info,
                                        **self.api_auth(reaction_sender.email))
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['user_id'], reaction_sender.id)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['user']['full_name'], reaction_sender.full_name)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'remove')
        self.assertEqual(event['message_id'], pm_id)
        self.assertEqual(event['emoji_name'], reaction_info['emoji_name'])
        self.assertEqual(event['emoji_code'], reaction_info['emoji_code'])
        self.assertEqual(event['reaction_type'], reaction_info['reaction_type'])
Esempio n. 15
0
    def test_start_to_multiple_recipients(self) -> None:
        sender = self.example_user('hamlet')
        recipient_users = [
            self.example_user('othello'),
            self.example_user('cordelia')
        ]
        expected_recipients = set(recipient_users) | set([sender])
        expected_recipient_emails = set(
            [user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])

        huddle_hash = get_huddle_hash(list(expected_recipient_ids))
        self.assertFalse(
            Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        events = []  # type: List[Mapping[str, Any]]

        params = dict(
            to=ujson.dumps([user.id for user in recipient_users]),
            op='start',
        )

        with queries_captured() as queries:
            with tornado_redirected_to_list(events):
                result = self.api_post(sender, '/api/v1/typing', params)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)
        self.assertEqual(len(queries), 5)

        # We should not be adding new Huddles just because
        # a user started typing in the compose box.  Let's
        # wait till they send an actual message.
        self.assertFalse(
            Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        event = events[0]['event']
        event_recipient_emails = set(user['email']
                                     for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id']
                                       for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 16
0
 def test_update_realm_name_events(self) -> None:
     realm = get_realm("zulip")
     new_name = "Puliz"
     events: List[Mapping[str, Any]] = []
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, "name", new_name, acting_user=None)
     event = events[0]["event"]
     self.assertEqual(
         event,
         dict(
             type="realm",
             op="update",
             property="name",
             value=new_name,
         ),
     )
Esempio n. 17
0
 def test_update_realm_description_events(self) -> None:
     realm = get_realm("zulip")
     new_description = "zulip dev group"
     events: List[Mapping[str, Any]] = []
     with tornado_redirected_to_list(events):
         do_set_realm_property(realm, "description", new_description)
     event = events[0]["event"]
     self.assertEqual(
         event,
         dict(
             type="realm",
             op="update",
             property="description",
             value=new_description,
         ),
     )
Esempio n. 18
0
    def test_mark_all_in_stream_read(self) -> None:
        self.login("hamlet")
        user_profile = self.example_user("hamlet")
        stream = self.subscribe(user_profile, "test_stream")
        self.subscribe(self.example_user("cordelia"), "test_stream")

        message_id = self.send_stream_message(self.example_user("hamlet"), "test_stream", "hello")
        unrelated_message_id = self.send_stream_message(
            self.example_user("hamlet"), "Denmark", "hello"
        )

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.client_post(
                "/json/mark_stream_as_read",
                {
                    "stream_id": stream.id,
                },
            )

        self.assert_json_success(result)
        self.assertTrue(len(events) == 1)

        event = events[0]["event"]
        expected = dict(
            operation="add",
            messages=[message_id],
            flag="read",
            type="update_message_flags",
            all=False,
        )

        differences = [key for key in expected if expected[key] != event[key]]
        self.assertTrue(len(differences) == 0)

        hamlet = self.example_user("hamlet")
        um = list(UserMessage.objects.filter(message=message_id))
        for msg in um:
            if msg.user_profile.email == hamlet.email:
                self.assertTrue(msg.flags.read)
            else:
                self.assertFalse(msg.flags.read)

        unrelated_messages = list(UserMessage.objects.filter(message=unrelated_message_id))
        for msg in unrelated_messages:
            if msg.user_profile.email == hamlet.email:
                self.assertFalse(msg.flags.read)
Esempio n. 19
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient
        pm_id = self.send_personal_message(pm_sender, pm_recipient)
        expected_recipient_ids = {pm_sender.id, pm_recipient.id}
        reaction_info = {
            'emoji_name': 'hamburger',
            'emoji_code': '1f354',
            'reaction_type': 'unicode_emoji',
        }
        add = self.api_post(
            reaction_sender,
            f'/api/v1/messages/{pm_id}/reactions',
            reaction_info,
        )
        self.assert_json_success(add)

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_delete(
                reaction_sender,
                f'/api/v1/messages/{pm_id}/reactions',
                reaction_info,
            )

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['user_id'], reaction_sender.id)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['user']['full_name'], reaction_sender.full_name)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'remove')
        self.assertEqual(event['message_id'], pm_id)
        self.assertEqual(event['emoji_name'], reaction_info['emoji_name'])
        self.assertEqual(event['emoji_code'], reaction_info['emoji_code'])
        self.assertEqual(event['reaction_type'],
                         reaction_info['reaction_type'])
Esempio n. 20
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user("hamlet")
        pm_recipient = self.example_user("othello")
        reaction_sender = pm_recipient
        pm_id = self.send_personal_message(pm_sender, pm_recipient)
        expected_recipient_ids = {pm_sender.id, pm_recipient.id}
        reaction_info = {
            "emoji_name": "hamburger",
            "emoji_code": "1f354",
            "reaction_type": "unicode_emoji",
        }
        add = self.api_post(
            reaction_sender,
            f"/api/v1/messages/{pm_id}/reactions",
            reaction_info,
        )
        self.assert_json_success(add)

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_delete(
                reaction_sender,
                f"/api/v1/messages/{pm_id}/reactions",
                reaction_info,
            )

        self.assert_json_success(result)
        self.assert_length(events, 1)

        event = events[0]["event"]
        event_user_ids = set(events[0]["users"])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event["user"]["user_id"], reaction_sender.id)
        self.assertEqual(event["user"]["email"], reaction_sender.email)
        self.assertEqual(event["user"]["full_name"], reaction_sender.full_name)
        self.assertEqual(event["type"], "reaction")
        self.assertEqual(event["op"], "remove")
        self.assertEqual(event["message_id"], pm_id)
        self.assertEqual(event["emoji_name"], reaction_info["emoji_name"])
        self.assertEqual(event["emoji_code"], reaction_info["emoji_code"])
        self.assertEqual(event["reaction_type"],
                         reaction_info["reaction_type"])
Esempio n. 21
0
    def test_change_guest_to_regular_member(self) -> None:
        iago = self.example_user("iago")
        self.login(iago.email)

        polonius = self.example_user("polonius")
        self.assertTrue(polonius.is_guest)
        req = dict(is_guest=ujson.dumps(False))
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(polonius.id), req)
        self.assert_json_success(result)

        polonius = self.example_user("polonius")
        self.assertFalse(polonius.is_guest)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], polonius.email)
        self.assertFalse(person['is_guest'])
Esempio n. 22
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient

        result = self.api_post(pm_sender, "/api/v1/messages", {
            "type": "private",
            "content": "Test message",
            "to": pm_recipient.email
        })
        self.assert_json_success(result)
        content = result.json()
        pm_id = content['id']

        expected_recipient_ids = {pm_sender.id, pm_recipient.id}

        reaction_info = {
            'emoji_name': 'smile',
        }

        add = self.api_post(reaction_sender,
                            f'/api/v1/messages/{pm_id}/reactions',
                            reaction_info)
        self.assert_json_success(add)

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_delete(reaction_sender,
                                     f'/api/v1/messages/{pm_id}/reactions',
                                     reaction_info)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'remove')
        self.assertEqual(event['emoji_name'], 'smile')
        self.assertEqual(event['message_id'], pm_id)
Esempio n. 23
0
    def test_change_guest_to_regular_member(self) -> None:
        iago = self.example_user("iago")
        self.login(iago.email)

        polonius = self.example_user("polonius")
        self.assertTrue(polonius.is_guest)
        req = dict(is_guest=ujson.dumps(False))
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(polonius.id), req)
        self.assert_json_success(result)

        polonius = self.example_user("polonius")
        self.assertFalse(polonius.is_guest)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], polonius.email)
        self.assertFalse(person['is_guest'])
Esempio n. 24
0
    def test_update_realm_description(self) -> None:
        self.login('iago')
        new_description = 'zulip dev group'
        data = dict(description=ujson.dumps(new_description))
        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/realm', data)
            self.assert_json_success(result)
            realm = get_realm('zulip')
            self.assertEqual(realm.description, new_description)

        event = events[0]['event']
        self.assertEqual(event, dict(
            type='realm',
            op='update',
            property='description',
            value=new_description,
        ))
Esempio n. 25
0
    def test_start_to_another_user(self) -> None:
        """
        Sending typing notification to another user
        is successful.
        """
        sender = self.example_user('hamlet')
        recipient = self.example_user('othello')
        expected_recipients = {sender, recipient}
        expected_recipient_emails = {
            user.email
            for user in expected_recipients
        }
        expected_recipient_ids = {user.id for user in expected_recipients}

        params = dict(
            to=ujson.dumps([recipient.id]),
            op='start',
        )

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_post(sender, '/api/v1/typing', params)

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = {
            user['email']
            for user in event['recipients']
        }
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = {
            user['user_id']
            for user in event['recipients']
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 26
0
    def test_mark_all_in_stream_topic_read(self):
        # type: () -> None
        self.login(self.example_email("hamlet"))
        user_profile = self.example_user('hamlet')
        self.subscribe(user_profile, "test_stream")

        message_id = self.send_stream_message(self.example_email("hamlet"),
                                              "test_stream", "hello",
                                              "test_topic")
        unrelated_message_id = self.send_stream_message(
            self.example_email("hamlet"), "Denmark", "hello", "Denmark2")
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_post(
                "/json/mark_topic_as_read", {
                    "stream_id": get_stream("test_stream",
                                            user_profile.realm).id,
                    "topic_name": "test_topic",
                })

        self.assert_json_success(result)
        self.assertTrue(len(events) == 1)

        event = events[0]['event']
        expected = dict(operation='add',
                        messages=[message_id],
                        flag='read',
                        type='update_message_flags',
                        all=False)

        differences = [key for key in expected if expected[key] != event[key]]
        self.assertTrue(len(differences) == 0)

        um = list(UserMessage.objects.filter(message=message_id))
        for msg in um:
            if msg.user_profile.email == self.example_email("hamlet"):
                self.assertTrue(msg.flags.read)

        unrelated_messages = list(
            UserMessage.objects.filter(message=unrelated_message_id))
        for msg in unrelated_messages:
            if msg.user_profile.email == self.example_email("hamlet"):
                self.assertFalse(msg.flags.read)
Esempio n. 27
0
    def test_start_to_another_user(self) -> None:
        """
        Sending typing notification to another user
        is successful.
        """
        sender = self.example_user("hamlet")
        recipient = self.example_user("othello")
        expected_recipients = {sender, recipient}
        expected_recipient_emails = {
            user.email
            for user in expected_recipients
        }
        expected_recipient_ids = {user.id for user in expected_recipients}

        params = dict(
            to=orjson.dumps([recipient.id]).decode(),
            op="start",
        )

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_post(sender, "/api/v1/typing", params)

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]["event"]
        event_recipient_emails = {
            user["email"]
            for user in event["recipients"]
        }
        event_user_ids = set(events[0]["users"])
        event_recipient_user_ids = {
            user["user_id"]
            for user in event["recipients"]
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event["sender"]["email"], sender.email)
        self.assertEqual(event["type"], "typing")
        self.assertEqual(event["op"], "start")
Esempio n. 28
0
    def test_update_realm_description(self) -> None:
        email = self.example_email("iago")
        self.login(email)
        realm = get_realm('zulip')
        new_description = u'zulip dev group'
        data = dict(description=ujson.dumps(new_description))
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/realm', data)
            self.assert_json_success(result)
            realm = get_realm('zulip')
            self.assertEqual(realm.description, new_description)

        event = events[0]['event']
        self.assertEqual(event, dict(
            type='realm',
            op='update',
            property='description',
            value=new_description,
        ))
Esempio n. 29
0
    def test_start_to_single_recipient(self) -> None:
        sender = self.example_user("hamlet")
        recipient_user = self.example_user("othello")
        expected_recipients = {sender, recipient_user}
        expected_recipient_emails = {
            user.email
            for user in expected_recipients
        }
        expected_recipient_ids = {user.id for user in expected_recipients}

        params = dict(
            to=orjson.dumps([recipient_user.id]).decode(),
            op="start",
        )

        events: List[Mapping[str, Any]] = []
        with queries_captured() as queries:
            with tornado_redirected_to_list(events):
                result = self.api_post(sender, "/api/v1/typing", params)

        self.assert_json_success(result)
        self.assert_length(events, 1)
        self.assert_length(queries, 4)

        event = events[0]["event"]
        event_recipient_emails = {
            user["email"]
            for user in event["recipients"]
        }
        event_user_ids = set(events[0]["users"])
        event_recipient_user_ids = {
            user["user_id"]
            for user in event["recipients"]
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event["sender"]["email"], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event["type"], "typing")
        self.assertEqual(event["op"], "start")
Esempio n. 30
0
    def test_add_bot_with_default_sending_stream_private_allowed(self) -> None:
        self.login(self.example_email('hamlet'))
        user_profile = self.example_user('hamlet')
        stream = get_stream("Denmark", user_profile.realm)
        self.subscribe(user_profile, stream.name)
        do_change_stream_invite_only(stream, True)

        self.assert_num_bots_equal(0)
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.create_bot(default_sending_stream='Denmark')
        self.assert_num_bots_equal(1)
        self.assertEqual(result['default_sending_stream'], 'Denmark')

        email = '*****@*****.**'
        realm = get_realm('zulip')
        profile = get_user(email, realm)
        assert(profile.default_sending_stream is not None)
        self.assertEqual(profile.default_sending_stream.name, 'Denmark')

        event = [e for e in events if e['event']['type'] == 'realm_bot'][0]
        self.assertEqual(
            dict(
                type='realm_bot',
                op='add',
                bot=dict(email='*****@*****.**',
                         user_id=profile.id,
                         full_name='The Bot of Hamlet',
                         bot_type=profile.bot_type,
                         is_active=True,
                         api_key=result['api_key'],
                         avatar_url=result['avatar_url'],
                         default_sending_stream='Denmark',
                         default_events_register_stream=None,
                         default_all_public_streams=False,
                         services=[],
                         owner=self.example_email('hamlet'))
            ),
            event['event']
        )
        self.assertEqual(event['users'], {user_profile.id, })
Esempio n. 31
0
    def test_start_to_single_recipient(self) -> None:
        sender = self.example_user('hamlet')
        recipient_user = self.example_user('othello')
        expected_recipients = {sender, recipient_user}
        expected_recipient_emails = {
            user.email
            for user in expected_recipients
        }
        expected_recipient_ids = {user.id for user in expected_recipients}

        params = dict(
            to=ujson.dumps([recipient_user.id]),
            op='start',
        )

        events = []  # type: List[Mapping[str, Any]]
        with queries_captured() as queries:
            with tornado_redirected_to_list(events):
                result = self.api_post(sender, '/api/v1/typing', params)

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)
        self.assertEqual(len(queries), 4)

        event = events[0]['event']
        event_recipient_emails = {
            user['email']
            for user in event['recipients']
        }
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = {
            user['user_id']
            for user in event['recipients']
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 32
0
    def test_update_realm_description(self) -> None:
        self.login("iago")
        new_description = "zulip dev group"
        data = dict(description=orjson.dumps(new_description).decode())
        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.client_patch("/json/realm", data)
            self.assert_json_success(result)
            realm = get_realm("zulip")
            self.assertEqual(realm.description, new_description)

        event = events[0]["event"]
        self.assertEqual(
            event,
            dict(
                type="realm",
                op="update",
                property="description",
                value=new_description,
            ),
        )
Esempio n. 33
0
    def test_mark_all_in_stream_read(self):
        # type: () -> None
        self.login("*****@*****.**")
        user_profile = get_user_profile_by_email("*****@*****.**")
        self.subscribe_to_stream(user_profile.email, "test_stream", user_profile.realm)

        message_id = self.send_message("*****@*****.**", "test_stream", Recipient.STREAM, "hello")
        unrelated_message_id = self.send_message("*****@*****.**", "Denmark", Recipient.STREAM, "hello")

        events = [] # type: List[Dict[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_post("/json/messages/flags", {"messages": ujson.dumps([]),
                                                               "op": "add",
                                                               "flag": "read",
                                                               "stream_name": "test_stream"})

        self.assert_json_success(result)
        self.assertTrue(len(events) == 1)

        event = events[0]['event']
        expected = dict(operation='add',
                        messages=[message_id],
                        flag='read',
                        type='update_message_flags',
                        all=False)

        differences = [key for key in expected if expected[key] != event[key]]
        self.assertTrue(len(differences) == 0)

        um = list(UserMessage.objects.filter(message=message_id))
        for msg in um:
            if msg.user_profile.email == "*****@*****.**":
                self.assertTrue(msg.flags.read)
            else:
                self.assertFalse(msg.flags.read)

        unrelated_messages = list(UserMessage.objects.filter(message=unrelated_message_id))
        for msg in unrelated_messages:
            if msg.user_profile.email == "*****@*****.**":
                self.assertFalse(msg.flags.read)
Esempio n. 34
0
    def test_mark_all_in_stream_read(self):
        # type: () -> None
        self.login(self.example_email("hamlet"))
        user_profile = self.example_user('hamlet')
        stream = self.subscribe(user_profile, "test_stream")
        self.subscribe(self.example_user("cordelia"), "test_stream")

        message_id = self.send_stream_message(self.example_email("hamlet"), "test_stream", "hello")
        unrelated_message_id = self.send_stream_message(self.example_email("hamlet"), "Denmark", "hello")

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_post("/json/mark_stream_as_read", {
                "stream_id": stream.id
            })

        self.assert_json_success(result)
        self.assertTrue(len(events) == 1)

        event = events[0]['event']
        expected = dict(operation='add',
                        messages=[message_id],
                        flag='read',
                        type='update_message_flags',
                        all=False)

        differences = [key for key in expected if expected[key] != event[key]]
        self.assertTrue(len(differences) == 0)

        um = list(UserMessage.objects.filter(message=message_id))
        for msg in um:
            if msg.user_profile.email == self.example_email("hamlet"):
                self.assertTrue(msg.flags.read)
            else:
                self.assertFalse(msg.flags.read)

        unrelated_messages = list(UserMessage.objects.filter(message=unrelated_message_id))
        for msg in unrelated_messages:
            if msg.user_profile.email == self.example_email("hamlet"):
                self.assertFalse(msg.flags.read)
Esempio n. 35
0
    def test_add_bot(self) -> None:
        self.login(self.example_email('hamlet'))
        self.assert_num_bots_equal(0)
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.create_bot()
        self.assert_num_bots_equal(1)

        email = '*****@*****.**'
        realm = get_realm('zulip')
        bot = get_user(email, realm)

        event = [e for e in events if e['event']['type'] == 'realm_bot'][0]
        self.assertEqual(
            dict(
                type='realm_bot',
                op='add',
                bot=dict(email='*****@*****.**',
                         user_id=bot.id,
                         bot_type=bot.bot_type,
                         full_name='The Bot of Hamlet',
                         is_active=True,
                         api_key=result['api_key'],
                         avatar_url=result['avatar_url'],
                         default_sending_stream=None,
                         default_events_register_stream=None,
                         default_all_public_streams=False,
                         services=[],
                         owner=self.example_email('hamlet'))
            ),
            event['event']
        )

        users_result = self.client_get('/json/users')
        members = ujson.loads(users_result.content)['members']
        bots = [m for m in members if m['email'] == '*****@*****.**']
        self.assertEqual(len(bots), 1)
        bot = bots[0]
        self.assertEqual(bot['bot_owner'], self.example_email('hamlet'))
        self.assertEqual(bot['user_id'], get_user(email, realm).id)
Esempio n. 36
0
    def test_start_to_multiple_recipients(self) -> None:
        sender = self.example_user("hamlet")
        recipient_users = [self.example_user("othello"), self.example_user("cordelia")]
        expected_recipients = set(recipient_users) | {sender}
        expected_recipient_emails = {user.email for user in expected_recipients}
        expected_recipient_ids = {user.id for user in expected_recipients}

        huddle_hash = get_huddle_hash(list(expected_recipient_ids))
        self.assertFalse(Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        events: List[Mapping[str, Any]] = []

        params = dict(
            to=orjson.dumps([user.id for user in recipient_users]).decode(),
            op="start",
        )

        with queries_captured() as queries:
            with tornado_redirected_to_list(events):
                result = self.api_post(sender, "/api/v1/typing", params)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)
        self.assertEqual(len(queries), 5)

        # We should not be adding new Huddles just because
        # a user started typing in the compose box.  Let's
        # wait till they send an actual message.
        self.assertFalse(Huddle.objects.filter(huddle_hash=huddle_hash).exists())

        event = events[0]["event"]
        event_recipient_emails = {user["email"] for user in event["recipients"]}
        event_user_ids = set(events[0]["users"])
        event_recipient_user_ids = {user["user_id"] for user in event["recipients"]}

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event["sender"]["email"], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event["type"], "typing")
        self.assertEqual(event["op"], "start")
Esempio n. 37
0
    def test_start_to_self(self) -> None:
        """
        Sending typing notification to yourself (using user IDs)
        is successful.
        """
        user = self.example_user("hamlet")
        email = user.email
        expected_recipient_emails = {email}
        expected_recipient_ids = {user.id}
        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_post(
                user,
                "/api/v1/typing",
                {
                    "to": orjson.dumps([user.id]).decode(),
                    "op": "start",
                },
            )
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]["event"]
        event_recipient_emails = {
            user["email"]
            for user in event["recipients"]
        }
        event_user_ids = set(events[0]["users"])
        event_recipient_user_ids = {
            user["user_id"]
            for user in event["recipients"]
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event["sender"]["email"], email)
        self.assertEqual(event["type"], "typing")
        self.assertEqual(event["op"], "start")
Esempio n. 38
0
    def test_start_to_self(self) -> None:
        """
        Sending typing notification to yourself (using user IDs)
        is successful.
        """
        user = self.example_user('hamlet')
        email = user.email
        expected_recipient_emails = {email}
        expected_recipient_ids = {user.id}
        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            result = self.api_post(
                user,
                '/api/v1/typing',
                {
                    'to': ujson.dumps([user.id]),
                    'op': 'start',
                },
            )
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = {
            user['email']
            for user in event['recipients']
        }
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = {
            user['user_id']
            for user in event['recipients']
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['sender']['email'], email)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 39
0
    def test_single_recipient_by_user_id(self) -> None:
        """
        Sending typing notification to a single recipient (using user IDs)
        is successful
        """
        sender = self.example_user('hamlet')
        recipient_user = self.example_user('othello')
        expected_recipients = set([sender, recipient_user])
        expected_recipient_emails = set(
            [user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])

        params = dict(
            to=ujson.dumps([recipient_user.id]),
            op='start',
        )

        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)

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)
        self.assertEqual(len(queries), 8)

        event = events[0]['event']
        event_recipient_emails = set(user['email']
                                     for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id']
                                       for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 40
0
    def test_add_bot(self) -> None:
        self.login(self.example_email('hamlet'))
        self.assert_num_bots_equal(0)
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.create_bot()
        self.assert_num_bots_equal(1)

        email = '*****@*****.**'
        realm = get_realm('zulip')
        bot = get_user(email, realm)

        event = [e for e in events if e['event']['type'] == 'realm_bot'][0]
        self.assertEqual(
            dict(
                type='realm_bot',
                op='add',
                bot=dict(email='*****@*****.**',
                         user_id=bot.id,
                         bot_type=bot.bot_type,
                         full_name='The Bot of Hamlet',
                         is_active=True,
                         api_key=result['api_key'],
                         avatar_url=result['avatar_url'],
                         default_sending_stream=None,
                         default_events_register_stream=None,
                         default_all_public_streams=False,
                         owner=self.example_email('hamlet'))
            ),
            event['event']
        )

        users_result = self.client_get('/json/users')
        members = ujson.loads(users_result.content)['members']
        bots = [m for m in members if m['email'] == '*****@*****.**']
        self.assertEqual(len(bots), 1)
        bot = bots[0]
        self.assertEqual(bot['bot_owner'], self.example_email('hamlet'))
        self.assertEqual(bot['user_id'], get_user(email, realm).id)
Esempio n. 41
0
    def test_add_bot_with_default_sending_stream_private_allowed(self) -> None:
        self.login(self.example_email('hamlet'))
        user_profile = self.example_user('hamlet')
        stream = get_stream("Denmark", user_profile.realm)
        self.subscribe(user_profile, stream.name)
        do_change_stream_invite_only(stream, True)

        self.assert_num_bots_equal(0)
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.create_bot(default_sending_stream='Denmark')
        self.assert_num_bots_equal(1)
        self.assertEqual(result['default_sending_stream'], 'Denmark')

        email = '*****@*****.**'
        realm = get_realm('zulip')
        profile = get_user(email, realm)
        self.assertEqual(profile.default_sending_stream.name, 'Denmark')

        event = [e for e in events if e['event']['type'] == 'realm_bot'][0]
        self.assertEqual(
            dict(
                type='realm_bot',
                op='add',
                bot=dict(email='*****@*****.**',
                         user_id=profile.id,
                         full_name='The Bot of Hamlet',
                         bot_type=profile.bot_type,
                         is_active=True,
                         api_key=result['api_key'],
                         avatar_url=result['avatar_url'],
                         default_sending_stream='Denmark',
                         default_events_register_stream=None,
                         default_all_public_streams=False,
                         owner=self.example_email('hamlet'))
            ),
            event['event']
        )
        self.assertEqual(event['users'], {user_profile.id, })
Esempio n. 42
0
    def test_remove_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient
        pm_id = self.send_personal_message(pm_sender.email, pm_recipient.email)
        expected_recipient_ids = set([pm_sender.id, pm_recipient.id])
        reaction_info = {
            'emoji_name': 'hamburger',
            'emoji_code': '1f354',
            'reaction_type': 'unicode_emoji',
        }
        add = self.post_reaction(reaction_info, message_id=pm_id, sender=reaction_sender.short_name)
        self.assert_json_success(add)

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.delete_reaction(reaction_info,
                                          message_id=pm_id,
                                          sender=reaction_sender.short_name)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['user_id'], reaction_sender.id)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['user']['full_name'], reaction_sender.full_name)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'remove')
        self.assertEqual(event['message_id'], pm_id)
        self.assertEqual(event['emoji_name'], reaction_info['emoji_name'])
        self.assertEqual(event['emoji_code'], reaction_info['emoji_code'])
        self.assertEqual(event['reaction_type'], reaction_info['reaction_type'])
Esempio n. 43
0
    def test_stop_to_self(self) -> None:
        """
        Sending stopped typing notification to yourself
        is successful.
        """
        user = self.example_user('hamlet')
        email = user.email
        expected_recipient_emails = {email}
        expected_recipient_ids = {user.id}

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            params = dict(
                to=orjson.dumps([user.id]).decode(),
                op='stop',
            )
            result = self.api_post(user, '/api/v1/typing', params)

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = {
            user['email']
            for user in event['recipients']
        }
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = {
            user['user_id']
            for user in event['recipients']
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['sender']['email'], email)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'stop')
Esempio n. 44
0
    def test_stop_to_self(self) -> None:
        """
        Sending stopped typing notification to yourself
        is successful.
        """
        user = self.example_user("hamlet")
        email = user.email
        expected_recipient_emails = {email}
        expected_recipient_ids = {user.id}

        events: List[Mapping[str, Any]] = []
        with tornado_redirected_to_list(events):
            params = dict(
                to=orjson.dumps([user.id]).decode(),
                op="stop",
            )
            result = self.api_post(user, "/api/v1/typing", params)

        self.assert_json_success(result)
        self.assert_length(events, 1)

        event = events[0]["event"]
        event_recipient_emails = {
            user["email"]
            for user in event["recipients"]
        }
        event_user_ids = set(events[0]["users"])
        event_recipient_user_ids = {
            user["user_id"]
            for user in event["recipients"]
        }

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event["sender"]["email"], email)
        self.assertEqual(event["type"], "typing")
        self.assertEqual(event["op"], "stop")
Esempio n. 45
0
    def test_add_event(self) -> None:
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient
        pm_id = self.send_personal_message(pm_sender.email, pm_recipient.email)
        expected_recipient_ids = set([pm_sender.id, pm_recipient.id])
        reaction_info = {
            'emoji_name': 'hamburger',
            'emoji_code': '1f354',
            'reaction_type': 'unicode_emoji',
        }
        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.post_reaction(reaction_info,
                                        message_id=pm_id,
                                        sender=reaction_sender.short_name)
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['user_id'], reaction_sender.id)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['user']['full_name'], reaction_sender.full_name)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'add')
        self.assertEqual(event['message_id'], pm_id)
        self.assertEqual(event['emoji_name'], reaction_info['emoji_name'])
        self.assertEqual(event['emoji_code'], reaction_info['emoji_code'])
        self.assertEqual(event['reaction_type'],
                         reaction_info['reaction_type'])
Esempio n. 46
0
    def test_add_event(self):
        # type: () -> None
        """
        Recipients of the message receive the reaction event
        and event contains relevant data
        """
        pm_sender = self.example_user('hamlet')
        pm_recipient = self.example_user('othello')
        reaction_sender = pm_recipient

        result = self.client_post("/api/v1/messages", {
            "type": "private",
            "content": "Test message",
            "to": pm_recipient.email
        }, **self.api_auth(pm_sender.email))
        self.assert_json_success(result)
        pm_id = result.json()['id']

        expected_recipient_ids = set([pm_sender.id, pm_recipient.id])

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_put(
                '/api/v1/messages/%s/emoji_reactions/smile' % (pm_id, ),
                **self.api_auth(reaction_sender.email))
        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_user_ids = set(events[0]['users'])

        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['user']['email'], reaction_sender.email)
        self.assertEqual(event['type'], 'reaction')
        self.assertEqual(event['op'], 'add')
        self.assertEqual(event['emoji_name'], 'smile')
        self.assertEqual(event['message_id'], pm_id)
Esempio n. 47
0
    def test_single_recipient_by_user_id(self) -> None:
        """
        Sending typing notification to a single recipient (using user IDs)
        is successful
        """
        sender = self.example_user('hamlet')
        recipient_user = self.example_user('othello')
        expected_recipients = set([sender, recipient_user])
        expected_recipient_emails = set([user.email for user in expected_recipients])
        expected_recipient_ids = set([user.id for user in expected_recipients])

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.api_post(
                sender.email,
                '/api/v1/typing',
                {
                    'to': ujson.dumps([recipient_user.id]),
                    'op': 'start'
                }
            )

        self.assert_json_success(result)
        self.assertEqual(len(events), 1)

        event = events[0]['event']
        event_recipient_emails = set(user['email'] for user in event['recipients'])
        event_user_ids = set(events[0]['users'])
        event_recipient_user_ids = set(user['user_id'] for user in event['recipients'])

        self.assertEqual(expected_recipient_ids, event_recipient_user_ids)
        self.assertEqual(expected_recipient_ids, event_user_ids)
        self.assertEqual(event['sender']['email'], sender.email)
        self.assertEqual(event_recipient_emails, expected_recipient_emails)
        self.assertEqual(event['type'], 'typing')
        self.assertEqual(event['op'], 'start')
Esempio n. 48
0
    def test_admin_api(self) -> None:
        self.login(self.example_email("hamlet"))
        admin = self.example_user('hamlet')
        user = self.example_user('othello')
        realm = admin.realm
        do_change_is_admin(admin, True)

        # Make sure we see is_admin flag in /json/users
        result = self.client_get('/json/users')
        self.assert_json_success(result)
        members = result.json()['members']
        hamlet = find_dict(members, 'email', self.example_email("hamlet"))
        self.assertTrue(hamlet['is_admin'])
        othello = find_dict(members, 'email', self.example_email("othello"))
        self.assertFalse(othello['is_admin'])

        # Giveth
        req = dict(is_admin=ujson.dumps(True))

        events = []  # type: List[Mapping[str, Any]]
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(self.example_user("othello").id), req)
        self.assert_json_success(result)
        admin_users = realm.get_admin_users()
        self.assertTrue(user in admin_users)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], self.example_email("othello"))
        self.assertEqual(person['is_admin'], True)

        # Taketh away
        req = dict(is_admin=ujson.dumps(False))
        events = []
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(self.example_user("othello").id), req)
        self.assert_json_success(result)
        admin_users = realm.get_admin_users()
        self.assertFalse(user in admin_users)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], self.example_email("othello"))
        self.assertEqual(person['is_admin'], False)

        # Cannot take away from last admin
        self.login(self.example_email("iago"))
        req = dict(is_admin=ujson.dumps(False))
        events = []
        with tornado_redirected_to_list(events):
            result = self.client_patch('/json/users/{}'.format(self.example_user("hamlet").id), req)
        self.assert_json_success(result)
        admin_users = realm.get_admin_users()
        self.assertFalse(admin in admin_users)
        person = events[0]['event']['person']
        self.assertEqual(person['email'], self.example_email("hamlet"))
        self.assertEqual(person['is_admin'], False)
        with tornado_redirected_to_list([]):
            result = self.client_patch('/json/users/{}'.format(self.example_user("iago").id), req)
        self.assert_json_error(result, 'Cannot remove the only organization administrator')

        # Make sure only admins can patch other user's info.
        self.login(self.example_email("othello"))
        result = self.client_patch('/json/users/{}'.format(self.example_user("hamlet").id), req)
        self.assert_json_error(result, 'Insufficient permission')