Example #1
0
def test_save_update_fields_no_cqrs_fields_global_flag_changed(
        mocker, settings):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    instance = models.SimplestModel.objects.create(id=1)
    previous_cqrs_updated = instance.cqrs_updated
    publisher_mock.reset_mock()

    sleep(0.1)

    settings.CQRS = {
        'transport': 'tests.dj.transport.TransportStub',
        'master': {
            'CQRS_AUTO_UPDATE_FIELDS': True,
        },
    }
    instance.name = 'New'
    instance.save(update_fields=['name'])

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'name': 'New',
            'cqrs_revision': 1
        },
        1,
    )

    assert instance.cqrs_updated > previous_cqrs_updated

    instance.refresh_from_db()
    assert instance.name == 'New'
Example #2
0
def test_save_update_fields_with_cqrs_fields(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    instance = models.SimplestModel.objects.create(id=1, name='Old')
    previous_cqrs_updated = instance.cqrs_updated
    publisher_mock.reset_mock()

    sleep(0.1)

    instance.name = 'New'
    instance.cqrs_revision = F('cqrs_revision') + 1
    instance.save(update_fields=['name', 'cqrs_revision', 'cqrs_updated'],
                  update_cqrs_fields=False)

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'name': 'New',
            'cqrs_revision': 1
        },
        1,
    )

    assert instance.cqrs_updated > previous_cqrs_updated

    instance.refresh_from_db()
    assert instance.name == 'New'
Example #3
0
def test_cqrs_sync_optimized_for_class_serialization(
        mocker, django_assert_num_queries):
    models.Author.objects.create(
        id=5,
        name='hi',
        publisher=models.Publisher.objects.create(id=1, name='pub'),
    )
    m = models.Author.relate_cqrs_serialization(
        models.Author.objects.all()).first()

    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    with django_assert_num_queries(0):
        assert m.cqrs_sync()

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SYNC,
        models.Author.CQRS_ID,
        {
            'id': 5,
            'name': 'hi',
            'publisher': {
                'id': 1,
                'name': 'pub'
            }
        },
        5,
    )
Example #4
0
def test_transaction_rollbacked_to_savepoint(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')

    with transaction.atomic():
        models.BasicFieldsModel.objects.create(
            int_field=1,
            char_field='str',
        )

        try:
            with transaction.atomic(savepoint=True):
                raise ValueError
        except ValueError:
            pass

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.BasicFieldsModel.CQRS_ID,
        {
            'char_field': 'str',
            'int_field': 1
        },
        1,
    )
Example #5
0
def test_post_bulk_update(mocker):
    for i in range(3):
        models.SimplestModel.objects.create(id=i)
    cqrs_updated = models.SimplestModel.objects.get(id=1).cqrs_updated

    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    models.SimplestModel.cqrs.bulk_update(
        queryset=models.SimplestModel.objects.filter(id__in={1}),
        name='new',
    )

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'name': 'new'
        },
        1,
    )

    m = models.SimplestModel.objects.get(id=1)
    assert m.cqrs_updated > cqrs_updated
    assert m.cqrs_revision == 1
Example #6
0
def test_post_save_create(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    models.SimplestModel.objects.create(id=1)

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'name': None
        },
        1,
    )
Example #7
0
def test_serialization_no_related_instance(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    models.Author.objects.create(id=1, name='author', publisher=None)

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.Author.CQRS_ID,
        {
            'id': 1,
            'name': 'author',
            'publisher': None,
            'books': [],
            'cqrs_revision': 0,
        },
        1,
    )
Example #8
0
def test_post_save_update(mocker):
    m = models.SimplestModel.objects.create(id=1)

    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    m.name = 'new'
    m.save(update_fields=['name'])

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'name': 'new'
        },
        1,
    )
Example #9
0
def test_cqrs_sync_not_saved(mocker):
    m = models.ChosenFieldsModel.objects.create(char_field='old')
    m.name = 'new'

    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')

    assert m.cqrs_sync()

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SYNC,
        models.ChosenFieldsModel.CQRS_ID,
        {
            'char_field': 'old',
            'id': m.pk
        },
        m.pk,
    )
Example #10
0
def test_transaction_commited(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')

    with transaction.atomic():
        models.BasicFieldsModel.objects.create(
            int_field=1,
            char_field='str',
        )

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.BasicFieldsModel.CQRS_ID,
        {
            'char_field': 'str',
            'int_field': 1
        },
        1,
    )
Example #11
0
def test_save_serialization(mocker, django_assert_num_queries):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')

    # 0 - Transaction start
    # 1 - Publisher
    # 2 - Author
    # 3-4 - Books
    # 5-6 - Serialization with prefetch_related
    query_counter = 7
    with django_assert_num_queries(query_counter):
        with transaction.atomic():
            publisher = models.Publisher.objects.create(id=1, name='publisher')
            author = models.Author.objects.create(id=1,
                                                  name='author',
                                                  publisher=publisher)
            for index in range(1, 3):
                models.Book.objects.create(id=index,
                                           title=str(index),
                                           author=author)

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.Author.CQRS_ID,
        {
            'id': 1,
            'name': 'author',
            'publisher': {
                'id': 1,
                'name': 'publisher',
            },
            'books': [{
                'id': 1,
                'name': '1',
            }, {
                'id': 2,
                'name': '2',
            }],
            'cqrs_revision': 0,
        },
        1,
    )
Example #12
0
def test_post_save_delete(mocker):
    m = models.SimplestModel.objects.create(id=1)

    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
    m.delete()

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.DELETE,
        models.SimplestModel.CQRS_ID,
        {
            'id': 1,
            'cqrs_revision': 1
        },
        1,
    )

    cqrs_updated = publisher_mock.call_args[0][0].to_dict(
    )['instance_data']['cqrs_updated']
    assert isinstance(cqrs_updated, str)
Example #13
0
def test_is_sync_instance(mocker):
    publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')

    out_instance = models.FilteredSimplestModel.objects.create(name='a')
    in_instance = models.FilteredSimplestModel.objects.create(name='title')

    instances = (out_instance, in_instance)
    for instance in instances:
        assert instance.cqrs_revision == 0

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.FilteredSimplestModel.CQRS_ID,
        {
            'name': 'title',
            'id': in_instance.pk
        },
        in_instance.pk,
    )
    publisher_mock.reset_mock()

    in_instance.name = 'longer title'
    for instance in instances:
        instance.save()
        instance.refresh_from_db()

        assert instance.cqrs_revision == 1

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.FilteredSimplestModel.CQRS_ID,
        {
            'name': 'longer title',
            'id': in_instance.pk
        },
        in_instance.pk,
    )
    publisher_mock.reset_mock()

    out_instance.name = 'long'
    in_instance.name = 's'
    for instance in instances:
        instance.save()
        instance.refresh_from_db()

        assert instance.cqrs_revision == 2

    assert_publisher_once_called_with_args(
        publisher_mock,
        SignalType.SAVE,
        models.FilteredSimplestModel.CQRS_ID,
        {
            'name': 'long',
            'id': out_instance.pk
        },
        out_instance.pk,
    )

    publisher_mock.reset_mock()
    in_instance.delete()
    assert publisher_mock.call_count == 0

    out_instance.delete()
    assert publisher_mock.call_count == 1