def test_unknown_diff_on(self):
        left = AggregatedList()
        right = AggregatedList()

        runner = AggregatedDiffRunner(left.diff(right))

        with pytest.raises(Exception):
            runner.register("qwerty", lambda p, i: True, lambda p: True)
    def test_diff_delete(self):
        left = AggregatedList()
        right = AggregatedList()

        left.add({'a': 1}, ["qwerty"])

        diff = left.diff(right)

        assert diff['insert'] == []
        assert diff['update-insert'] == []
        assert diff['update-delete'] == []

        assert diff['delete'] == [{'params': {'a': 1}, 'items': ['qwerty']}]
    def test_run_cond_false(self):
        left = AggregatedList()
        right = AggregatedList()

        right.add({'on': 'insert'}, ["qwerty"])

        runner = AggregatedDiffRunner(left.diff(right))

        recorder = []
        runner.register("insert", lambda p, i: recorder.append('True'),
                        lambda p: False)

        runner.run()

        assert recorder == []
    def test_diff_update_insert(self):
        left = AggregatedList()
        right = AggregatedList()

        left.add({'a': 1}, ["qwerty1"])
        right.add({'a': 1}, ["qwerty1", "qwerty2"])

        diff = left.diff(right)

        assert diff['insert'] == []
        assert diff['delete'] == []
        assert diff['update-delete'] == []

        assert diff['update-insert'] == [{
            'items': ['qwerty2'],
            'params': {
                'a': 1
            }
        }]
    def test_run(self):
        left = AggregatedList()
        right = AggregatedList()

        # test insert
        right.add({'on': 'insert'}, ["i"])

        # test delete
        left.add({'on': 'delete'}, ["d"])

        # test update-insert
        left.add({'on': 'update-insert'}, ["ui1"])
        right.add({'on': 'update-insert'}, ["ui1", "ui2"])

        # test update-delete
        left.add({'on': 'update-delete'}, ["ud1", "ud2"])
        right.add({'on': 'update-delete'}, ["ud1"])

        on_insert = []
        on_delete = []
        on_update_insert = []
        on_update_delete = []

        def recorder(l):
            return lambda p, i: l.append([p, i])

        runner = AggregatedDiffRunner(left.diff(right))

        runner.register("insert", recorder(on_insert))
        runner.register("delete", recorder(on_delete))
        runner.register("update-insert", recorder(on_update_insert))
        runner.register("update-delete", recorder(on_update_delete))

        runner.run()

        assert on_insert == [[{'on': 'insert'}, ['i']]]
        assert on_delete == [[{'on': 'delete'}, ['d']]]
        assert on_update_insert == [[{'on': 'update-insert'}, ['ui2']]]
        assert on_update_delete == [[{'on': 'update-delete'}, ['ud2']]]