Skip to content

Commit

Permalink
fix(migration-test): add decorator to skip if not enabled (#5024)
Browse files Browse the repository at this point in the history
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
  • Loading branch information
gagantrivedi and pre-commit-ci[bot] authored Jan 21, 2025
1 parent 9cbf058 commit 33cabfc
Showing 1 changed file with 79 additions and 36 deletions.
115 changes: 79 additions & 36 deletions api/tests/unit/features/versioning/test_unit_versioning_migrations.py
Original file line number Diff line number Diff line change
@@ -1,31 +1,49 @@
from datetime import timedelta

import pytest
from django.conf import settings as test_settings
from django.utils import timezone
from django_test_migrations.migrator import Migrator


@pytest.mark.skipif(
test_settings.SKIP_MIGRATION_TESTS is True,
reason="Skip migration tests to speed up tests where necessary",
)
def test_fix_scheduled_fs_data_issue_caused_by_enabling_versioning(
migrator: Migrator
migrator: Migrator,
) -> None:
# Given
now = timezone.now()
one_hour_from_now = now + timedelta(hours=1)

initial_state = migrator.apply_initial_migration(("feature_versioning", "0004_add_version_change_set"))
initial_state = migrator.apply_initial_migration(
("feature_versioning", "0004_add_version_change_set")
)

organisation_model_class = initial_state.apps.get_model("organisations", "Organisation")
organisation_model_class = initial_state.apps.get_model(
"organisations", "Organisation"
)
project_model_class = initial_state.apps.get_model("projects", "Project")
environment_model_class = initial_state.apps.get_model("environments", "Environment")
change_request_model_class = initial_state.apps.get_model("workflows_core", "ChangeRequest")
environment_model_class = initial_state.apps.get_model(
"environments", "Environment"
)
change_request_model_class = initial_state.apps.get_model(
"workflows_core", "ChangeRequest"
)
environment_feature_version_model_class = initial_state.apps.get_model(
"feature_versioning", "EnvironmentFeatureVersion"
)
feature_state_model_class = initial_state.apps.get_model("features", "FeatureState")
feature_model_class = initial_state.apps.get_model("features", "Feature")

organisation = organisation_model_class.objects.create(name="Test Organisation")
project = project_model_class.objects.create(name="Test Project", organisation=organisation)
environment_1 = environment_model_class.objects.create(name="Environment 1", project=project)
project = project_model_class.objects.create(
name="Test Project", organisation=organisation
)
environment_1 = environment_model_class.objects.create(
name="Environment 1", project=project
)
feature = feature_model_class.objects.create(name="test_feature", project=project)

# First, let's create some regular data that should be left untouched for a
Expand Down Expand Up @@ -56,32 +74,42 @@ def test_fix_scheduled_fs_data_issue_caused_by_enabling_versioning(
project=project,
use_v2_feature_versioning=True,
)
versioned_environment_version_1 = environment_feature_version_model_class.objects.create(
feature=feature,
environment=versioned_environment,
versioned_environment_version_1 = (
environment_feature_version_model_class.objects.create(
feature=feature,
environment=versioned_environment,
)
)
versioned_environment_default_feature_state = feature_state_model_class.objects.create(
feature=feature,
environment=versioned_environment,
environment_feature_version=versioned_environment_version_1,
versioned_environment_default_feature_state = (
feature_state_model_class.objects.create(
feature=feature,
environment=versioned_environment,
environment_feature_version=versioned_environment_version_1,
)
)
versioned_environment_cr = change_request_model_class.objects.create(
environment=versioned_environment,
title="Versioned Environment CR",
)
versioned_environment_cr_version = environment_feature_version_model_class.objects.create(
feature=feature,
environment=versioned_environment,
change_request=versioned_environment_cr,
versioned_environment_cr_version = (
environment_feature_version_model_class.objects.create(
feature=feature,
environment=versioned_environment,
change_request=versioned_environment_cr,
)
)
versioned_environment_change_request_feature_state = feature_state_model_class.objects.create(
feature=feature,
environment=versioned_environment,
environment_feature_version=versioned_environment_cr_version,
versioned_environment_change_request_feature_state = (
feature_state_model_class.objects.create(
feature=feature,
environment=versioned_environment,
environment_feature_version=versioned_environment_cr_version,
)
)

# Now, let's create the corrupt data that we want to correct
environment_2 = environment_model_class.objects.create(name="Environment 2", project=project)
environment_2 = environment_model_class.objects.create(
name="Environment 2", project=project
)
# Note: because migrations don't trigger the signals, we need to manually create
# the default state
feature_state_model_class.objects.create(
Expand Down Expand Up @@ -133,22 +161,37 @@ def test_fix_scheduled_fs_data_issue_caused_by_enabling_versioning(
feature_state_model_class = new_state.apps.get_model("features", "FeatureState")

# Let's check that the regular data is untouched
assert feature_state_model_class.objects.get(
pk=environment_1_default_feature_state.pk
).environment_feature_version is None
assert feature_state_model_class.objects.get(
pk=environment_1_live_feature_state.pk
).environment_feature_version is None
assert feature_state_model_class.objects.get(
pk=versioned_environment_default_feature_state.pk
).environment_feature_version_id == versioned_environment_version_1.pk
assert feature_state_model_class.objects.get(
pk=versioned_environment_change_request_feature_state.pk
).environment_feature_version_id == versioned_environment_cr_version.pk
assert (
feature_state_model_class.objects.get(
pk=environment_1_default_feature_state.pk
).environment_feature_version
is None
)
assert (
feature_state_model_class.objects.get(
pk=environment_1_live_feature_state.pk
).environment_feature_version
is None
)
assert (
feature_state_model_class.objects.get(
pk=versioned_environment_default_feature_state.pk
).environment_feature_version_id
== versioned_environment_version_1.pk
)
assert (
feature_state_model_class.objects.get(
pk=versioned_environment_change_request_feature_state.pk
).environment_feature_version_id
== versioned_environment_cr_version.pk
)

# And let's check the corrupted data issue has been solved
new_environment_2_scheduled_feature_state = feature_state_model_class.objects.get(
pk=environment_2_scheduled_feature_state.pk
)
assert new_environment_2_scheduled_feature_state.environment_feature_version is None
assert new_environment_2_scheduled_feature_state.change_request_id == environment_2_scheduled_cr.pk
assert (
new_environment_2_scheduled_feature_state.change_request_id
== environment_2_scheduled_cr.pk
)

0 comments on commit 33cabfc

Please sign in to comment.