Ejemplo n.º 1
0
    def test_serializer_deletes_removed_variants(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_GENERIC)
        control_variant = ExperimentVariantFactory.create(
            experiment=experiment, is_control=True)
        ExperimentVariantFactory.create(experiment=experiment,
                                        is_control=False)
        treatment2_variant = ExperimentVariantFactory.create(
            experiment=experiment, is_control=False)

        self.assertEqual(experiment.variants.all().count(), 3)

        self.control_variant_data["id"] = control_variant.id
        self.treatment_variant_data["id"] = treatment2_variant.id

        data = {
            "variants":
            [self.control_variant_data, self.treatment_variant_data]
        }

        serializer = ExperimentDesignBaseSerializer(
            instance=experiment, data=data, context={"request": self.request})

        self.assertTrue(serializer.is_valid())

        experiment = serializer.save()

        self.assertEqual(experiment.variants.all().count(), 2)
        self.assertEqual(set(experiment.variants.all()),
                         set([control_variant, treatment2_variant]))
Ejemplo n.º 2
0
    def test_serializer_saves_new_variants(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_GENERIC)

        self.assertEqual(experiment.variants.all().count(), 0)

        data = {
            "variants":
            [self.control_variant_data, self.treatment_variant_data]
        }

        serializer = ExperimentDesignBaseSerializer(
            instance=experiment, data=data, context={"request": self.request})

        self.assertTrue(serializer.is_valid())

        experiment = serializer.save()

        self.assertEqual(experiment.variants.all().count(), 2)

        control_variant = experiment.variants.get(is_control=True)
        self.assertEqual(control_variant.name,
                         self.control_variant_data["name"])
        self.assertEqual(control_variant.ratio,
                         self.control_variant_data["ratio"])
        self.assertEqual(control_variant.description,
                         self.control_variant_data["description"])

        treatment_variant = experiment.variants.get(is_control=False)
        self.assertEqual(treatment_variant.name,
                         self.treatment_variant_data["name"])
        self.assertEqual(treatment_variant.ratio,
                         self.treatment_variant_data["ratio"])
        self.assertEqual(treatment_variant.description,
                         self.treatment_variant_data["description"])
Ejemplo n.º 3
0
    def test_update_changelog_creates_no_log_when_no_change(self):
        experiment = ExperimentFactory.create_with_status(
            target_status=Experiment.STATUS_DRAFT, num_variants=0)
        variant = ExperimentVariantFactory.create(
            ratio=100,
            name="variant name",
            experiment=experiment,
            value=None,
            addon_release_url=None,
        )

        data = {
            "variants": [{
                "id": variant.id,
                "ratio": variant.ratio,
                "description": variant.description,
                "name": variant.name,
                "is_control": variant.is_control,
            }]
        }

        self.assertEqual(experiment.changes.count(), 1)
        serializer = ExperimentDesignBaseSerializer(
            instance=experiment, data=data, context={"request": self.request})

        self.assertTrue(serializer.is_valid())
        experiment = serializer.save()

        self.assertEqual(experiment.changes.count(), 1)
Ejemplo n.º 4
0
    def test_serializer_rejects_ratios_above_100(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_GENERIC)

        self.control_variant_data["ratio"] = 110

        data = {"variants": [self.control_variant_data]}

        serializer = ExperimentDesignBaseSerializer(instance=experiment,
                                                    data=data)

        self.assertFalse(serializer.is_valid())
        self.assertIn("variants", serializer.errors)
Ejemplo n.º 5
0
    def test_serializer_rejects_duplicate_branch_names(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_GENERIC)

        self.control_variant_data["name"] = "Great branch"

        data = {
            "variants":
            [self.control_variant_data, self.treatment_variant_data]
        }

        serializer = ExperimentDesignBaseSerializer(instance=experiment,
                                                    data=data)

        self.assertFalse(serializer.is_valid())
        self.assertIn("variants", serializer.errors)
Ejemplo n.º 6
0
    def test_serializer_adds_new_variant(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_GENERIC)
        control_variant = ExperimentVariantFactory.create(
            experiment=experiment, is_control=True)
        treatment1_variant = ExperimentVariantFactory.create(
            experiment=experiment, is_control=False)

        self.assertEqual(experiment.variants.all().count(), 2)

        self.control_variant_data["id"] = control_variant.id
        self.control_variant_data["ratio"] = 33
        self.treatment_variant_data["id"] = treatment1_variant.id
        self.treatment_variant_data["ratio"] = 33

        treatment2_variant_data = {
            "name": "New Branch",
            "ratio": 34,
            "description": "New Branch",
            "is_control": False,
        }

        data = {
            "variants": [
                self.control_variant_data,
                self.treatment_variant_data,
                treatment2_variant_data,
            ]
        }

        serializer = ExperimentDesignBaseSerializer(
            instance=experiment, data=data, context={"request": self.request})

        self.assertTrue(serializer.is_valid())

        experiment = serializer.save()

        self.assertEqual(experiment.variants.all().count(), 3)

        new_variant = ExperimentVariant.objects.get(
            name=treatment2_variant_data["name"])
        self.assertEqual(
            set(experiment.variants.all()),
            set([control_variant, treatment1_variant, new_variant]),
        )
Ejemplo n.º 7
0
    def test_serializer_allows_special_char_branch_names(self):
        experiment = ExperimentFactory.create(
            type=ExperimentConstants.TYPE_PREF)

        self.control_variant_data["name"] = "&re@t -br@nche$!"

        data = {
            "variants":
            [self.control_variant_data, self.treatment_variant_data]
        }

        serializer = ExperimentDesignBaseSerializer(
            instance=experiment, data=data, context={"request": self.request})

        self.assertTrue(serializer.is_valid())
        serializer.save()

        variant = ExperimentVariant.objects.get(name="&re@t -br@nche$!")
        self.assertEqual(variant.slug, "ret-brnche")
Ejemplo n.º 8
0
    def test_update_change_log_creates_log_with_correct_change(self):

        experiment = ExperimentFactory.create()
        variant = ExperimentVariantFactory.create(
            experiment=experiment,
            ratio=100,
            description="it's a description",
            name="variant name",
        )

        variant_data = {
            "ratio": 100,
            "description": variant.description,
            "name": variant.name,
        }
        changed_values = {
            "variants": {
                "new_value": {
                    "variants": [variant_data]
                },
                "old_value": None,
                "display_name": "Branches",
            }
        }
        ExperimentChangeLog.objects.create(
            experiment=experiment,
            changed_by=UserFactory(),
            old_status=Experiment.STATUS_DRAFT,
            new_status=Experiment.STATUS_DRAFT,
            changed_values=changed_values,
            message="",
        )

        self.assertEqual(experiment.changes.count(), 1)

        change_data = {
            "variants": [{
                "id": variant.id,
                "ratio": 100,
                "description": "some other description",
                "name": "some other name",
                "is_control": False,
            }]
        }
        serializer = ExperimentDesignBaseSerializer(
            instance=experiment,
            data=change_data,
            context={"request": self.request})

        self.assertTrue(serializer.is_valid())
        experiment = serializer.save()

        serializer_variant_data = ExperimentVariantSerializer(variant).data

        self.assertEqual(experiment.changes.count(), 2)
        changed_values = experiment.changes.latest().changed_values

        variant = ExperimentVariant.objects.get(id=variant.id)
        changed_serializer_variant_data = ExperimentVariantSerializer(
            variant).data

        self.assertIn("variants", changed_values)
        self.assertEqual(changed_values["variants"]["old_value"],
                         [serializer_variant_data])
        self.assertEqual(changed_values["variants"]["new_value"],
                         [changed_serializer_variant_data])