コード例 #1
0
def test_create_message():
    addstuff()
    session = Session()
    message = PullMessage()
    version = session.query(models.Version).first()
    message.add_version(version)
    assert message.to_json() == PullMessage(message.to_json()).to_json()
コード例 #2
0
def test_encode_message():
    addstuff()
    session = Session()
    message = PullMessage()
    version = session.query(models.Version).first()
    message.add_version(version)
    assert message.to_json() == json.loads(json.dumps(message.to_json()))
コード例 #3
0
def test_encode_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.add_unversioned_operations()
    message.set_node(session.query(models.Node).first())
    assert message.to_json() == json.loads(json.dumps(message.to_json()))
コード例 #4
0
def test_compression_consistency():
    addstuff()
    changestuff()
    session = Session()
    ops = session.query(models.Operation).all()
    compress()
    news = session.query(models.Operation).order_by(models.Operation.order).all()
    assert news == compressed_operations(ops)
コード例 #5
0
ファイル: test_detail.py プロジェクト: Wilo/pyramid-views
 def test_detail_by_custom_pk(self):
     self.author()
     view = views.AuthorDetail.as_view(pk_url_kwarg='foo')
     res = view(DummyRequest(), foo=1)
     self.assertEqual(res.status_code, 200)
     self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==1).one())
     self.assertEqual(res.context['author'], Session.query(Author).filter(Author.id==1).one())
     self.assertTemplateUsed(res, 'tests:templates/author_detail.html')
コード例 #6
0
def test_create_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.add_unversioned_operations()
    message.set_node(session.query(models.Node).first())
    assert message.to_json() == PushMessage(message.to_json()).to_json()
コード例 #7
0
def test_encode_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.add_unversioned_operations()
    message.set_node(session.query(models.Node).first())
    assert message.to_json() == json.loads(json.dumps(message.to_json()))
コード例 #8
0
def test_encode_message():
    addstuff()
    session = Session()
    message = PullMessage()
    version = session.query(models.Version).first()
    message.add_version(version)
    msg_json = json.dumps(message.to_json(), cls=SyncdbJSONEncoder)
    assert message.to_json() == json.loads(msg_json)
コード例 #9
0
ファイル: test_detail.py プロジェクト: Wilo/pyramid-views
 def test_template_name_field(self):
     self.page()
     view = views.PageDetail.as_view()
     res = view(DummyRequest(), pk=1)
     self.assertEqual(res.status_code, 200)
     self.assertEqual(res.context['object'], Session.query(Page).filter(Page.id==1).one())
     self.assertEqual(res.context['page'], Session.query(Page).filter(Page.id==1).one())
     self.assertTemplateUsed(res, 'tests:templates/page_template.html')
コード例 #10
0
def test_create_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.add_unversioned_operations()
    message.set_node(session.query(models.Node).first())
    assert message.to_json() == PushMessage(message.to_json()).to_json()
コード例 #11
0
ファイル: test_detail.py プロジェクト: Wilo/pyramid-views
 def test_template_name_suffix(self):
     self.author()
     view = views.AuthorDetail.as_view(template_name_suffix='_view')
     res = view(DummyRequest(), pk=1)
     self.assertEqual(res.status_code, 200)
     self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==1).one())
     self.assertEqual(res.context['author'], Session.query(Author).filter(Author.id==1).one())
     self.assertTemplateUsed(res, 'tests:templates/author_view.html')
コード例 #12
0
def addstuff():
    a1 = A(name="first a")
    a2 = A(name="second a")
    b1 = B(name="first b", a=a1)
    b2 = B(name="second b", a=a1)
    b3 = B(name="third b", a=a2)
    session = Session()
    session.add_all([a1, a2, b1, b2, b3])
    session.commit()
コード例 #13
0
ファイル: test_detail.py プロジェクト: Wilo/pyramid-views
 def test_context_object_name(self):
     self.author()
     view = views.AuthorDetail.as_view(context_object_name='thingy')
     res = view(DummyRequest(), pk=1)
     self.assertEqual(res.status_code, 200)
     self.assertEqual(res.context['object'], Session.query(Author).filter(Author.id==1).one())
     self.assertEqual(res.context['thingy'], Session.query(Author).filter(Author.id==1).one())
     self.assertFalse('author' in res.context)
     self.assertTemplateUsed(res, 'tests:templates/author_detail.html')
コード例 #14
0
ファイル: test_detail.py プロジェクト: Wilo/pyramid-views
 def test_detail_by_custom_slug(self):
     self.author()
     self.author(name='Scott Rosenberg', slug='scott-rosenberg')
     view = views.AuthorDetail.as_view(slug_url_kwarg='foo')
     res = view(DummyRequest(), foo='scott-rosenberg')
     self.assertEqual(res.status_code, 200)
     self.assertEqual(res.context['object'], Session.query(Author).filter(Author.slug=='scott-rosenberg').one())
     self.assertEqual(res.context['author'], Session.query(Author).filter(Author.slug=='scott-rosenberg').one())
     self.assertTemplateUsed(res, 'tests:templates/author_detail.html')
コード例 #15
0
def test_message_does_not_contaminate_database():
    addstuff()
    session = Session()
    message = PullMessage()
    version = session.query(models.Version).first()
    message.add_version(version)
    # test that the are no unversioned operations
    assert not session.query(models.Operation).\
        filter(models.Operation.version_id == None).all()
コード例 #16
0
ファイル: track_tests.py プロジェクト: zworkb/python-sync-db
def test_compression_consistency():
    addstuff()
    changestuff()
    session = Session()
    ops = session.query(models.Operation).all()
    compress()
    news = session.query(models.Operation).order_by(
        models.Operation.order).all()
    assert news == compressed_operations(ops)
コード例 #17
0
def test_sign_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.set_node(session.query(models.Node).first())
    message.add_unversioned_operations()
    assert message.islegit(session)
    message.key += "broken"
    assert not message.islegit(session)
コード例 #18
0
def test_sign_message():
    addstuff()
    changestuff()
    session = Session()
    message = PushMessage()
    message.set_node(session.query(models.Node).first())
    message.add_unversioned_operations()
    assert message.islegit(session)
    message.key += "broken"
    assert not message.islegit(session)
コード例 #19
0
def test_compression_correctness():
    addstuff()
    changestuff()
    session = Session()
    ops = compressed_operations(session.query(models.Operation).all())
    groups = group_by(lambda op: (op.content_type_id, op.row_id), ops)
    for g in groups.itervalues():
        logging.info(g)
        assert len(g) == 1
    # assert correctness when compressing operations from a pull
    # message
    pull_ops = [
        models.Operation(command='i', content_type_id=1, row_id=1, order=1),
        models.Operation(command='d', content_type_id=1, row_id=1, order=2),
        models.Operation(command='i', content_type_id=1, row_id=1, order=3),
        models.Operation(command='u', content_type_id=1, row_id=1, order=4),
        # result of above should be a single 'i'
        models.Operation(command='u', content_type_id=2, row_id=1, order=5),
        models.Operation(command='d', content_type_id=2, row_id=1, order=6),
        models.Operation(command='i', content_type_id=2, row_id=1, order=7),
        models.Operation(command='d', content_type_id=2, row_id=1, order=8),
        # result of above should be a single 'd'
        models.Operation(command='d', content_type_id=3, row_id=1, order=9),
        models.Operation(command='i', content_type_id=3, row_id=1, order=10),
        # result of above should be an 'u'
        models.Operation(command='i', content_type_id=4, row_id=1, order=11),
        models.Operation(command='u', content_type_id=4, row_id=1, order=12),
        models.Operation(command='d', content_type_id=4, row_id=1, order=13),
        # result of above should be no operations
        models.Operation(command='d', content_type_id=5, row_id=1, order=14),
        models.Operation(command='i', content_type_id=5, row_id=1, order=15),
        models.Operation(command='d', content_type_id=5, row_id=1, order=16),
        # result of above should be a single 'd'
        models.Operation(command='u', content_type_id=6, row_id=1, order=17),
        models.Operation(command='d', content_type_id=6, row_id=1, order=18),
        models.Operation(command='i', content_type_id=6, row_id=1, order=19),
        # result of above should be an 'u'
        models.Operation(command='d', content_type_id=7, row_id=1, order=20),
        models.Operation(command='i', content_type_id=7, row_id=1, order=21),
        models.Operation(command='u', content_type_id=7, row_id=1, order=22)
        # result of above should be an 'u'
        ]
    compressed = compressed_operations(pull_ops)
    logging.info("len(compressed) == {0}".format(len(compressed)))
    logging.info("\n".join(repr(op) for op in compressed))
    assert len(compressed) == 6
    assert compressed[0].command == 'i'
    assert compressed[1].command == 'd'
    assert compressed[2].command == 'u'
    assert compressed[3].command == 'd'
    assert compressed[4].command == 'u'
    assert compressed[5].command == 'u'
コード例 #20
0
ファイル: track_tests.py プロジェクト: zworkb/python-sync-db
def test_compression_correctness():
    addstuff()
    changestuff()
    session = Session()
    ops = compressed_operations(session.query(models.Operation).all())
    groups = group_by(lambda op: (op.content_type_id, op.row_id), ops)
    for g in groups.values():
        logging.info(g)
        assert len(g) == 1
    # assert correctness when compressing operations from a pull
    # message
    pull_ops = [
        models.Operation(command='i', content_type_id=1, row_id=1, order=1),
        models.Operation(command='d', content_type_id=1, row_id=1, order=2),
        models.Operation(command='i', content_type_id=1, row_id=1, order=3),
        models.Operation(command='u', content_type_id=1, row_id=1, order=4),
        # result of above should be a single 'i'
        models.Operation(command='u', content_type_id=2, row_id=1, order=5),
        models.Operation(command='d', content_type_id=2, row_id=1, order=6),
        models.Operation(command='i', content_type_id=2, row_id=1, order=7),
        models.Operation(command='d', content_type_id=2, row_id=1, order=8),
        # result of above should be a single 'd'
        models.Operation(command='d', content_type_id=3, row_id=1, order=9),
        models.Operation(command='i', content_type_id=3, row_id=1, order=10),
        # result of above should be an 'u'
        models.Operation(command='i', content_type_id=4, row_id=1, order=11),
        models.Operation(command='u', content_type_id=4, row_id=1, order=12),
        models.Operation(command='d', content_type_id=4, row_id=1, order=13),
        # result of above should be no operations
        models.Operation(command='d', content_type_id=5, row_id=1, order=14),
        models.Operation(command='i', content_type_id=5, row_id=1, order=15),
        models.Operation(command='d', content_type_id=5, row_id=1, order=16),
        # result of above should be a single 'd'
        models.Operation(command='u', content_type_id=6, row_id=1, order=17),
        models.Operation(command='d', content_type_id=6, row_id=1, order=18),
        models.Operation(command='i', content_type_id=6, row_id=1, order=19),
        # result of above should be an 'u'
        models.Operation(command='d', content_type_id=7, row_id=1, order=20),
        models.Operation(command='i', content_type_id=7, row_id=1, order=21),
        models.Operation(command='u', content_type_id=7, row_id=1, order=22)
        # result of above should be an 'u'
    ]
    compressed = compressed_operations(pull_ops)
    logging.info("len(compressed) == {0}".format(len(compressed)))
    logging.info("\n".join(repr(op) for op in compressed))
    assert len(compressed) == 6
    assert compressed[0].command == 'i'
    assert compressed[1].command == 'd'
    assert compressed[2].command == 'u'
    assert compressed[3].command == 'd'
    assert compressed[4].command == 'u'
    assert compressed[5].command == 'u'
コード例 #21
0
def test_tracking():
    addstuff()
    changestuff()
    session = Session()
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'i').\
        count() == 5, "insert operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'u').\
        count() == 2, "update operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'd').\
        count() == 1, "delete operations don't match"
コード例 #22
0
ファイル: track_tests.py プロジェクト: zworkb/python-sync-db
def test_tracking():
    addstuff()
    changestuff()
    session = Session()
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'i').\
        count() == 5, "insert operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'u').\
        count() == 2, "update operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'd').\
        count() == 1, "delete operations don't match"
コード例 #23
0
def test_compression():
    addstuff()
    changestuff()
    compress() # remove unnecesary operations
    session = Session()
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'i').\
        count() == 4, "insert operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'u').\
        count() == 0, "update operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'd').\
        count() == 0, "delete operations don't match"
コード例 #24
0
ファイル: track_tests.py プロジェクト: zworkb/python-sync-db
def test_compression():
    addstuff()
    changestuff()
    compress()  # remove unnecesary operations
    session = Session()
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'i').\
        count() == 4, "insert operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'u').\
        count() == 0, "update operations don't match"
    assert session.query(models.Operation).\
        filter(models.Operation.command == 'd').\
        count() == 0, "delete operations don't match"
コード例 #25
0
def changestuff():
    session = Session()
    a1, a2 = session.query(A)
    b1, b2, b3 = session.query(B)
    a1.name = "first a modified"
    b2.a = a2
    session.delete(b3)
    session.commit()
コード例 #26
0
def test_find_direct_conflicts():
    addstuff()
    changestuff()
    session = Session()
    message_ops = create_fake_operations()
    conflicts = find_direct_conflicts(
        message_ops, session.query(models.Operation).all())
    expected = [
        (message_ops[0],
         models.Operation(row_id=3, content_type_id=ct_b_id, command='d')), # b3
        (message_ops[1],
         models.Operation(row_id=1, content_type_id=ct_a_id, command='u'))] # a1
    logging.info(conflicts)
    logging.info(expected)
    assert repr(conflicts) == repr(expected)
コード例 #27
0
def test_find_direct_conflicts():
    addstuff()
    changestuff()
    session = Session()
    message_ops = create_fake_operations()
    conflicts = find_direct_conflicts(message_ops,
                                      session.query(models.Operation).all())
    expected = [
        (message_ops[0],
         models.Operation(row_id=3, content_type_id=ct_b_id,
                          command='d')),  # b3
        (message_ops[1],
         models.Operation(row_id=1, content_type_id=ct_a_id, command='u'))
    ]  # a1
    logging.info(conflicts)
    logging.info(expected)
    assert repr(conflicts) == repr(expected)
コード例 #28
0
def teardown():
    session = Session()
    map(session.delete, session.query(A))
    map(session.delete, session.query(B))
    map(session.delete, session.query(models.Operation))
    map(session.delete, session.query(models.Version))
    session.commit()
コード例 #29
0
def test_message_query():
    addstuff()
    session = Session()
    message = PullMessage()
    version = session.query(models.Version).first()
    message.add_version(version)
    # test equal representation, because the test models are well printed
    for b in session.query(B):
        assert repr(b) == repr(message.query(B).filter(
                attr('id') == b.id).all()[0])
    for op in session.query(models.Operation):
        assert repr(op) == repr(message.query(models.Operation).filter(
                attr('order') == op.order).all()[0])
    try:
        message.query(1)
        raise Exception("Message query did not fail")
    except TypeError:
        pass
コード例 #30
0
def changestuff():
    session = Session()
    a1, a2 = session.query(A)
    b1, b2, b3 = session.query(B)
    a1.name = "first a modified"
    b2.a = a2
    session.delete(b3)
    session.commit()
コード例 #31
0
def test_find_dependency_conflicts():
    addstuff()
    changestuff()
    session = Session()
    message_ops = create_fake_operations()
    conflicts = find_dependency_conflicts(
        message_ops,
        session.query(models.Operation).all(),
        session)
    expected = [
        (message_ops[1], # a1
         models.Operation(row_id=1, content_type_id=ct_b_id, command='i')), # b1
        (message_ops[2], # a2
         models.Operation(row_id=2, content_type_id=ct_b_id, command='i')), # b2
        (message_ops[2], # a2
         models.Operation(row_id=2, content_type_id=ct_b_id, command='u'))] # b2
    logging.info(conflicts)
    logging.info(expected)
    assert repr(conflicts) == repr(expected)
コード例 #32
0
def addstuff():
    a1 = A(name="first a")
    a2 = A(name="second a")
    b1 = B(name="first b", a=a1)
    b2 = B(name="second b", a=a1)
    b3 = B(name="third b", a=a2)
    session = Session()
    session.add_all([a1, a2, b1, b2, b3])
    session.commit()
コード例 #33
0
def test_find_dependency_conflicts():
    addstuff()
    changestuff()
    session = Session()
    message_ops = create_fake_operations()
    conflicts = find_dependency_conflicts(
        message_ops,
        session.query(models.Operation).all(), session)
    expected = [
        (
            message_ops[1],  # a1
            models.Operation(row_id=1, content_type_id=ct_b_id,
                             command='i')),  # b1
        (
            message_ops[2],  # a2
            models.Operation(row_id=2, content_type_id=ct_b_id,
                             command='i')),  # b2
        (
            message_ops[2],  # a2
            models.Operation(row_id=2, content_type_id=ct_b_id, command='u'))
    ]  # b2
    logging.info(conflicts)
    logging.info(expected)
    assert repr(conflicts) == repr(expected)
コード例 #34
0
def teardown():
    session = Session()
    As = session.query(A).all()
    Bs = session.query(B).all()
    Ops = session.query(models.Operation).all()

    for a in As:
        session.delete(a)
    # map(session.delete, As)  # for some reason mapping session.delete does not execute
    for b in Bs:
        session.delete(b)
    # map(session.delete, Bs)  # for some reason mapping session.delete does not execute
    for op in Ops:
        session.delete(op)
    # map(session.delete, Ops)  # for some reason mapping session.delete does not execute

    session.commit()
コード例 #35
0
def teardown():
    session = Session()
    # map(session.delete, session.query(A))

    for a in session.query(A).all():
        session.delete(a)
    for b in session.query(B).all():
        session.delete(b)
    for op in session.query(models.Operation).all():
        session.delete(op)
    for ver in session.query(models.Version).all():
        session.delete(ver)

    session.commit()
コード例 #36
0
def addstuff():
    a1 = A(name="first a")
    a2 = A(name="second a")
    b1 = B(name="first b", a=a1)
    b2 = B(name="second b", a=a1)
    b3 = B(name="third b", a=a2)
    session = Session()
    session.add_all([a1, a2, b1, b2, b3])
    version = models.Version()
    version.created = datetime.datetime.now()
    session.add(version)
    session.flush()
    version_id = version.version_id
    session.commit()
    session = Session()
    for op in session.query(models.Operation):
        op.version_id = version_id
    session.commit()
コード例 #37
0
def teardown():
    session = Session()
    for a in session.query(A).all():
        session.delete(a)
    for b in session.query(B).all():
        session.delete(b)
    for op in session.query(models.Operation).all():
        session.delete(op)
    session.commit()