123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- # Copyright © 2023 Ingram Micro Inc. All rights reserved.
- import pytest
- import ujson
- from django.core.management import CommandError, call_command
- from django.db import transaction
- from tests.dj_master.models import Author, Publisher
- from tests.test_commands.utils import remove_file
- from tests.utils import db_error
- COMMAND_NAME = 'cqrs_bulk_dump'
- def test_no_cqrs_id():
- with pytest.raises(CommandError):
- call_command(COMMAND_NAME)
- def test_bad_cqrs_id():
- with pytest.raises(CommandError) as e:
- call_command(COMMAND_NAME, '--cqrs-id=invalid')
- assert 'Wrong CQRS ID: invalid!' in str(e)
- def test_output_file_exists():
- with pytest.raises(CommandError) as e:
- call_command(COMMAND_NAME, '--cqrs-id=author', '-o=pyproject.toml')
- assert 'File pyproject.toml exists!' in str(e)
- @pytest.mark.django_db
- def test_dumps_no_rows(capsys):
- remove_file('author.dump')
- call_command(COMMAND_NAME, '--cqrs-id=author')
- with open('author.dump', 'r') as f:
- lines = f.readlines()
- assert len(lines) == 1
- assert lines[0] == 'author'
- captured = capsys.readouterr()
- assert 'Done!\n0 instance(s) saved.\n0 instance(s) processed.' in captured.err
- @pytest.mark.django_db
- def tests_dumps_several_rows(capsys):
- remove_file('author.dump')
- Author.objects.create(id=2, name='2')
- with transaction.atomic():
- publisher = Publisher.objects.create(id=1, name='publisher')
- author = Author.objects.create(id=1, name='1', publisher=publisher)
- call_command(COMMAND_NAME, '--cqrs-id=author')
- with open('author.dump', 'r') as f:
- lines = f.readlines()
- assert len(lines) == 3
- assert lines[0].strip() == 'author'
- line_with_publisher = next(ln for ln in lines[1:] if '"name":"publisher"' in ln)
- assert author.to_cqrs_dict() == ujson.loads(line_with_publisher)
- captured = capsys.readouterr()
- assert 'Done!\n2 instance(s) saved.\n2 instance(s) processed.' in captured.err
- @pytest.mark.django_db
- def tests_dumps_more_than_batch(capsys):
- remove_file('author.dump')
- Author.objects.bulk_create(
- (Author(id=index, name='n') for index in range(1, 150)),
- )
- call_command(COMMAND_NAME, '--cqrs-id=author')
- with open('author.dump', 'r') as f:
- lines = f.readlines()
- assert len(lines) == 150
- captured = capsys.readouterr()
- assert 'Done!\n149 instance(s) saved.\n149 instance(s) processed.' in captured.err
- @pytest.mark.django_db
- def test_error(capsys, mocker):
- remove_file('author.dump')
- Author.objects.create(id=2, name='2')
- mocker.patch('tests.dj_master.models.Author.to_cqrs_dict', side_effect=db_error)
- call_command(COMMAND_NAME, '--cqrs-id=author')
- captured = capsys.readouterr()
- assert 'Dump record failed for pk=2' in captured.err
- assert '1 instance(s) processed.' in captured.err
- assert '0 instance(s) saved.' in captured.err
- @pytest.mark.django_db
- def test_progress(capsys):
- remove_file('author.dump')
- Author.objects.create(id=2, name='2')
- call_command(COMMAND_NAME, '--cqrs-id=author', '--progress')
- captured = capsys.readouterr()
- assert 'Processing 1 records with batch size 10000' in captured.err
- assert '1 of 1 processed - 100% with rate' in captured.err
|