Skip to content

Commit e25e8a3

Browse files
[Offering] Permanently enable service offering feature flag (#2917)
* feat(#2894): Permanently enable service offering feature flag * feat(#2894): Remove unnecessary tests * feat(#2894): Update tests
1 parent 0bc0175 commit e25e8a3

File tree

3 files changed

+16
-45
lines changed

3 files changed

+16
-45
lines changed

config/settings.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -653,14 +653,8 @@
653653
],
654654
# ------------
655655
# Enable the Service Offering module.
656-
# The "not_in_production" required condition evaluates to False when
657-
# PROD_ENVIRONMENT=True, permanently disabling the flag in production.
658-
# In lower environments the flag can be toggled on/off via URL parameter or session.
659656
"SERVICE_OFFERING": [
660-
{"condition": "not_in_production", "value": True, "required": True},
661-
{"condition": "anonymous", "value": False, "required": True},
662-
{"condition": "parameter", "value": "enable_service_offering=true"},
663-
{"condition": "session", "value": "enable_service_offering"},
657+
{"condition": "boolean", "value": True},
664658
],
665659
}
666660

src/extrequests/tests/test_training_request.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,8 @@ def setUp(self) -> None:
283283
self.learner = Role.objects.get(name="learner")
284284
self.ttt = Tag.objects.get(name="TTT")
285285

286+
self.benefit = Benefit.objects.get(name="Instructor Training")
287+
286288
self.first_training = Event.objects.create(slug="ttt-event", host=self.org)
287289
self.first_training.tags.add(self.ttt)
288290
Task.objects.create(person=self.spiderman, role=self.learner, event=self.first_training)
@@ -363,6 +365,7 @@ def test_successful_matching_to_training(self) -> None:
363365
"match": "",
364366
"event": self.second_training.pk,
365367
"requests": [self.first_req.pk],
368+
"benefit_override": self.benefit.pk,
366369
# "seat_public": "True",
367370
}
368371
rv = self.client.post(reverse("all_trainingrequests"), data, follow=True)
@@ -385,6 +388,7 @@ def test_successful_matching_twice_to_the_same_training(self) -> None:
385388
"match": "",
386389
"event": self.first_training.pk,
387390
"requests": [self.first_req.pk],
391+
"benefit_override": self.benefit.pk,
388392
}
389393
# Spiderman is already matched with first_training
390394
assert self.spiderman.get_training_tasks()[0].event == self.first_training
@@ -419,6 +423,7 @@ def test_successful_matching_to_allocated_benefit(self) -> None:
419423
"event": self.second_training.pk,
420424
"requests": [self.first_req.pk],
421425
"allocated_benefit": account_benefit.pk,
426+
"benefit_override": benefit.pk,
422427
}
423428

424429
# Act
@@ -442,6 +447,7 @@ def test_trainee_accepted_during_matching(self) -> None:
442447
"match": "",
443448
"event": self.second_training.pk,
444449
"requests": [self.second_req.pk],
450+
"benefit_override": self.benefit.pk,
445451
# "seat_public": "True",
446452
}
447453
rv = self.client.post(reverse("all_trainingrequests"), data, follow=True)
@@ -561,6 +567,7 @@ def test_matching_no_remaining__no_message(self) -> None:
561567
"requests": [self.first_req.pk, self.third_req.pk],
562568
"event": self.second_training.pk,
563569
"seat_membership": membership1.pk,
570+
"benefit_override": self.benefit.pk,
564571
# "seat_public": True,
565572
}
566573
msg1 = f"Membership "{membership1}" is using more training seats than it's been allowed."
@@ -571,6 +578,7 @@ def test_matching_no_remaining__no_message(self) -> None:
571578
"requests": [self.second_req.pk],
572579
"event": self.second_training.pk,
573580
"seat_membership": membership2.pk,
581+
"benefit_override": self.benefit.pk,
574582
# "seat_public": True,
575583
}
576584
msg2 = f"Membership "{membership2}" is using more training seats than it's been allowed."
@@ -649,6 +657,7 @@ def test_auto_assign_membership_seats(self) -> None:
649657
"event": self.first_training.pk,
650658
"auto_assign": "True",
651659
"requests": [req1.pk, req2.pk, req3.pk, self.first_req.pk],
660+
"benefit_override": self.benefit.pk,
652661
# "seat_public": "True",
653662
}
654663

@@ -664,7 +673,10 @@ def test_auto_assign_membership_seats(self) -> None:
664673
self.assertContains(rv, "2 request(s) were skipped due to errors")
665674
self.assertEqual(Task.objects.filter(seat_membership=membership_alpha).count(), 1)
666675
self.assertEqual(Task.objects.filter(seat_membership=membership_beta).count(), 1)
667-
self.assertContains(rv, "No membership found for registration code "invalid"")
676+
self.assertContains(
677+
rv,
678+
"No membership, partnership, or account benefit found for registration code "invalid"",
679+
)
668680
self.assertContains(
669681
rv,
670682
"Request does not include a member registration code, so cannot be matched to a membership seat.",
@@ -1164,6 +1176,7 @@ def test_matching_without_membership_or_benefit(self) -> None:
11641176
"match": "",
11651177
"event": self.second_training.pk,
11661178
"requests": [self.first_req.pk],
1179+
"benefit_override": self.benefit.pk,
11671180
# No seat_membership or allocated_benefit provided
11681181
}
11691182

@@ -1203,6 +1216,7 @@ def test_auto_assign_multiple_requests_partial_success(self) -> None:
12031216
"event": self.first_training.pk,
12041217
"auto_assign": "True",
12051218
"requests": [req_valid.pk, req_invalid.pk, req_no_code.pk],
1219+
"benefit_override": self.benefit.pk,
12061220
}
12071221

12081222
# Act
Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
from typing import Any, cast
21
from unittest.mock import MagicMock
32

4-
from django.conf import settings
53
from django.http import HttpRequest
64
from django.test import RequestFactory, TestCase, override_settings
7-
from flags.state import flag_enabled # type: ignore[import-untyped]
85

96
from src.offering.conditions import not_in_production_condition
107

@@ -35,37 +32,3 @@ def test_returns_false_in_production(self) -> None:
3532
def test_returns_true_outside_production(self) -> None:
3633
"""Condition evaluates to True when PROD_ENVIRONMENT is False."""
3734
self.assertTrue(not_in_production_condition(True))
38-
39-
40-
class TestServiceOfferingFlagProductionGuard(TestCase):
41-
"""Verify that the SERVICE_OFFERING flag cannot be enabled in production."""
42-
43-
@override_settings(PROD_ENVIRONMENT=True)
44-
def test_flag_disabled_in_production_without_parameter(self) -> None:
45-
"""Flag is disabled in production even without the enabling parameter."""
46-
self.assertFalse(flag_enabled(FLAG_NAME, request=_make_request("/")))
47-
48-
@override_settings(PROD_ENVIRONMENT=True)
49-
def test_flag_disabled_in_production_with_enabling_parameter(self) -> None:
50-
"""Flag stays disabled in production even when the enabling URL parameter is present."""
51-
self.assertFalse(flag_enabled(FLAG_NAME, request=_make_request("/?enable_service_offering=true")))
52-
53-
@override_settings(PROD_ENVIRONMENT=False)
54-
def test_flag_can_be_enabled_in_non_production_via_parameter(self) -> None:
55-
"""Flag can be enabled in non-production environments via URL parameter."""
56-
self.assertTrue(flag_enabled(FLAG_NAME, request=_make_request("/?enable_service_offering=true")))
57-
58-
@override_settings(PROD_ENVIRONMENT=False)
59-
def test_flag_disabled_in_non_production_without_parameter(self) -> None:
60-
"""Flag is still disabled in non-production when no enabling condition is present."""
61-
self.assertFalse(flag_enabled(FLAG_NAME, request=_make_request("/")))
62-
63-
def test_settings_have_required_not_in_production_condition(self) -> None:
64-
"""SERVICE_OFFERING flag in settings has a required not_in_production condition."""
65-
conditions = cast(list[Any], settings.FLAGS[FLAG_NAME])
66-
required = [
67-
c
68-
for c in conditions
69-
if isinstance(c, dict) and c.get("condition") == "not_in_production" and c.get("required") is True
70-
]
71-
self.assertEqual(len(required), 1)

0 commit comments

Comments
 (0)