|
4 | 4 |
|
5 | 5 | from django import forms |
6 | 6 | from django.core.exceptions import ValidationError |
7 | | -from django.forms import inlineformset_factory |
8 | 7 | from django.test import TestCase |
9 | 8 | from django.utils import timezone |
| 9 | +from parameterized import parameterized_class |
10 | 10 |
|
11 | 11 | from experimenter.experiments.forms import ( |
12 | 12 | BugzillaURLField, |
|
21 | 21 | ExperimentVariantAddonForm, |
22 | 22 | ExperimentVariantPrefForm, |
23 | 23 | ExperimentVariantsAddonForm, |
24 | | - ExperimentVariantsFormSet, |
25 | 24 | ExperimentVariantsPrefForm, |
26 | 25 | JSONField, |
27 | 26 | ) |
@@ -256,70 +255,97 @@ def test_empty_slug_raises_error(self): |
256 | 255 | self.assertFalse(form.is_valid()) |
257 | 256 |
|
258 | 257 |
|
259 | | -class TestExperimentVariantsFormSet(TestCase): |
| 258 | +@parameterized_class( |
| 259 | + ["form_class"], |
| 260 | + [[ExperimentVariantsAddonForm], [ExperimentVariantsPrefForm]], |
| 261 | +) |
| 262 | +class TestExperimentVariantsFormSet(MockRequestMixin, TestCase): |
260 | 263 |
|
261 | 264 | def setUp(self): |
262 | | - self.FormSet = inlineformset_factory( |
263 | | - formset=ExperimentVariantsFormSet, |
264 | | - model=ExperimentVariant, |
265 | | - parent_model=Experiment, |
266 | | - fields=["is_control", "ratio", "name", "slug", "description"], |
| 265 | + super().setUp() |
| 266 | + |
| 267 | + self.experiment = ExperimentFactory.create_with_status( |
| 268 | + Experiment.STATUS_DRAFT, num_variants=0 |
267 | 269 | ) |
268 | 270 |
|
269 | 271 | self.data = { |
| 272 | + "population_percent": "10", |
| 273 | + "firefox_version": Experiment.VERSION_CHOICES[-1][0], |
| 274 | + "firefox_channel": Experiment.CHANNEL_NIGHTLY, |
| 275 | + "client_matching": "en-us only please", |
| 276 | + "pref_key": "browser.test.example", |
| 277 | + "pref_type": Experiment.PREF_TYPE_STR, |
| 278 | + "pref_branch": Experiment.PREF_BRANCH_DEFAULT, |
270 | 279 | "variants-TOTAL_FORMS": "3", |
271 | 280 | "variants-INITIAL_FORMS": "0", |
272 | 281 | "variants-MIN_NUM_FORMS": "0", |
273 | 282 | "variants-MAX_NUM_FORMS": "1000", |
274 | 283 | "variants-0-is_control": True, |
275 | 284 | "variants-0-ratio": "34", |
276 | 285 | "variants-0-name": "control name", |
277 | | - "variants-0-slug": "control-slug", |
278 | 286 | "variants-0-description": "control desc", |
| 287 | + "variants-0-value": '"control value"', |
279 | 288 | "variants-1-is_control": False, |
280 | 289 | "variants-1-ratio": "33", |
281 | 290 | "variants-1-name": "branch 1 name", |
282 | | - "variants-1-slug": "branch-1-slug", |
283 | 291 | "variants-1-description": "branch 1 desc", |
| 292 | + "variants-1-value": '"branch 1 value"', |
284 | 293 | "variants-2-is_control": False, |
285 | 294 | "variants-2-ratio": "33", |
286 | 295 | "variants-2-name": "branch 2 name", |
287 | | - "variants-2-slug": "branch-2-slug", |
288 | 296 | "variants-2-description": "branch 2 desc", |
| 297 | + "variants-2-value": '"branch 2 value"', |
289 | 298 | } |
290 | 299 |
|
291 | | - def test_formset_valid_if_sizes_sum_to_100(self): |
292 | | - formset = self.FormSet(data=self.data) |
293 | | - self.assertTrue(formset.is_valid()) |
| 300 | + def test_form_valid_if_sizes_sum_to_100(self): |
| 301 | + self.data["variants-0-ratio"] = "34" |
| 302 | + self.data["variants-1-ratio"] = "33" |
| 303 | + self.data["variants-2-ratio"] = "33" |
| 304 | + form = self.form_class( |
| 305 | + request=self.request, data=self.data, instance=self.experiment |
| 306 | + ) |
| 307 | + self.assertTrue(form.is_valid()) |
294 | 308 |
|
295 | | - def test_formset_invalid_if_sizes_sum_to_less_than_100(self): |
296 | | - self.data["variants-0-ratio"] = 30 |
297 | | - formset = self.FormSet(data=self.data) |
298 | | - self.assertFalse(formset.is_valid()) |
| 309 | + def test_form_invalid_if_sizes_sum_to_less_than_100(self): |
| 310 | + self.data["variants-0-ratio"] = "33" |
| 311 | + self.data["variants-1-ratio"] = "33" |
| 312 | + self.data["variants-2-ratio"] = "33" |
| 313 | + form = self.form_class( |
| 314 | + request=self.request, data=self.data, instance=self.experiment |
| 315 | + ) |
| 316 | + self.assertFalse(form.is_valid()) |
299 | 317 |
|
300 | | - for form in formset.forms: |
| 318 | + for form in form.variants_formset.forms: |
301 | 319 | self.assertIn("ratio", form.errors) |
302 | 320 |
|
303 | | - def test_formset_invalid_if_sizes_sum_to_more_than_100(self): |
304 | | - self.data["variants-0-ratio"] = 40 |
305 | | - formset = self.FormSet(data=self.data) |
306 | | - self.assertFalse(formset.is_valid()) |
| 321 | + def test_form_invalid_if_sizes_sum_to_more_than_100(self): |
| 322 | + self.data["variants-0-ratio"] = "35" |
| 323 | + self.data["variants-1-ratio"] = "33" |
| 324 | + self.data["variants-2-ratio"] = "33" |
| 325 | + form = self.form_class( |
| 326 | + request=self.request, data=self.data, instance=self.experiment |
| 327 | + ) |
| 328 | + self.assertFalse(form.is_valid()) |
307 | 329 |
|
308 | | - for form in formset.forms: |
| 330 | + for form in form.variants_formset.forms: |
309 | 331 | self.assertIn("ratio", form.errors) |
310 | 332 |
|
311 | | - def test_formset_invalid_if_duplicate_slugs_appear(self): |
312 | | - self.data["variants-0-slug"] = self.data["variants-1-slug"] |
313 | | - formset = self.FormSet(data=self.data) |
314 | | - self.assertFalse(formset.is_valid()) |
| 333 | + def test_form_invalid_if_duplicate_names_appear(self): |
| 334 | + self.data["variants-0-name"] = self.data["variants-1-name"] |
| 335 | + form = self.form_class( |
| 336 | + request=self.request, data=self.data, instance=self.experiment |
| 337 | + ) |
| 338 | + self.assertFalse(form.is_valid()) |
315 | 339 |
|
316 | | - for form in formset.forms: |
| 340 | + for form in form.variants_formset.forms: |
317 | 341 | self.assertIn("name", form.errors) |
318 | 342 |
|
319 | 343 | def test_empty_branch_size_raises_validation_error(self): |
320 | 344 | del self.data["variants-0-ratio"] |
321 | | - formset = self.FormSet(data=self.data) |
322 | | - self.assertFalse(formset.is_valid()) |
| 345 | + form = self.form_class( |
| 346 | + request=self.request, data=self.data, instance=self.experiment |
| 347 | + ) |
| 348 | + self.assertFalse(form.is_valid()) |
323 | 349 |
|
324 | 350 |
|
325 | 351 | class TestExperimentVariantsAddonForm(MockRequestMixin, TestCase): |
|
0 commit comments