Skip to content

Commit 18d6ea8

Browse files
authored
fix(versioning): scope scheduled-FS query by feature in v2 enable (#7449)
1 parent 8321d61 commit 18d6ea8

2 files changed

Lines changed: 67 additions & 0 deletions

File tree

api/features/versioning/tasks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def _create_initial_feature_versions(environment: "Environment"): # type: ignor
110110
related_feature_segments.update(environment_feature_version=ef_version)
111111

112112
scheduled_feature_states = FeatureState.objects.filter(
113+
feature=feature,
113114
live_from__gt=now,
114115
change_request__isnull=False,
115116
change_request__committed_at__isnull=False,

api/tests/unit/features/versioning/test_unit_versioning_tasks.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,72 @@ def test_enable_v2_versioning__scheduled_changes_exist__converts_published_sched
396396
)
397397

398398

399+
def test_enable_v2_versioning__multi_feature_scheduled_changes__each_efv_matches_feature(
400+
environment: Environment,
401+
project: Project,
402+
feature: Feature,
403+
staff_user: FFAdminUser,
404+
) -> None:
405+
# Given
406+
now = timezone.now()
407+
one_hour_from_now = now + timedelta(hours=1)
408+
two_hours_from_now = now + timedelta(hours=2)
409+
410+
feature_b = Feature.objects.create(name="feature_b", project=project)
411+
feature_c = Feature.objects.create(name="feature_c", project=project)
412+
413+
cr_b = ChangeRequest.objects.create(
414+
environment=environment,
415+
title="Scheduled change for feature_b",
416+
user=staff_user,
417+
)
418+
scheduled_fs_b = FeatureState.objects.create(
419+
feature=feature_b,
420+
enabled=True,
421+
environment=environment,
422+
live_from=one_hour_from_now,
423+
change_request=cr_b,
424+
version=None,
425+
)
426+
cr_b.commit(staff_user)
427+
428+
cr_c = ChangeRequest.objects.create(
429+
environment=environment,
430+
title="Scheduled change for feature_c",
431+
user=staff_user,
432+
)
433+
scheduled_fs_c = FeatureState.objects.create(
434+
feature=feature_c,
435+
enabled=True,
436+
environment=environment,
437+
live_from=two_hours_from_now,
438+
change_request=cr_c,
439+
version=None,
440+
)
441+
cr_c.commit(staff_user)
442+
443+
# When
444+
enable_v2_versioning(environment.id)
445+
446+
# Then
447+
scheduled_fs_b.refresh_from_db()
448+
scheduled_fs_c.refresh_from_db()
449+
450+
assert scheduled_fs_b.environment_feature_version is not None
451+
assert scheduled_fs_b.environment_feature_version.feature_id == feature_b.id, (
452+
f"scheduled FS for feature_b is bound to an EFV for "
453+
f"feature_id={scheduled_fs_b.environment_feature_version.feature_id}; "
454+
f"expected {feature_b.id}"
455+
)
456+
457+
assert scheduled_fs_c.environment_feature_version is not None
458+
assert scheduled_fs_c.environment_feature_version.feature_id == feature_c.id, (
459+
f"scheduled FS for feature_c is bound to an EFV for "
460+
f"feature_id={scheduled_fs_c.environment_feature_version.feature_id}; "
461+
f"expected {feature_c.id}"
462+
)
463+
464+
399465
def test_publish_version_change_set__conflict_with_scheduled_change__sends_conflict_email_to_owner(
400466
feature: Feature,
401467
environment_v2_versioning: Environment,

0 commit comments

Comments
 (0)