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="", ), )
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())
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)
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!")
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)
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)
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], )
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], )
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)
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)
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)
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)
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])
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]))
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())
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])