diff --git a/setup.cfg b/setup.cfg index 8732600db003cf7f04ed9046ff1ef80f3e2f1624..c0468f1bdd487245c6f952777b67a6eccd84322e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -35,6 +35,7 @@ test = pytest-cov pytest-django pytest-freezegun + django-test-migrations model-bakery lxml flake8 @@ -86,6 +87,5 @@ omit = manage.py castellum/wsgi.py castellum/settings/* - castellum/*/migrations/* skip_covered = True skip_empty = True diff --git a/tests/conftest.py b/tests/conftest.py index 99e1cae9b402af875b47192267958201202ed615..3b6b622e13615d471dd9b7684ef844cab232bfba 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -65,6 +65,11 @@ baker.generators.add( TestCase.databases = ['default', 'contacts'] +def pytest_collection_modifyitems(items): + # run migration tests last so they do not interfere with session scoped data + items.sort(key=lambda item: 'migrator_factory' in getattr(item, 'fixturenames', [])) + + def create_user(group_name): future = timezone.now() + datetime.timedelta(days=10000) user = baker.make(User, expiration_date=future, email='test@example.com') diff --git a/tests/markers.py b/tests/markers.py new file mode 100644 index 0000000000000000000000000000000000000000..48c805c6e468d737d87a513648335bf66c789904 --- /dev/null +++ b/tests/markers.py @@ -0,0 +1,11 @@ +import pytest +from pkg_resources import parse_version + +import castellum + + +def skip_old_migration(next_version): + return pytest.mark.skipif( + parse_version(castellum.__version__) >= parse_version(next_version), + reason='test for old migration', + ) diff --git a/tests/subjects/migrations/test_0028_alter_subject_uuid.py b/tests/subjects/migrations/test_0028_alter_subject_uuid.py new file mode 100644 index 0000000000000000000000000000000000000000..6e3d2da373a234cb240cc04bcb1a67c0caf7fbb9 --- /dev/null +++ b/tests/subjects/migrations/test_0028_alter_subject_uuid.py @@ -0,0 +1,32 @@ +import pytest +from model_bakery import baker + +from tests.markers import skip_old_migration + + +@pytest.mark.django_db +@skip_old_migration('0.68') +def test_keep_uuid(migrator): + old_state = migrator.apply_initial_migration(('subjects', '0027_rename_subject_slug_to_uuid')) + Subject = old_state.apps.get_model('subjects', 'Subject') + subject = baker.make(Subject) + uuid = subject.uuid + + new_state = migrator.apply_tested_migration(('subjects', '0028_alter_subject_uuid')) + Subject = new_state.apps.get_model('subjects', 'Subject') + subject = Subject.objects.first() + + assert str(subject.uuid) == uuid + + migrator.reset() + + +@pytest.mark.django_db +@skip_old_migration('0.68') +def test_many_subjects(migrator): + old_state = migrator.apply_initial_migration(('subjects', '0027_rename_subject_slug_to_uuid')) + Subject = old_state.apps.get_model('subjects', 'Subject') + baker.make(Subject, _quantity=100) + + migrator.apply_tested_migration(('subjects', '0028_alter_subject_uuid')) + migrator.reset()