Milimetric has uploaded a new change for review. https://gerrit.wikimedia.org/r/158630
Change subject: [WIP] Add Rolling Surviving New Active Editor ...................................................................... [WIP] Add Rolling Surviving New Active Editor NOTE: not ready but proof that I do TDD sometimes :) Bug: 67460 Change-Id: I38b324e0228833d47e5df71d2022432d6066372a --- M tests/test_metrics/test_rolling_new_active_editor.py A tests/test_metrics/test_rolling_surviving_new_active_editor.py 2 files changed, 165 insertions(+), 2 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/analytics/wikimetrics refs/changes/30/158630/1 diff --git a/tests/test_metrics/test_rolling_new_active_editor.py b/tests/test_metrics/test_rolling_new_active_editor.py index 6eb1ce8..30b9880 100644 --- a/tests/test_metrics/test_rolling_new_active_editor.py +++ b/tests/test_metrics/test_rolling_new_active_editor.py @@ -136,8 +136,6 @@ } for user_id, result in expected_results.items(): assert_equal(results[user_id][metric.id], result) - # users with no edits at all just won't show up - assert_equal(results.get(self.editor_ids[3], -1), -1) def test_wiki_cohort_nobody_qualifying(self): # make everyone fail the registration criteria and make sure they're excluded diff --git a/tests/test_metrics/test_rolling_surviving_new_active_editor.py b/tests/test_metrics/test_rolling_surviving_new_active_editor.py new file mode 100644 index 0000000..2b5ed88 --- /dev/null +++ b/tests/test_metrics/test_rolling_surviving_new_active_editor.py @@ -0,0 +1,165 @@ +from datetime import datetime, timedelta +from nose.tools import assert_true, assert_equal, assert_false + +from tests.fixtures import DatabaseTest, i, d +from wikimetrics.utils import format_pretty_date as s +from wikimetrics.models import Revision, Logging +from wikimetrics.metrics import RollingNewActiveEditor +from wikimetrics.enums import TimeseriesChoices + + +class RollingNewActiveEditorTest(DatabaseTest): + """ + TODO: add timeseries support and use the following tests: + gerrit.wikimedia.org/r/#/c/147312/5/tests/test_metrics/test_rolling_active_editor.py + """ + def runTest(self): + pass + + def setUp(self): + DatabaseTest.setUp(self) + + # registration for all the editors below + self.before_r = before_r = 20131201000000 + self.r = r = 20140101000000 + # exactly 30 days after registration + self.m = m = 20140131000000 + # exactly 60 days after registration + self.m2 = m2 = 20140302000000 + self.r_plus_60 = s(d(self.m2)) + self.editor_count = 12 + + self.create_test_cohort( + # 5 editors will have registered on time, 5 will not + editor_count=self.editor_count, + revisions_per_editor=8, + revision_timestamps=[ + # NOTE: these first 6 are registered BEFORE r + # this one will make 5 edits within 30 days of m, 3 after + [r + 1, r + 2, r + 3, r + 4, r + 5, m + 6, m + 7, m + 8], + # this one will make 3 edits within 30 days of m, 5 after + [r + 1, r + 2, r + 3, m + 4, m + 5, m + 6, m + 7, m + 8], + # this one will make 8 edits within 30 days of m, 0 after + [r + 1, r + 2, r + 3, r + 4, r + 5, r + 6, r + 7, r + 8], + # this one will make 0 edits within 30 days of m, 8 after + [m + 1, m + 2, m + 3, m + 4, m + 5, m + 6, m + 7, m + 8], + # this one will make the 5th edit right on m, 4 after + [r + 1, r + 2, r + 3, r + 4, m + 0, m + 6, m + 7, m + 8], + # this one will make no edits within r -> r + 60 days + [m2 + 1] * 8, + + # NOTE: these next 6 are registered AFTER r + # this one will make 5 edits within 30 days of m, 3 after + [r + 1, r + 2, r + 3, r + 4, r + 5, m + 6, m + 7, m + 8], + # this one will make 3 edits within 30 days of m, 5 after + [r + 1, r + 2, r + 3, m + 4, m + 5, m + 6, m + 7, m + 8], + # this one will make 8 edits within 30 days of m, 0 after + [r + 1, r + 2, r + 3, r + 4, r + 5, r + 6, r + 7, r + 8], + # this one will make 0 edits within 30 days of m, 8 after + [m + 1, m + 2, m + 3, m + 4, m + 5, m + 6, m + 7, m + 8], + # this one will make the 5th edit right on m, 4 after + [r + 1, r + 2, r + 3, r + 4, m + 0, m + 6, m + 7, m + 8], + # this one will make no edits within r -> r + 60 days + [m2 + 1] * 8, + ], + user_registrations=([before_r] * 6) + ([r] * 6), + revision_lengths=10 + ) + self.create_non_editors([ + (r, 'newusers', 'create'), + (r, 'newusers', 'create'), + (m, 'newusers', 'create'), + ]) + + def test_validates(self): + metric = RollingNewActiveEditor( + end_date='blah' + ) + assert_false(metric.validate()) + + metric = RollingNewActiveEditor( + end_date=self.r_plus_60, + ) + assert_true(metric.validate()) + + def test_normal_cohort(self): + metric = RollingNewActiveEditor( + end_date=self.r_plus_60, + ) + results = metric(self.editor_ids, self.mwSession) + + assert_equal(set(results.keys()), set(self.editor_ids)) + assert_equal([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0], [ + results[self.editor_ids[x]][metric.id] for x in range(self.editor_count) + ]) + + def test_normal_cohort_with_archived_revisions(self): + self.archive_revisions() + self.test_normal_cohort() + + def test_wiki_cohort(self): + # make one of the non-cohort users, who registered on self.r, active + make_active = self.non_editors[0] + self.mwSession.bind.engine.execute( + Revision.__table__.insert(), [ + { + 'rev_page' : self.page.page_id, + 'rev_user' : make_active.user_id, + 'rev_comment' : 'revision {}, additional'.format(rev), + 'rev_timestamp' : self.r + rev, + 'rev_len' : 10, + # rev_parent_id will not be set + } + for rev in range(1, 6) + ] + ) + self.mwSession.commit() + + expected = set(self.editor_ids + [make_active.user_id]) + # editors with no edits at all won't be picked up by the query + expected.remove(self.editor_ids[11]) + # editors that haven't registered in time shouldn't be picked up at all + expected.remove(self.editor_ids[0]) + expected.remove(self.editor_ids[1]) + expected.remove(self.editor_ids[2]) + expected.remove(self.editor_ids[3]) + expected.remove(self.editor_ids[4]) + expected.remove(self.editor_ids[5]) + + metric = RollingNewActiveEditor( + end_date=self.r_plus_60, + ) + results = metric(None, self.mwSession) + + print self.editor_ids + print expected + print results.keys() + assert_equal(set(results.keys()), expected) + expected_results = { + # all actives show, whether in a cohort or not + self.editor_ids[6] : 1, + self.editor_ids[8] : 1, + make_active.user_id : 1, + # users with not enough edits will show up with 0 as the result + self.editor_ids[7] : 0, + self.editor_ids[9] : 0, + self.editor_ids[10] : 0, + } + for user_id, result in expected_results.items(): + assert_equal(results[user_id][metric.id], result) + + def test_wiki_cohort_nobody_qualifying(self): + # make everyone fail the registration criteria and make sure they're excluded + self.mwSession.bind.engine.execute( + Logging.__table__.update().values({ + 'log_type': 'blah' + }) + ) + self.mwSession.commit() + + metric = RollingNewActiveEditor( + end_date=self.r_plus_60, + ) + results = metric(None, self.mwSession) + + assert_equal(results.keys(), []) -- To view, visit https://gerrit.wikimedia.org/r/158630 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I38b324e0228833d47e5df71d2022432d6066372a Gerrit-PatchSet: 1 Gerrit-Project: analytics/wikimetrics Gerrit-Branch: master Gerrit-Owner: Milimetric <dandree...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits