Skip to content
Snippets Groups Projects
test_state.py 8.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • matrix.org's avatar
    matrix.org committed
    # -*- coding: utf-8 -*-
    
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    
    matrix.org's avatar
    matrix.org committed
    from twisted.internet import defer
    
    from synapse.state import StateHandler
    
    from mock import Mock
    
    
    matrix.org's avatar
    matrix.org committed
    class StateTestCase(unittest.TestCase):
        def setUp(self):
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.store = Mock(
                spec_set=[
                    "get_state_groups",
                ]
    
    Erik Johnston's avatar
    Erik Johnston committed
            hs = Mock(spec=["get_datastore"])
            hs.get_datastore.return_value = self.store
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.state = StateHandler(hs)
            self.event_id = 0
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_annotate_with_old_message(self):
            event = self.create_event(type="test_message", name="event")
    
    Erik Johnston's avatar
    Erik Johnston committed
            old_state = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
            ]
    
            yield self.state.annotate_event_with_state(event, old_state=old_state)
    
    Erik Johnston's avatar
    Erik Johnston committed
            for k, v in event.old_state_events.items():
                type, state_key = k
                self.assertEqual(type, v.type)
                self.assertEqual(state_key, v.state_key)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(set(old_state), set(event.old_state_events.values()))
            self.assertDictEqual(event.old_state_events, event.state_events)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertIsNone(event.state_group)
    
    matrix.org's avatar
    matrix.org committed
        @defer.inlineCallbacks
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_annotate_with_old_state(self):
            event = self.create_event(type="state", state_key="", name="event")
    
    Erik Johnston's avatar
    Erik Johnston committed
            old_state = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
            ]
    
            yield self.state.annotate_event_with_state(event, old_state=old_state)
    
    Erik Johnston's avatar
    Erik Johnston committed
            for k, v in event.old_state_events.items():
                type, state_key = k
                self.assertEqual(type, v.type)
                self.assertEqual(state_key, v.state_key)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set(old_state + [event]),
                set(event.old_state_events.values())
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertDictEqual(event.old_state_events, event.state_events)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertIsNone(event.state_group)
    
    matrix.org's avatar
    matrix.org committed
    
        @defer.inlineCallbacks
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_trivial_annotate_message(self):
            event = self.create_event(type="test_message", name="event")
            event.prev_events = []
    
            old_state = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
            ]
    
    Erik Johnston's avatar
    Erik Johnston committed
            group_name = "group_name_1"
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.store.get_state_groups.return_value = {
                group_name: old_state,
            }
    
            yield self.state.annotate_event_with_state(event)
    
    Erik Johnston's avatar
    Erik Johnston committed
            for k, v in event.old_state_events.items():
                type, state_key = k
                self.assertEqual(type, v.type)
                self.assertEqual(state_key, v.state_key)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set([e.event_id for e in old_state]),
                set([e.event_id for e in event.old_state_events.values()])
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertDictEqual(
                {
                    k: v.event_id
                    for k, v in event.old_state_events.items()
                },
                {
                    k: v.event_id
                    for k, v in event.state_events.items()
                }
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(group_name, event.state_group)
    
    matrix.org's avatar
    matrix.org committed
    
        @defer.inlineCallbacks
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_trivial_annotate_state(self):
            event = self.create_event(type="state", state_key="", name="event")
            event.prev_events = []
    
            old_state = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
            ]
    
    Erik Johnston's avatar
    Erik Johnston committed
            group_name = "group_name_1"
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.store.get_state_groups.return_value = {
                group_name: old_state,
            }
    
            yield self.state.annotate_event_with_state(event)
    
    Erik Johnston's avatar
    Erik Johnston committed
            for k, v in event.old_state_events.items():
                type, state_key = k
                self.assertEqual(type, v.type)
                self.assertEqual(state_key, v.state_key)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set([e.event_id for e in old_state]),
                set([e.event_id for e in event.old_state_events.values()])
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set([e.event_id for e in old_state] + [event.event_id]),
                set([e.event_id for e in event.state_events.values()])
    
    Erik Johnston's avatar
    Erik Johnston committed
            new_state = {
                k: v.event_id
                for k, v in event.state_events.items()
            }
            old_state = {
                k: v.event_id
                for k, v in event.old_state_events.items()
            }
            old_state[(event.type, event.state_key)] = event.event_id
            self.assertDictEqual(
                old_state,
                new_state
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertIsNone(event.state_group)
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_resolve_message_conflict(self):
            event = self.create_event(type="test_message", name="event")
            event.prev_events = []
    
            old_state_1 = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
    
    Erik Johnston's avatar
    Erik Johnston committed
            old_state_2 = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test3", state_key="2"),
                self.create_event(type="test4", state_key=""),
            ]
    
    Erik Johnston's avatar
    Erik Johnston committed
            group_name_1 = "group_name_1"
            group_name_2 = "group_name_2"
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.store.get_state_groups.return_value = {
                group_name_1: old_state_1,
                group_name_2: old_state_2,
            }
    
            yield self.state.annotate_event_with_state(event)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(len(event.old_state_events), 5)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set([e.event_id for e in event.state_events.values()]),
                set([e.event_id for e in event.old_state_events.values()])
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertIsNone(event.state_group)
    
    Erik Johnston's avatar
    Erik Johnston committed
        def test_resolve_state_conflict(self):
            event = self.create_event(type="test4", state_key="", name="event")
            event.prev_events = []
    
            old_state_1 = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test1", state_key="2"),
                self.create_event(type="test2", state_key=""),
    
    Erik Johnston's avatar
    Erik Johnston committed
            old_state_2 = [
                self.create_event(type="test1", state_key="1"),
                self.create_event(type="test3", state_key="2"),
                self.create_event(type="test4", state_key=""),
            ]
    
    Erik Johnston's avatar
    Erik Johnston committed
            group_name_1 = "group_name_1"
            group_name_2 = "group_name_2"
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.store.get_state_groups.return_value = {
                group_name_1: old_state_1,
                group_name_2: old_state_2,
            }
    
            yield self.state.annotate_event_with_state(event)
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(len(event.old_state_events), 5)
    
    Erik Johnston's avatar
    Erik Johnston committed
            expected_new = event.old_state_events
            expected_new[(event.type, event.state_key)] = event
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertEqual(
                set([e.event_id for e in expected_new.values()]),
                set([e.event_id for e in event.state_events.values()]),
    
    Erik Johnston's avatar
    Erik Johnston committed
            self.assertIsNone(event.state_group)
    
    Erik Johnston's avatar
    Erik Johnston committed
        def create_event(self, name=None, type=None, state_key=None):
            self.event_id += 1
            event_id = str(self.event_id)
    
    Erik Johnston's avatar
    Erik Johnston committed
            if not name:
                if state_key is not None:
                    name = "<%s-%s>" % (type, state_key)
                else:
                    name = "<%s>" % (type, )
    
    Erik Johnston's avatar
    Erik Johnston committed
            event = Mock(name=name, spec=[])
            event.type = type
    
    Erik Johnston's avatar
    Erik Johnston committed
            if state_key is not None:
                event.state_key = state_key
            event.event_id = event_id
    
    Erik Johnston's avatar
    Erik Johnston committed
            event.user_id = "@user_id:example.com"
            event.room_id = "!room_id:example.com"
    
    Erik Johnston's avatar
    Erik Johnston committed
            return event