Skip to content

Commit fd3beca

Browse files
feat(nimbus):Removes question emoji if the request is cancelled (#15000)
Because - We add a question emoji if the request is review pending, but user can cancel the request so in that case we should remove the pending review question emoji so it is easy for reviewers to know which request is cancelled and which is pending for the review This commit - Removes the question emoji if the request is cancelled Fixes #14972
1 parent a360a0a commit fd3beca

File tree

4 files changed

+109
-9
lines changed

4 files changed

+109
-9
lines changed

experimenter/experimenter/nimbus_ui/constants.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ class ReviewRequestMessages(Enum):
238238
UPDATE_ROLLOUT = "update this rollout"
239239
END_ROLLOUT = "end this rollout"
240240

241+
class CancelRequestMessages(Enum):
242+
END_ENROLLMENT = "Cancelled end enrollment request."
243+
END_EXPERIMENT = "Cancelled end experiment request."
244+
UPDATE_ROLLOUT = "Cancelled update rollout."
245+
241246
class ExposuresStatus(IntEnum):
242247
NO_EXPOSURES = 0
243248
VALID = 1

experimenter/experimenter/nimbus_ui/forms.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1378,6 +1378,11 @@ class CancelRequestMixin:
13781378
def save(self, commit=True):
13791379
experiment = super().save(commit=commit)
13801380
if self.cancel_request_alert_type:
1381+
remove_emoji_from_message_async.delay(
1382+
experiment.id,
1383+
self.cancel_request_alert_type,
1384+
SlackConstants.EmojiReaction.PENDING,
1385+
)
13811386
add_emoji_to_message_async.delay(
13821387
experiment.id,
13831388
self.cancel_request_alert_type,

experimenter/experimenter/nimbus_ui/tests/test_forms.py

Lines changed: 90 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,82 @@ def setUp(self):
120120
self.addCleanup(self.mock_remove_emoji_task.stop)
121121

122122

123+
class CancelEmojiTestMixin:
124+
@parameterized.expand(
125+
[
126+
(
127+
"end_enrollment",
128+
CancelEndEnrollmentForm,
129+
NimbusConstants.AlertType.END_ENROLLMENT_REQUEST,
130+
NimbusExperiment.Status.LIVE,
131+
NimbusExperiment.Status.LIVE,
132+
{
133+
"cancel_message": (
134+
NimbusUIConstants.CancelRequestMessages.END_ENROLLMENT.value
135+
)
136+
},
137+
),
138+
(
139+
"end_experiment",
140+
CancelEndExperimentForm,
141+
NimbusConstants.AlertType.END_EXPERIMENT_REQUEST,
142+
NimbusExperiment.Status.LIVE,
143+
NimbusExperiment.Status.COMPLETE,
144+
{
145+
"cancel_message": (
146+
NimbusUIConstants.CancelRequestMessages.END_EXPERIMENT.value
147+
)
148+
},
149+
),
150+
(
151+
"update_rollout",
152+
CancelUpdateRolloutForm,
153+
NimbusConstants.AlertType.UPDATE_REQUEST,
154+
NimbusExperiment.Status.LIVE,
155+
NimbusExperiment.Status.LIVE,
156+
{
157+
"cancel_message": (
158+
NimbusUIConstants.CancelRequestMessages.UPDATE_ROLLOUT.value
159+
)
160+
},
161+
),
162+
]
163+
)
164+
def test_cancel_removes_pending_emoji(
165+
self, name, form_class, alert_type, status, status_next, data
166+
):
167+
is_rollout = form_class == CancelUpdateRolloutForm
168+
is_paused = alert_type != NimbusConstants.AlertType.UPDATE_REQUEST
169+
170+
experiment = NimbusExperimentFactory.create(
171+
status=status,
172+
status_next=status_next,
173+
publish_status=NimbusExperiment.PublishStatus.REVIEW,
174+
is_paused=is_paused,
175+
is_rollout=is_rollout,
176+
)
177+
178+
form = form_class(
179+
data=data,
180+
instance=experiment,
181+
request=self.request,
182+
)
183+
self.assertTrue(form.is_valid(), form.errors)
184+
185+
form.save()
186+
187+
self.mock_remove_emoji_task.assert_called_once_with(
188+
experiment.id,
189+
alert_type,
190+
SlackConstants.EmojiReaction.PENDING,
191+
)
192+
self.mock_emoji_task.assert_called_once_with(
193+
experiment.id,
194+
alert_type,
195+
SlackConstants.EmojiReaction.CANCEL,
196+
)
197+
198+
123199
class KintoPushQueueMockMixin:
124200
def setUp(self):
125201
super().setUp()
@@ -1912,7 +1988,9 @@ def test_invalid_transition(self, status, status_next, publish_status, is_paused
19121988
)
19131989

19141990

1915-
class TestCancelEndEnrollmentForm(SlackEmojiMockMixin, RequestFormTestCase):
1991+
class TestCancelEndEnrollmentForm(
1992+
CancelEmojiTestMixin, SlackEmojiMockMixin, RequestFormTestCase
1993+
):
19161994
def test_valid_transition(self):
19171995
experiment = NimbusExperimentFactory.create(
19181996
status=NimbusExperiment.Status.LIVE,
@@ -2004,7 +2082,9 @@ def test_cancel_end_enrollment_request(self):
20042082
self.assertIn("Cancelled end enrollment request.", changelog.message)
20052083

20062084

2007-
class TestCancelEndExperimentForm(SlackEmojiMockMixin, RequestFormTestCase):
2085+
class TestCancelEndExperimentForm(
2086+
CancelEmojiTestMixin, SlackEmojiMockMixin, RequestFormTestCase
2087+
):
20082088
def test_valid_transition(self):
20092089
experiment = NimbusExperimentFactory.create(
20102090
status=NimbusExperiment.Status.LIVE,
@@ -2224,7 +2304,9 @@ def test_sends_slack_when_enabled(self, mock_send_slack):
22242304
self.assertEqual(alert.slack_channel_id, "C123456")
22252305

22262306

2227-
class TestCancelUpdateRolloutForm(SlackEmojiMockMixin, RequestFormTestCase):
2307+
class TestCancelUpdateRolloutForm(
2308+
CancelEmojiTestMixin, SlackEmojiMockMixin, RequestFormTestCase
2309+
):
22282310
def test_valid_transition(self):
22292311
experiment = NimbusExperimentFactory.create(
22302312
status=NimbusExperiment.Status.LIVE,
@@ -2252,6 +2334,11 @@ def test_valid_transition(self):
22522334
"rejected the update review with reason: Audience update not valid.",
22532335
changelog.message,
22542336
)
2337+
self.mock_remove_emoji_task.assert_called_once_with(
2338+
experiment.id,
2339+
NimbusConstants.AlertType.UPDATE_REQUEST,
2340+
SlackConstants.EmojiReaction.PENDING,
2341+
)
22552342
self.mock_emoji_task.assert_called_once_with(
22562343
experiment.id,
22572344
NimbusConstants.AlertType.UPDATE_REQUEST,

experimenter/experimenter/nimbus_ui/tests/test_views.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,13 +2619,14 @@ def test_cancel_end_enrollment_view(self):
26192619
is_paused=True,
26202620
)
26212621

2622+
cancel_msg = NimbusUIConstants.CancelRequestMessages.END_ENROLLMENT.value
26222623
response = self.client.post(
26232624
reverse(
26242625
"nimbus-ui-cancel-end-enrollment",
26252626
kwargs={"slug": experiment.slug},
26262627
),
26272628
data={
2628-
"cancel_message": "Cancelled end enrollment request.",
2629+
"cancel_message": cancel_msg,
26292630
"action_type": "end_enrollment",
26302631
},
26312632
)
@@ -2638,7 +2639,7 @@ def test_cancel_end_enrollment_view(self):
26382639

26392640
changelog = experiment.changes.latest("changed_on")
26402641
self.assertEqual(changelog.changed_by, self.user)
2641-
self.assertIn("Cancelled end enrollment request.", changelog.message)
2642+
self.assertIn(cancel_msg, changelog.message)
26422643

26432644
@parameterized.expand(
26442645
[
@@ -2694,13 +2695,14 @@ def test_cancel_end_experiment_view(self, is_rollout):
26942695
is_rollout=is_rollout,
26952696
)
26962697

2698+
cancel_msg = NimbusUIConstants.CancelRequestMessages.END_EXPERIMENT.value
26972699
response = self.client.post(
26982700
reverse(
26992701
"nimbus-ui-cancel-end-experiment",
27002702
kwargs={"slug": experiment.slug},
27012703
),
27022704
data={
2703-
"cancel_message": "Cancelled end experiment request.",
2705+
"cancel_message": cancel_msg,
27042706
"action_type": "end_experiment",
27052707
},
27062708
)
@@ -2713,7 +2715,7 @@ def test_cancel_end_experiment_view(self, is_rollout):
27132715

27142716
changelog = experiment.changes.latest("changed_on")
27152717
self.assertEqual(changelog.changed_by, self.user)
2716-
self.assertIn("Cancelled end experiment request.", changelog.message)
2718+
self.assertIn(cancel_msg, changelog.message)
27172719

27182720
def test_live_to_update_rollout_view(self):
27192721
experiment = NimbusExperimentFactory.create(
@@ -2765,10 +2767,11 @@ def test_cancel_update_rollout_view_with_cancel_message(self):
27652767
is_rollout=True,
27662768
)
27672769

2770+
cancel_msg = NimbusUIConstants.CancelRequestMessages.UPDATE_ROLLOUT.value
27682771
response = self.client.post(
27692772
reverse("nimbus-ui-cancel-update-rollout", kwargs={"slug": experiment.slug}),
27702773
data={
2771-
"cancel_message": "Cancelled update rollout.",
2774+
"cancel_message": cancel_msg,
27722775
"action_type": "update_rollout",
27732776
},
27742777
)
@@ -2778,7 +2781,7 @@ def test_cancel_update_rollout_view_with_cancel_message(self):
27782781
self.assertEqual(experiment.publish_status, NimbusExperiment.PublishStatus.IDLE)
27792782

27802783
changelog = experiment.changes.latest("changed_on")
2781-
self.assertIn("Cancelled update rollout.", changelog.message)
2784+
self.assertIn(cancel_msg, changelog.message)
27822785

27832786
def test_approve_update_rollout_view(self):
27842787
experiment = NimbusExperimentFactory.create(

0 commit comments

Comments
 (0)