Skip to content

Commit 2cb567d

Browse files
feat(nimbus): Add Sorting to the QA Runs table on the feature health page. (#13742)
Because - We need to add sorting to the QA Runs table on the feature health page This commit - Adds sorting to the QA Runs Table - Adds 2 new model fields to the experiment model to keep track of QA runs and dates. Fixes #13708 --------- Co-authored-by: Yashika Khurana <[email protected]>
1 parent e48dd9b commit 2cb567d

File tree

10 files changed

+406
-102
lines changed

10 files changed

+406
-102
lines changed

experimenter/experimenter/experiments/constants.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,12 @@ def get_icon_info(status):
453453
status, QA_STATUS_ICON_MAP[NimbusConstants.QAStatus.NOT_SET]
454454
)
455455

456+
class QATestType(models.TextChoices):
457+
FULL = "FULL", "Full"
458+
SMOKE = "SMOKE", "Smoke"
459+
SELF = "SELF", "Self"
460+
REGRESSION = "REGRESSION", "Regression"
461+
456462
APPLICATION_CONFIGS = {
457463
Application.DESKTOP: APPLICATION_CONFIG_DESKTOP,
458464
Application.FENIX: APPLICATION_CONFIG_FENIX,
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 5.2.7 on 2025-10-23 19:11
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('experiments', '0295_nimbusexperiment_exclude_countries_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='nimbusexperiment',
15+
name='qa_run_date',
16+
field=models.DateField(blank=True, default=None, null=True, verbose_name='QA Run Date'),
17+
),
18+
migrations.AddField(
19+
model_name='nimbusexperiment',
20+
name='qa_run_test_plan',
21+
field=models.URLField(blank=True, default=None, max_length=500, null=True, verbose_name='QA Run Test Plan Link'),
22+
),
23+
migrations.AddField(
24+
model_name='nimbusexperiment',
25+
name='qa_run_testrail_link',
26+
field=models.URLField(blank=True, default=None, max_length=500, null=True, verbose_name='QA Run TestRail Link'),
27+
),
28+
migrations.AddField(
29+
model_name='nimbusexperiment',
30+
name='qa_run_type',
31+
field=models.CharField(blank=True, choices=[('FULL', 'Full'), ('SMOKE', 'Smoke'), ('SELF', 'Self'), ('REGRESSION', 'Regression')], default=None, max_length=255, null=True, verbose_name='QA Run Type'),
32+
),
33+
]

experimenter/experimenter/experiments/models.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,29 @@ class NimbusExperiment(NimbusConstants, TargetingConstants, FilterMixin, models.
454454
default=list,
455455
)
456456
tags = models.ManyToManyField(Tag, blank=True, related_name="experiments")
457+
qa_run_date = models.DateField("QA Run Date", blank=True, null=True, default=None)
458+
qa_run_type = models.CharField(
459+
"QA Run Type",
460+
max_length=255,
461+
blank=True,
462+
null=True,
463+
default=None,
464+
choices=NimbusConstants.QATestType.choices,
465+
)
466+
qa_run_test_plan = models.URLField(
467+
"QA Run Test Plan Link",
468+
max_length=500,
469+
blank=True,
470+
null=True,
471+
default=None,
472+
)
473+
qa_run_testrail_link = models.URLField(
474+
"QA Run TestRail Link",
475+
max_length=500,
476+
blank=True,
477+
null=True,
478+
default=None,
479+
)
457480

458481
class Meta:
459482
verbose_name = "Nimbus Experiment"

experimenter/experimenter/experiments/tests/test_changelog_utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,12 @@ def test_outputs_expected_schema_for_empty_experiment(self):
9898
"publish_status": NimbusExperiment.PublishStatus.IDLE,
9999
"published_dto": None,
100100
"qa_comment": None,
101+
"qa_run_date": None,
102+
"qa_run_type": None,
101103
"qa_signoff": False,
102104
"qa_status": NimbusExperiment.QAStatus.NOT_SET,
105+
"qa_run_test_plan": None,
106+
"qa_run_testrail_link": None,
103107
"reference_branch": None,
104108
"required_experiments": [],
105109
"requires_restart": False,
@@ -220,8 +224,12 @@ def test_outputs_expected_schema_for_complete_experiment(self):
220224
"public_description": experiment.public_description,
221225
"publish_status": experiment.publish_status,
222226
"qa_comment": experiment.qa_comment,
227+
"qa_run_date": experiment.qa_run_date,
228+
"qa_run_type": experiment.qa_run_type,
223229
"qa_signoff": False,
224230
"qa_status": experiment.qa_status,
231+
"qa_run_test_plan": experiment.qa_run_test_plan,
232+
"qa_run_testrail_link": experiment.qa_run_testrail_link,
225233
"required_experiments": [],
226234
"requires_restart": False,
227235
"results_data": experiment.results_data,

experimenter/experimenter/experiments/tests/test_models.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,6 +3715,26 @@ def test_qa_status_badge_class(self, qa_status, expected_badge_class):
37153715
)
37163716
self.assertEqual(experiment.qa_status_badge_class, expected_badge_class)
37173717

3718+
@parameterized.expand(NimbusExperiment.QATestType.choices)
3719+
def test_qa_run_type_display(self, qa_run_type, expected_display):
3720+
experiment = NimbusExperimentFactory.create(qa_run_type=qa_run_type)
3721+
self.assertEqual(experiment.get_qa_run_type_display(), expected_display)
3722+
3723+
def test_qa_run_date_accepts_valid_date(self):
3724+
test_date = datetime.date(2024, 1, 15)
3725+
experiment = NimbusExperimentFactory.create(qa_run_date=test_date)
3726+
self.assertEqual(experiment.qa_run_date, test_date)
3727+
3728+
def test_qa_run_test_plan_accepts_valid_url(self):
3729+
test_url = "https://example.com/test-plan"
3730+
experiment = NimbusExperimentFactory.create(qa_run_test_plan=test_url)
3731+
self.assertEqual(experiment.qa_run_test_plan, test_url)
3732+
3733+
def test_qa_run_testrail_link_accepts_valid_url(self):
3734+
test_url = "https://testrail.example.com/index.php?/runs/view/12345"
3735+
experiment = NimbusExperimentFactory.create(qa_run_testrail_link=test_url)
3736+
self.assertEqual(experiment.qa_run_testrail_link, test_url)
3737+
37183738
def test_clone_created_experiment(self):
37193739
owner = UserFactory.create()
37203740
required_experiment = NimbusExperimentFactory.create()
@@ -3864,6 +3884,10 @@ def _clone_experiment_and_assert_common_expectations(
38643884
self.assertEqual(child.conclusion_recommendations, [])
38653885
self.assertEqual(child.qa_status, NimbusExperiment.QAStatus.NOT_SET)
38663886
self.assertEqual(child.qa_comment, None)
3887+
self.assertEqual(child.qa_run_date, None)
3888+
self.assertEqual(child.qa_run_type, None)
3889+
self.assertEqual(child.qa_run_test_plan, None)
3890+
self.assertEqual(child.qa_run_testrail_link, None)
38673891
self.assertEqual(child._start_date, None)
38683892
self.assertEqual(child._end_date, None)
38693893
self.assertEqual(child._enrollment_end_date, None)

experimenter/experimenter/nimbus_ui/filtersets.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,12 @@ class Deliveries(models.TextChoices):
616616
SIZE_UP = "total_enrolled_clients", "Pop. Size"
617617
SIZE_DOWN = "-total_enrolled_clients", "Pop. Size"
618618

619+
class QARuns(models.TextChoices):
620+
DATE_UP = "qa_run_date", "Date"
621+
DATE_DOWN = "-qa_run_date", "Date"
622+
TYPE_UP = "qa_run_type", "Testing Type"
623+
TYPE_DOWN = "-qa_run_type", "Testing Type"
624+
619625
@staticmethod
620626
def sortable_headers(table_name):
621627
seen = set()

0 commit comments

Comments
 (0)