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'
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'
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, )
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, )
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
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, )
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, )
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, )
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, )
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, )
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, )
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)
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