Пример #1
0
    def test_get_detail_returns_data_for_rapid_experiment(self):
        user_email = "*****@*****.**"
        owner = UserFactory(email=user_email)
        experiment = ExperimentRapidFactory.create_with_status(
            Experiment.STATUS_DRAFT,
            owner=owner,
        )

        response = self.client.get(
            reverse("experiments-rapid-detail",
                    kwargs={"slug": experiment.slug}),
            **{settings.OPENIDC_EMAIL_HEADER: user_email},
        )

        self.assertEqual(response.status_code, 200)

        json_data = json.loads(response.content)
        serialized_experiment = ExperimentRapidSerializer(experiment).data
        self.assertDictEqual(serialized_experiment, json_data)
 def test_outputs_expected_schema_for_empty_experiment(self):
     owner = UserFactory.create()
     experiment = NimbusExperiment.objects.create(owner=owner)
     data = dict(NimbusExperimentChangeLogSerializer(experiment).data)
     self.assertEqual(
         data,
         {
             "application": "",
             "branches": [],
             "channel": NimbusExperiment.Channel.NO_CHANNEL,
             "countries": [],
             "feature_config": None,
             "firefox_min_version": NimbusExperiment.Version.NO_VERSION,
             "hypothesis": NimbusExperiment.HYPOTHESIS_DEFAULT,
             "is_paused": False,
             "locales": [],
             "name": "",
             "owner": owner.email,
             "population_percent": "0.0000",
             "primary_outcomes": [],
             "projects": [],
             "proposed_duration":
             NimbusExperiment.DEFAULT_PROPOSED_DURATION,
             "proposed_enrollment":
             NimbusExperiment.DEFAULT_PROPOSED_ENROLLMENT,
             "public_description": "",
             "publish_status": NimbusExperiment.PublishStatus.IDLE.value,
             "published_dto": None,
             "results_data": None,
             "reference_branch": None,
             "risk_brand": None,
             "risk_mitigation_link": "",
             "risk_partner_related": None,
             "risk_revenue": None,
             "secondary_outcomes": [],
             "slug": "",
             "status": NimbusExperiment.Status.DRAFT.value,
             "status_next": None,
             "targeting_config_slug":
             NimbusExperiment.TargetingConfig.NO_TARGETING,
             "total_enrolled_clients": 0,
         },
     )
Пример #3
0
    def test_view_flips_subscribed_bool_and_redirects(self):
        user = UserFactory()
        experiment = ExperimentFactory.create()
        self.assertFalse(user in experiment.subscribers.all())

        response = self.client.post(
            reverse("experiments-subscribed-update",
                    kwargs={"slug": experiment.slug}),
            **{settings.OPENIDC_EMAIL_HEADER: user.email},
        )

        self.assertRedirects(
            response,
            reverse("experiments-detail", kwargs={"slug": experiment.slug}),
            fetch_redirect_response=False,
        )

        experiment = Experiment.objects.get(id=experiment.id)
        self.assertTrue(user in experiment.subscribers.all())
Пример #4
0
    def test_view_creates_experiment(self):
        user = UserFactory.create()
        user_email = user.email

        ds_issue_url = "https://jira.example.com/browse/DS-123"
        bugzilla_url = "https://bugzilla.example.com/show_bug.cgi?id=123"
        data = {
            "action": "continue",
            "type": Experiment.TYPE_PREF,
            "name": "A new experiment!",
            "short_description": "Let us learn new things",
            "public_name": "Public Name",
            "public_description": "Public Description",
            "data_science_issue_url": ds_issue_url,
            "feature_bugzilla_url": bugzilla_url,
            "related_work": "Designs: https://www.example.com/myproject/",
            "owner": user.id,
            "analysis_owner": user.id,
        }

        with self.settings(
                BUGZILLA_HOST="https://bugzilla.example.com",
                DS_ISSUE_HOST="https://jira.example.com/browse/",
        ):
            response = self.client.post(
                reverse("experiments-create"),
                data,
                **{settings.OPENIDC_EMAIL_HEADER: user_email},
            )

        self.assertEqual(response.status_code, 302)

        experiment = Experiment.objects.get()
        self.assertEqual(experiment.status, experiment.STATUS_DRAFT)
        self.assertEqual(experiment.name, data["name"])

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

        change = experiment.changes.get()

        self.assertEqual(change.changed_by, user)
        self.assertEqual(change.old_status, None)
        self.assertEqual(change.new_status, experiment.STATUS_DRAFT)
Пример #5
0
    def test_returns_200(self):
        user = UserFactory()
        user.is_staff = True
        user.is_superuser = True
        user.save()

        experiment = ExperimentFactory.create_with_status(
            ExperimentFactory.STATUS_DRAFT)
        response = self.client.get(
            reverse("admin:experiments_experiment_change",
                    kwargs={"object_id": experiment.id}),
            **{settings.OPENIDC_EMAIL_HEADER: user.email},
        )
        self.assertEqual(response.status_code, 200)
Пример #6
0
    def test_returns_200(self):
        user = UserFactory()
        user.is_staff = True
        user.is_superuser = True
        user.save()

        reportLog = ReportLogFactory.create()
        response = self.client.get(
            reverse(
                "admin:reporting_reportlog_change", kwargs={"object_id": reportLog.id}
            ),
            **{settings.OPENIDC_EMAIL_HEADER: user.email},
        )
        self.assertEqual(response.status_code, 200)
Пример #7
0
    def test_view_saves_experiment(self):
        user = UserFactory.create()
        user_email = user.email
        experiment = ExperimentFactory.create_with_status(
            Experiment.STATUS_DRAFT,
            proposed_enrollment=1,
            proposed_duration=2)

        bug_url = "https://bugzilla.mozilla.org/show_bug.cgi?id=123"
        data = {
            "action": "continue",
            "type": Experiment.TYPE_PREF,
            "name": "A new name!",
            "short_description": "A new description!",
            "data_science_bugzilla_url": bug_url,
            "feature_bugzilla_url": bug_url,
            "related_work": "Designs: https://www.example.com/myproject/",
            "owner": user.id,
            "analysis_owner": user.id,
        }

        response = self.client.post(
            reverse("experiments-overview-update",
                    kwargs={"slug": experiment.slug}),
            data,
            **{settings.OPENIDC_EMAIL_HEADER: user_email},
        )
        self.assertEqual(response.status_code, 302)

        experiment = Experiment.objects.get()
        self.assertEqual(experiment.name, data["name"])
        self.assertEqual(experiment.short_description,
                         data["short_description"])
        self.assertEqual(experiment.analysis_owner, user)

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

        change = experiment.changes.latest()

        self.assertEqual(change.changed_by, user)
        self.assertEqual(change.old_status, experiment.STATUS_DRAFT)
        self.assertEqual(change.new_status, experiment.STATUS_DRAFT)
Пример #8
0
    def test_serializer_creates_changelog_for_updates(self):
        owner = UserFactory(email="*****@*****.**")
        experiment = ExperimentFactory.create_with_status(
            target_status=Experiment.STATUS_DRAFT,
            type=Experiment.TYPE_RAPID,
            rapid_type=Experiment.RAPID_AA_CFR,
            owner=owner,
            name="rapid experiment",
            slug="rapid-experiment",
            objectives="gotta go fast",
            public_description=Experiment.BUGZILLA_RAPID_EXPERIMENT_TEMPLATE,
        )

        self.assertEqual(experiment.changes.count(), 1)
        data = {
            "name": "changing the name",
            "objectives": "changing objectives",
        }
        serializer = ExperimentRapidSerializer(
            instance=experiment, data=data, context={"request": self.request})
        self.assertTrue(serializer.is_valid())
        experiment = serializer.save()
        self.assertEqual(experiment.changes.count(), 2)

        changed_values = {
            "name": {
                "new_value": "changing the name",
                "old_value": "rapid experiment",
                "display_name": "Name",
            },
            "objectives": {
                "new_value": "changing objectives",
                "old_value": "gotta go fast",
                "display_name": "Objectives",
            },
        }
        self.assertTrue(
            experiment.changes.filter(
                old_status=Experiment.STATUS_DRAFT,
                new_status=Experiment.STATUS_DRAFT,
                changed_values=changed_values,
            ).exists())
Пример #9
0
    def test_get_unread_returns_unread_and_marks_as_read(self):
        user = UserFactory.create()

        unread_notifications = []
        for i in range(3):
            unread_notifications.append(
                NotificationFactory.create(user=user, read=False))

        read_notifications = []
        for i in range(3):
            read_notifications.append(
                NotificationFactory.create(user=user, read=True))

        self.assertTrue(user.notifications.has_unread)

        notifications = user.notifications.get_unread()

        self.assertFalse(user.notifications.has_unread)

        self.assertEqual(set(notifications), set(unread_notifications))
Пример #10
0
    def test_serializer_rejects_too_many_primary_probe_sets(self):
        user = UserFactory()
        experiment = NimbusExperimentFactory(probe_sets=[])
        probe_sets = [NimbusProbeSetFactory() for i in range(3)]

        serializer = NimbusProbeSetUpdateSerializer(
            experiment,
            {
                "primary_probe_sets": [p.id for p in probe_sets],
                "secondary_probe_sets": [],
            },
            context={"user": user},
        )

        self.assertEqual(experiment.changes.count(), 0)
        self.assertFalse(serializer.is_valid())
        self.assertEqual(experiment.changes.count(), 0)
        self.assertIn(
            "Exceeded maximum primary probe set limit of",
            serializer.errors["primary_probe_sets"][0],
        )
Пример #11
0
    def test_latest_review_request_returns_most_recent_review_request(self):
        reviewer = UserFactory()
        experiment = NimbusExperimentFactory.create_with_lifecycle(
            NimbusExperimentFactory.Lifecycles.CREATED,
        )
        experiment.publish_status = NimbusExperiment.PublishStatus.REVIEW
        experiment.save()

        generate_nimbus_changelog(experiment, experiment.owner, "test message")

        experiment.publish_status = NimbusExperiment.PublishStatus.IDLE
        experiment.save()
        generate_nimbus_changelog(experiment, reviewer, "test message")

        experiment.publish_status = NimbusExperiment.PublishStatus.REVIEW
        experiment.save()

        second_request = generate_nimbus_changelog(
            experiment, experiment.owner, "test message"
        )

        self.assertEqual(experiment.changes.latest_review_request(), second_request)
Пример #12
0
    def test_get_detail_returns_data_for_rapid_experiment(self):
        user_email = "*****@*****.**"

        owner = UserFactory(email=user_email)
        experiment = ExperimentFactory.create(
            type=Experiment.TYPE_RAPID,
            owner=owner,
            name="rapid experiment",
            objectives="gotta go fast",
        )

        response = self.client.get(
            reverse("experiments-rapid-detail",
                    kwargs={"slug": experiment.slug}),
            **{settings.OPENIDC_EMAIL_HEADER: user_email},
        )

        self.assertEqual(response.status_code, 200)

        json_data = json.loads(response.content)
        serialized_experiment = ExperimentRapidSerializer(experiment).data
        self.assertDictEqual(serialized_experiment, json_data)
Пример #13
0
    def test_view_creates_experiment(self):
        user = UserFactory.create()
        user_email = user.email

        bug_url = "https://bugzilla.mozilla.org/show_bug.cgi?id=123"
        data = {
            "type": Experiment.TYPE_PREF,
            "name": "A new experiment!",
            "short_description": "Let us learn new things",
            "data_science_bugzilla_url": bug_url,
            "feature_bugzilla_url": bug_url,
            "related_work": "Designs: https://www.example.com/myproject/",
            "proposed_start_date": timezone.now().date(),
            "proposed_enrollment": 10,
            "proposed_duration": 20,
            "owner": user.id,
        }

        with self.settings(BUGZILLA_HOST="https://bugzilla.mozilla.org"):
            response = self.client.post(
                reverse("experiments-create"),
                data,
                **{settings.OPENIDC_EMAIL_HEADER: user_email},
            )

        self.assertEqual(response.status_code, 302)

        experiment = Experiment.objects.get()
        self.assertEqual(experiment.status, experiment.STATUS_DRAFT)
        self.assertEqual(experiment.name, data["name"])

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

        change = experiment.changes.get()

        self.assertEqual(change.changed_by, user)
        self.assertEqual(change.old_status, None)
        self.assertEqual(change.new_status, experiment.STATUS_DRAFT)
Пример #14
0
 def test_serializer_updates_audience_on_experiment_invalid_channels(self):
     user = UserFactory()
     experiment = NimbusExperimentFactory(
         channel=None,
         application=NimbusExperiment.Application.FENIX,
         firefox_min_version=None,
         population_percent=0.0,
         proposed_duration=None,
         proposed_enrollment=None,
         targeting_config_slug=None,
         total_enrolled_clients=0,
     )
     serializer = NimbusAudienceUpdateSerializer(
         experiment,
         {
             "channel":
             NimbusConstants.Channel.DESKTOP_BETA.value,
             "firefox_min_version":
             NimbusConstants.Version.FIREFOX_80.value,
             "population_percent":
             10,
             "proposed_duration":
             42,
             "proposed_enrollment":
             120,
             "targeting_config_slug":
             (NimbusConstants.TargetingConfig.ALL_ENGLISH.value),
             "total_enrolled_clients":
             100,
         },
         context={"user": user},
     )
     self.assertEqual(experiment.changes.count(), 0)
     self.assertFalse(serializer.is_valid())
     self.assertEqual(
         serializer.errors,
         {"channel": ["Invalid channel for experiment application."]},
     )
Пример #15
0
    def test_serializer_rejects_duplicate_probes(self):
        user = UserFactory()
        experiment = NimbusExperimentFactory(probe_sets=[])
        probe_sets = [NimbusProbeSetFactory() for i in range(3)]

        serializer = NimbusProbeSetUpdateSerializer(
            experiment,
            {
                "primary_probe_sets": [
                    p.id for p in
                    probe_sets[:NimbusExperiment.MAX_PRIMARY_PROBE_SETS]
                ],
                "secondary_probe_sets": [p.id for p in probe_sets],
            },
            context={"user": user},
        )

        self.assertEqual(experiment.changes.count(), 0)
        self.assertFalse(serializer.is_valid())
        self.assertEqual(experiment.changes.count(), 0)
        self.assertEqual(
            serializer.errors["primary_probe_sets"][0],
            "Primary probe sets cannot overlap with secondary probe sets.",
        )
Пример #16
0
    def test_view_filters_by_subscriber(self):
        user = UserFactory(email="*****@*****.**")
        experiment1 = ExperimentFactory.create_with_status(
            Experiment.STATUS_DRAFT, name="a")
        experiment1.subscribers.add(user)
        experiment2 = ExperimentFactory.create_with_status(
            Experiment.STATUS_DRAFT, name="b")
        experiment2.subscribers.add(user)
        ExperimentFactory.create_with_variants()

        url = reverse("experiments-api-csv")
        response = self.client.get(
            f"{url}?subscribed=on",
            **{settings.OPENIDC_EMAIL_HEADER: user.email})

        self.assertEqual(response.status_code, 200)

        csv_data = response.content
        expected_csv_data = ExperimentCSVRenderer().render(
            ExperimentCSVSerializer([experiment1, experiment2],
                                    many=True).data,
            renderer_context={"header": ExperimentCSVSerializer.Meta.fields},
        )
        self.assertEqual(csv_data, expected_csv_data)
Пример #17
0
    def test_ordered_changes_orders_by_date(self):
        experiment = ExperimentFactory.create()

        date1 = datetime.datetime.now() - datetime.timedelta(days=2)
        date2 = datetime.datetime.now() - datetime.timedelta(days=1)
        date3 = datetime.datetime.now()

        user1 = UserFactory.create()
        user2 = UserFactory.create()
        user3 = UserFactory.create()

        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user1,
            changed_on=date1,
            message="a",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user1,
            changed_on=date1,
            message="b",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user1,
            changed_on=date1,
            message="b",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user2,
            changed_on=date1,
            message="c",
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user2,
            changed_on=date2,
            message="d",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user3,
            changed_on=date2,
            message="e",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user3,
            changed_on=date2,
            message="f",
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user1,
            changed_on=date3,
            message="g",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user1,
            changed_on=date3,
            message="h",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user2,
            changed_on=date3,
            message="i",
        )
        ExperimentChangeLogFactory.create(
            experiment=experiment,
            changed_by=user3,
            changed_on=date3,
            message="j",
        )

        expected_changes = {
            date1.date(): {
                user1: set(["a", "b"]),
                user2: set(["c"])
            },
            date2.date(): {
                user2: set(["d"]),
                user3: set(["e", "f"])
            },
            date3.date(): {
                user1: set(["g", "h"]),
                user2: set(["i"]),
                user3: set(["j"]),
            },
        }

        ordered_dates = [date for date, changes in experiment.ordered_changes]
        self.assertEqual(
            ordered_dates,
            [date3.date(), date2.date(),
             date1.date()])

        day3_users = [
            user for user, user_changes in experiment.ordered_changes[0][1]
        ]
        self.assertEqual(set(day3_users), set([user1, user2, user3]))

        day2_users = [
            user for user, user_changes in experiment.ordered_changes[1][1]
        ]
        self.assertEqual(set(day2_users), set([user2, user3]))

        day1_users = [
            user for user, user_changes in experiment.ordered_changes[2][1]
        ]
        self.assertEqual(set(day1_users), set([user1, user2]))

        for date, date_changes in experiment.ordered_changes:
            for user, user_changes in date_changes:
                self.assertEqual(user_changes, expected_changes[date][user])
Пример #18
0
    def test_grouped_changes_groups_by_date_then_user(self):
        experiment = ExperimentFactory.create()

        date1 = datetime.datetime.now() - datetime.timedelta(days=2)
        date2 = datetime.datetime.now() - datetime.timedelta(days=1)
        date3 = datetime.datetime.now()

        user1 = UserFactory.create()
        user2 = UserFactory.create()
        user3 = UserFactory.create()

        change1 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user1,
                                                    changed_on=date1)
        change2 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user1,
                                                    changed_on=date1)
        change3 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user1,
                                                    changed_on=date1)
        change4 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user2,
                                                    changed_on=date1)

        change5 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user2,
                                                    changed_on=date2)
        change6 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user3,
                                                    changed_on=date2)
        change7 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user3,
                                                    changed_on=date2)

        change8 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user1,
                                                    changed_on=date3)
        change9 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                    changed_by=user1,
                                                    changed_on=date3)
        change10 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                     changed_by=user2,
                                                     changed_on=date3)
        change11 = ExperimentChangeLogFactory.create(experiment=experiment,
                                                     changed_by=user3,
                                                     changed_on=date3)

        self.assertEqual(
            set(experiment.grouped_changes.keys()),
            set([date1.date(), date2.date(),
                 date3.date()]),
        )
        self.assertEqual(
            set(experiment.grouped_changes[date1.date()].keys()),
            set([user1, user2]),
        )
        self.assertEqual(
            set(experiment.grouped_changes[date2.date()].keys()),
            set([user2, user3]),
        )
        self.assertEqual(
            set(experiment.grouped_changes[date3.date()].keys()),
            set([user1, user2, user3]),
        )

        self.assertEqual(
            experiment.grouped_changes[date1.date()][user1],
            set([change1, change2, change3]),
        )
        self.assertEqual(experiment.grouped_changes[date1.date()][user2],
                         set([change4]))

        self.assertEqual(experiment.grouped_changes[date2.date()][user2],
                         set([change5]))
        self.assertEqual(
            experiment.grouped_changes[date2.date()][user3],
            set([change6, change7]),
        )

        self.assertEqual(
            experiment.grouped_changes[date3.date()][user1],
            set([change8, change9]),
        )
        self.assertEqual(experiment.grouped_changes[date3.date()][user2],
                         set([change10]))
        self.assertEqual(experiment.grouped_changes[date3.date()][user3],
                         set([change11]))
Пример #19
0
    def test_generate_change_log_gives_correct_output(self):
        experiment = ExperimentFactory.create_with_status(
            target_status=Experiment.STATUS_REVIEW,
            num_variants=0,
            short_description="description",
            qa_status="pretty good",
            firefox_min_version="55.0",
        )
        variant1 = ExperimentVariantFactory.create(
            experiment=experiment,
            ratio=75,
            description="variant1 description",
            name="variant1",
            slug="variant1-slug",
        )
        variant1.save()
        old_serialized_val = ChangeLogSerializer(experiment).data

        experiment.short_description = "changing the description"
        experiment.qa_status = "good"
        experiment.firefox_min_version = "56.0"
        variant2 = ExperimentVariantFactory.create(
            experiment=experiment,
            ratio=25,
            description="variant2 description",
            name="variant2",
            slug="variant2-slug",
        )
        variant2.save()

        VariantPreferencesFactory.create(
            variant=variant2,
            pref_name="p1",
            pref_type=Experiment.PREF_TYPE_INT,
            pref_branch=Experiment.PREF_BRANCH_DEFAULT,
            pref_value="5",
        )

        experiment.save()
        new_serialized_val = ChangeLogSerializer(experiment).data
        changed_variant_pref = {
            "pref_name": "p1",
            "pref_type": "integer",
            "pref_branch": "default",
            "pref_value": "5",
        }
        changed_data = {
            "short_description": "changing the description",
            "qa_status": "good",
            "firefox_min_version": "56.0",
            "variants": [
                {
                    "ratio": 25,
                    "description": "variant2 description",
                    "name": "variant2",
                    "slug": "variant2-slug",
                    "preferences": [changed_variant_pref],
                }
            ],
        }

        user = UserFactory.create()

        generate_change_log(
            old_serialized_val, new_serialized_val, experiment, changed_data, user
        )

        changed_value = experiment.changes.latest().changed_values
        expected_changed_value = {
            "firefox_min_version": {
                "display_name": "Firefox Min Version",
                "new_value": "56.0",
                "old_value": "55.0",
            },
            "qa_status": {
                "display_name": "Qa Status",
                "new_value": "good",
                "old_value": "pretty good",
            },
            "short_description": {
                "display_name": "Short Description",
                "new_value": "changing the description",
                "old_value": "description",
            },
            "variants": {
                "display_name": "Branches",
                "new_value": [
                    {
                        "ratio": 25,
                        "description": "variant2 description",
                        "name": "variant2",
                        "slug": "variant2-slug",
                    },
                    {
                        "ratio": 75,
                        "description": "variant1 description",
                        "name": "variant1",
                        "slug": "variant1-slug",
                    },
                ],
                "old_value": [
                    {
                        "ratio": 75,
                        "description": "variant1 description",
                        "name": "variant1",
                        "slug": "variant1-slug",
                    }
                ],
            },
        }
        self.assertEqual(
            expected_changed_value["firefox_min_version"],
            changed_value["firefox_min_version"],
        )
        self.assertEqual(expected_changed_value["qa_status"], changed_value["qa_status"])
        self.assertEqual(
            expected_changed_value["short_description"],
            changed_value["short_description"],
        )
        self.assertCountEqual(
            expected_changed_value["variants"], changed_value["variants"]
        )
Пример #20
0
 def test_filters_by_analysis_owner(self):
     user = UserFactory.create()
     experiment = ExperimentFactory.create(analysis_owner=user)
     filter = ExperimentFilterset(data={"analysis_owner": user.id})
     self.assertEqual(set(filter.qs), set([experiment]))
 def setUp(self):
     self.user = UserFactory.create()
Пример #22
0
 def test_filter_by_analysis_owner_invalid_for_non_analysis_owner(self):
     user = UserFactory.create()
     filter = ExperimentFilterset(data={"analysis_owner": user.id})
     self.assertFalse(filter.is_valid())
Пример #23
0
    def test_clone(self):
        user_1 = UserFactory.create()
        user_2 = UserFactory.create()

        experiment = ExperimentFactory.create_with_variants(
            name="great experiment",
            status=Experiment.STATUS_COMPLETE,
            short_description="This is going to be a great experiment.",
            proposed_start_date=datetime.date(2019, 4, 1),
            related_work="See also this other experiment.",
            proposed_enrollment=2,
            proposed_duration=30,
            owner=user_1,
            bugzilla_id="4455667",
            pref_type=Experiment.TYPE_ADDON,
            data_science_bugzilla_url="https://bugzilla.mozilla.org/123/",
            feature_bugzilla_url="https://bugzilla.mozilla.org/123/",
            addon_experiment_id="addon-id",
            addon_release_url="addon-url",
            archived=True,
            review_science=True,
            review_ux=True,
            firefox_min_version=Experiment.VERSION_CHOICES[1][0],
            firefox_max_version="",
        )

        experiment.clone("best experiment", user_2)

        cloned_experiment = Experiment.objects.filter(
            name="best experiment").get()

        self.assertTrue(cloned_experiment.parent, experiment.id)
        self.assertEqual(cloned_experiment.status, Experiment.STATUS_DRAFT)
        self.assertEqual(
            cloned_experiment.short_description,
            "This is going to be a great experiment.",
        )
        self.assertEqual(cloned_experiment.related_work,
                         "See also this other experiment.")
        self.assertEqual(cloned_experiment.proposed_enrollment, 2)
        self.assertEqual(cloned_experiment.proposed_duration, 30)
        self.assertEqual(cloned_experiment.pref_type, Experiment.TYPE_ADDON)
        self.assertEqual(cloned_experiment.proposed_start_date, None)
        self.assertEqual(cloned_experiment.owner, user_2)
        self.assertEqual(
            cloned_experiment.firefox_min_version,
            Experiment.VERSION_CHOICES[1][0],
        )
        self.assertFalse(cloned_experiment.bugzilla_id)
        self.assertFalse(cloned_experiment.archived)
        self.assertFalse(cloned_experiment.review_science)
        self.assertFalse(cloned_experiment.review_ux)
        self.assertFalse(cloned_experiment.addon_experiment_id)
        self.assertFalse(cloned_experiment.addon_release_url)

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

        change = cloned_experiment.changes.latest()

        self.assertEqual(change.old_status, None)
        self.assertEqual(change.new_status, experiment.STATUS_DRAFT)
Пример #24
0
 def test_get_owner_display_value_returns_user_str(self):
     user = UserFactory.create()
     form = ExperimentFiltersetForm({"owner": user.id})
     self.assertEqual(form.get_owner_display_value(), str(user))
Пример #25
0
    def test_form_saves_reviews(self):
        user = UserFactory.create()
        content_type = ContentType.objects.get_for_model(Experiment)
        experiment_model_permissions = Permission.objects.filter(
            content_type=content_type, codename__startswith="can_check")
        for permission in experiment_model_permissions:
            user.user_permissions.add(permission)

        self.request.user = user

        experiment = ExperimentFactory.create_with_status(
            Experiment.STATUS_REVIEW)
        self.assertEqual(experiment.changes.count(), 2)

        self.assertFalse(experiment.review_science)
        self.assertFalse(experiment.review_engineering)
        self.assertFalse(experiment.review_qa_requested)
        self.assertFalse(experiment.review_intent_to_ship)
        self.assertFalse(experiment.review_bugzilla)
        self.assertFalse(experiment.review_qa)
        self.assertFalse(experiment.review_relman)
        self.assertFalse(experiment.review_advisory)
        self.assertFalse(experiment.review_legal)
        self.assertFalse(experiment.review_ux)
        self.assertFalse(experiment.review_security)
        self.assertFalse(experiment.review_vp)
        self.assertFalse(experiment.review_data_steward)
        self.assertFalse(experiment.review_comms)
        self.assertFalse(experiment.review_impacted_teams)

        data = {
            "review_science": True,
            "review_engineering": True,
            "review_qa_requested": True,
            "review_intent_to_ship": True,
            "review_bugzilla": True,
            "review_qa": True,
            "review_relman": True,
            "review_advisory": True,
            "review_legal": True,
            "review_ux": True,
            "review_security": True,
            "review_vp": True,
            "review_data_steward": True,
            "review_comms": True,
            "review_impacted_teams": True,
        }

        form = ExperimentReviewForm(request=self.request,
                                    data=data,
                                    instance=experiment)

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

        self.assertTrue(experiment.review_science)
        self.assertTrue(experiment.review_engineering)
        self.assertTrue(experiment.review_qa_requested)
        self.assertTrue(experiment.review_intent_to_ship)
        self.assertTrue(experiment.review_bugzilla)
        self.assertTrue(experiment.review_qa)
        self.assertTrue(experiment.review_relman)
        self.assertTrue(experiment.review_advisory)
        self.assertTrue(experiment.review_legal)
        self.assertTrue(experiment.review_ux)
        self.assertTrue(experiment.review_security)
        self.assertTrue(experiment.review_vp)
        self.assertTrue(experiment.review_data_steward)
        self.assertTrue(experiment.review_comms)
        self.assertTrue(experiment.review_impacted_teams)

        self.assertEqual(experiment.changes.count(), 3)
Пример #26
0
    def test_post_detail_edits_rapid_experiment(self):
        user_email = "*****@*****.**"
        audience = "us_only"
        features = ["picture_in_picture", "pinned_tabs"]

        owner = UserFactory(email=user_email)
        experiment = ExperimentRapidFactory.create_with_status(
            Experiment.STATUS_DRAFT,
            owner=owner,
            name="rapid experiment",
            slug="rapid-experiment",
            objectives="gotta go fast",
            audience=audience,
            features=features,
            firefox_min_version="79.0",
            firefox_channel=Experiment.CHANNEL_NIGHTLY,
        )

        control_variant = experiment.variants.get(is_control=True)
        treatment_variant = experiment.variants.get(is_control=False)

        data = json.dumps({
            "name":
            "new name",
            "objectives":
            "new hypothesis",
            "audience":
            audience,
            "features":
            features,
            "firefox_min_version":
            "80.0",
            "firefox_channel":
            Experiment.CHANNEL_RELEASE,
            "variants": [
                {
                    "id": control_variant.id,
                    "slug": "control",
                    "name": "control",
                    "ratio": 50,
                    "description": "a variant",
                    "is_control": True,
                },
                {
                    "id": treatment_variant.id,
                    "slug": "variant",
                    "name": "variant",
                    "ratio": 50,
                    "description": "a variant",
                    "is_control": False,
                },
            ],
        })

        response = self.client.put(
            reverse("experiments-rapid-detail",
                    kwargs={"slug": experiment.slug}),
            data,
            content_type="application/json",
            **{settings.OPENIDC_EMAIL_HEADER: user_email},
        )

        self.assertEqual(response.status_code, 200)
        experiment = Experiment.objects.get()
        self.assertEqual(experiment.owner.email, user_email)
        self.assertEqual(experiment.name, "new name")
        self.assertEqual(experiment.slug, "rapid-experiment")
        self.assertEqual(experiment.objectives, "new hypothesis")
        self.assertEqual(experiment.audience, audience)
        self.assertEqual(experiment.features, features)
        self.assertEqual(experiment.firefox_min_version, "80.0")
        self.assertEqual(experiment.firefox_channel,
                         Experiment.CHANNEL_RELEASE)
Пример #27
0
    def test_ordered_changes_orders_by_date(self):
        experiment = ExperimentFactory.create()

        date1 = timezone.now() - datetime.timedelta(days=2)
        date2 = timezone.now() - datetime.timedelta(days=1)
        date3 = timezone.now()

        user1 = UserFactory.create()
        user2 = UserFactory.create()
        user3 = UserFactory.create()

        a = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user1, changed_on=date1, message="a"
        )
        b = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user1, changed_on=date1, message="b"
        )

        c = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user2, changed_on=date1, message="c"
        )

        d = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user2, changed_on=date2, message="d"
        )
        e = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user3, changed_on=date2, message="e"
        )
        f = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user3, changed_on=date2, message="f"
        )

        g = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user1, changed_on=date3, message="g"
        )
        h = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user1, changed_on=date3, message="h"
        )
        i = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user2, changed_on=date3, message="i"
        )
        j = ExperimentChangeLogFactory.create(
            experiment=experiment, changed_by=user3, changed_on=date3, message="j"
        )

        expected_changes = {
            date1.date(): {user1: set([a, b]), user2: set([c])},
            date2.date(): {user2: set([d]), user3: set([e, f])},
            date3.date(): {user1: set([g, h]), user2: set([i]), user3: set([j])},
        }

        ordered_dates = [date for date, changes in experiment.ordered_changes]
        self.assertEqual(ordered_dates, [date3.date(), date2.date(), date1.date()])

        day3_users = [user for user, user_changes in experiment.ordered_changes[0][1]]
        self.assertEqual(set(day3_users), set([user1, user2, user3]))

        day2_users = [user for user, user_changes in experiment.ordered_changes[1][1]]
        self.assertEqual(set(day2_users), set([user2, user3]))

        day1_users = [user for user, user_changes in experiment.ordered_changes[2][1]]
        self.assertEqual(set(day1_users), set([user1, user2]))

        for date, date_changes in experiment.ordered_changes:
            for user, user_changes in date_changes:
                self.assertEqual(user_changes, expected_changes[date][user])
Пример #28
0
    def test_has_unread_true_when_some_unread(self):
        user = UserFactory.create()

        NotificationFactory.create(user=user, read=False)

        self.assertTrue(user.notifications.has_unread)
Пример #29
0
 def setUp(self):
     super().setUp()
     self.user = UserFactory()
Пример #30
0
    def setUp(self):
        super().setUp()

        self.user = UserFactory()
        self.request = mock.Mock()
        self.request.user = self.user