Skip to content
Snippets Groups Projects
test_state.py 7.15 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
                ]
    
    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=""),
            ]
    
            context = yield self.state.compute_event_context(
                event, old_state=old_state
    
            for k, v in context.current_state.items():
    
    Erik Johnston's avatar
    Erik Johnston committed
                type, state_key = k
                self.assertEqual(type, v.type)
                self.assertEqual(state_key, v.state_key)
    
            self.assertEqual(
                set(old_state), set(context.current_state.values())
            )
    
            self.assertIsNone(context.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=""),
            ]
    
            context = yield self.state.compute_event_context(
                event, old_state=old_state
    
            for k, v in context.current_state.items():
    
    Erik Johnston's avatar
    Erik Johnston committed
                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(context.current_state.values())
    
            self.assertIsNone(context.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,
            }
    
            context = yield self.state.compute_event_context(event)
    
            for k, v in context.current_state.items():
    
    Erik Johnston's avatar
    Erik Johnston committed
                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 context.current_state.values()])
    
            self.assertEqual(group_name, context.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,
            }
    
            context = yield self.state.compute_event_context(event)
    
            for k, v in context.current_state.items():
    
    Erik Johnston's avatar
    Erik Johnston committed
                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 context.current_state.values()])
    
            self.assertIsNone(context.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,
            }
    
            context = yield self.state.compute_event_context(event)
    
            self.assertEqual(len(context.current_state), 5)
    
            self.assertIsNone(context.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,
            }
    
            context = yield self.state.compute_event_context(event)
    
            self.assertEqual(len(context.current_state), 5)
    
            self.assertIsNone(context.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
    
            event.is_state = lambda: (state_key is not None)
            event.unsigned = {}
    
    
    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