Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(migration-test): add decorator to skip if not enabled #5024

Merged
merged 2 commits into from
Jan 21, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
)
Loading