Beispiel #1
0
    def test_monitoring_dashboard_url_returns_url_when_experiment_is_addon(
            self):
        experiment = ExperimentFactory.create(
            type=Experiment.TYPE_ADDON,
            slug="experiment",
            status=Experiment.STATUS_LIVE,
            normandy_slug="normandy-slug",
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment,
            old_status=Experiment.STATUS_ACCEPTED,
            new_status=Experiment.STATUS_LIVE,
            changed_on=datetime.date(2019, 5, 1),
        )

        changed_on_in_milliseconds = 1556582400000

        self.assertEqual(
            experiment.monitoring_dashboard_url,
            settings.MONITORING_URL.format(
                slug=experiment.normandy_slug,
                from_date=changed_on_in_milliseconds,
                to_date="",
            ),
        )
Beispiel #2
0
 def test_start_date_returns_datetime_if_change_exists(self):
     change = ExperimentChangeLogFactory.create(
         old_status=Experiment.STATUS_ACCEPTED,
         new_status=Experiment.STATUS_LIVE,
     )
     self.assertEqual(change.experiment.start_date,
                      change.changed_on.date())
Beispiel #3
0
    def test_change_values(self):
        experiment = ExperimentFactory.create()
        old_values = {
            "slug": "a slug",
            "name": "a name",
            "short_description": "a short description",
            "countries": [{"code": "a"}, {"code": "b"}],
        }
        new_values = {
            "slug": "a  new slug",
            "name": "a new name",
            "short_description": "a new short description",
            "countries": [{"code": "c"}, {"code": "d"}],
        }
        changelog = ExperimentChangeLogFactory.create(
            experiment=experiment,
            old_status=Experiment.STATUS_DRAFT,
            new_status=Experiment.STATUS_REVIEW,
            old_values=old_values,
            new_values=new_values,
        )

        expected_data = {
            "slug": {"old_value": "a slug", "new_value": "a  new slug"},
            "name": {"old_value": "a name", "new_value": "a new name"},
            "short_description": {
                "old_value": "a short description",
                "new_value": "a new short description",
            },
            "countries": {"old_value": "a, b", "new_value": "c, d"},
        }
        self.assertEqual(expected_data, changelog.changed_values)
Beispiel #4
0
    def test_change_message(self):
        experiment = ExperimentFactory.create_with_variants()
        changelog = ExperimentChangeLogFactory.create(
            experiment=experiment,
            old_status=Experiment.STATUS_DRAFT,
            new_status=Experiment.STATUS_REVIEW,
            message="its a message!",
        )

        self.assertEqual(str(changelog), "its a message!")
Beispiel #5
0
    def test_pretty_status_created_draft(self):
        experiment = ExperimentFactory.create_with_variants()

        for (
            old_status,
            new_statuses,
        ) in ExperimentChangeLog.PRETTY_STATUS_LABELS.items():
            for new_status, expected_label in new_statuses.items():
                changelog = ExperimentChangeLogFactory.create(
                    experiment=experiment, old_status=old_status, new_status=new_status
                )
                self.assertEqual(changelog.pretty_status, expected_label)
Beispiel #6
0
    def test_latest_returns_most_recent_changelog(self):
        now = datetime.datetime.now()
        experiment = ExperimentFactory.create_with_variants()

        changelog1 = ExperimentChangeLogFactory.create(
            experiment=experiment,
            old_status=None,
            new_status=Experiment.STATUS_DRAFT,
            changed_on=(now - datetime.timedelta(days=2)),
        )

        self.assertEqual(experiment.changes.latest(), changelog1)

        changelog2 = ExperimentChangeLogFactory.create(
            experiment=experiment,
            old_status=Experiment.STATUS_DRAFT,
            new_status=Experiment.STATUS_REVIEW,
            changed_on=(now - datetime.timedelta(days=1)),
        )

        self.assertEqual(experiment.changes.latest(), changelog2)
Beispiel #7
0
    def test_most_recently_changed_orders_by_latest_changes(self):
        now = datetime.datetime.now()
        experiment1 = ExperimentFactory.create_with_variants()
        experiment2 = ExperimentFactory.create_with_variants()

        ExperimentChangeLogFactory.create(
            experiment=experiment1,
            old_status=None,
            new_status=Experiment.STATUS_CREATED,
            changed_on=(now - datetime.timedelta(days=2)),
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment2,
            old_status=None,
            new_status=Experiment.STATUS_CREATED,
            changed_on=(now - datetime.timedelta(days=1)),
        )

        self.assertEqual(
            list(Experiment.objects.most_recently_changed()),
            [experiment2, experiment1],
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment1,
            old_status=experiment1.status,
            new_status=Experiment.STATUS_PENDING,
        )

        self.assertEqual(
            list(Experiment.objects.most_recently_changed()),
            [experiment1, experiment2],
        )
Beispiel #8
0
    def test_queryset_annotated_with_latest_change(self):
        now = datetime.datetime.now()
        experiment1 = ExperimentFactory.create_with_variants()
        experiment2 = ExperimentFactory.create_with_variants()

        ExperimentChangeLogFactory.create(
            experiment=experiment1,
            old_status=None,
            new_status=Experiment.STATUS_DRAFT,
            changed_on=(now - datetime.timedelta(days=2)),
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment2,
            old_status=None,
            new_status=Experiment.STATUS_DRAFT,
            changed_on=(now - datetime.timedelta(days=1)),
        )

        self.assertEqual(
            list(Experiment.objects.order_by("-latest_change")),
            [experiment2, experiment1],
        )

        ExperimentChangeLogFactory.create(
            experiment=experiment1,
            old_status=experiment1.status,
            new_status=Experiment.STATUS_REVIEW,
        )

        self.assertEqual(
            list(Experiment.objects.order_by("-latest_change")),
            [experiment1, experiment2],
        )
Beispiel #9
0
 def test_str_change_log_include_new_values(self):
     experiment = ExperimentFactory.create()
     changelog = ExperimentChangeLogFactory.create(
         experiment=experiment,
         old_status=Experiment.STATUS_DRAFT,
         new_status=Experiment.STATUS_DRAFT,
         new_values={
             "name": "a new experiment!",
             "description": "my description!",
         },
     )
     expected_string = "Edited Experiment: \nname\ndescription"
     self.assertEqual(str(changelog), expected_string)
Beispiel #10
0
    def test_pretty_status_created_draft(self):
        experiment = ExperimentFactory.create_with_variants()

        for old_status in ExperimentChangeLog.PRETTY_STATUS_LABELS.keys():
            for new_status in ExperimentChangeLog.PRETTY_STATUS_LABELS[
                    old_status].keys():
                expected_label = ExperimentChangeLog.PRETTY_STATUS_LABELS[
                    old_status][new_status]

                changelog = ExperimentChangeLogFactory.create(
                    experiment=experiment,
                    old_status=old_status,
                    new_status=new_status,
                )
                self.assertEqual(changelog.pretty_status, expected_label)
Beispiel #11
0
    def test_serializer_outputs_expected_schema(self):
        change_log = ExperimentChangeLogFactory.create(
            changed_on="2019-08-02T18:19:26.267960Z",
            new_status="Review",
            old_status="Draft",
            old_values="2019-08-02T18:19:26.267960Z",
            new_values="2019-08-10T18:19:00.000000Z",
        )

        serializer = ExperimentChangeLogSerializer(change_log)

        self.assertEqual(serializer.data["changed_on"], change_log.changed_on)
        self.assertEqual(serializer.data["new_status"], change_log.new_status)
        self.assertEqual(serializer.data["old_status"], change_log.old_status)
        self.assertEqual(serializer.data["old_values"], change_log.old_values)
        self.assertEqual(serializer.data["new_values"], change_log.new_values)
Beispiel #12
0
    def test_send_experiment_change_email(self):
        experiment = ExperimentFactory.create(
            name="exp1", type=ExperimentConstants.TYPE_PREF)
        user = UserFactory.create(email="*****@*****.**")
        change = ExperimentChangeLogFactory.create(experiment=experiment,
                                                   changed_by=user)
        send_experiment_change_email(change)
        sent_email = mail.outbox[-1]

        expected_subject = (
            "[Experimenter]: [email protected] made a change to Pref-Flip Experiment: exp1"
        )
        self.assertEqual(sent_email.subject, expected_subject)
        self.assertEqual(sent_email.content_subtype, "html")
        self.assertTrue(
            experiment.emails.filter(
                type=ExperimentConstants.EXPERIMENT_EDIT).exists())
 def test_serializer_outputs_expected_schema(self):
     change_log = ExperimentChangeLogFactory.create(
         changed_on="2019-08-02T18:19:26.267960Z")
     serializer = ExperimentChangeLogSerializer(change_log)
     self.assertEqual(serializer.data["changed_on"], change_log.changed_on)
Beispiel #14
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])
Beispiel #15
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]))
Beispiel #16
0
 def test_end_date_returns_datetime_if_change_exists(self):
     change = ExperimentChangeLogFactory.create(
         old_status=Experiment.STATUS_LIVE, new_status=Experiment.STATUS_COMPLETE
     )
     self.assertEqual(change.experiment.end_date, change.changed_on.date())
Beispiel #17
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])