def create_site_daily_metrics_data(site, start_date, end_date): ''' NOTE: We can generalize this and the `create_course_daily_metrics_data` function with considering that the course mertrics creation method can assign a course id. When we become site-aware, then the site metrics will also need to be able to assign a site identifier ''' def incr_func(key): return dict( cumulative_active_user_count=2, todays_active_user_count=2, total_user_count=5, course_count=1, total_enrollment_count=3, ).get(key, 0) # Initial values data = dict( cumulative_active_user_count=50, todays_active_user_count=10, total_user_count=5, course_count=5, total_enrollment_count=100, ) metrics = [] for dt in rrule(DAILY, dtstart=start_date, until=end_date): metrics.append(SiteDailyMetricsFactory(date_for=dt, site=site, **data)) data.update( {key: val + incr_func(key) for key, val in six.iteritems(data)}) return metrics
def setup(self, db): self.date_for = datetime.date(2018, 10, 1) self.site = Site.objects.first() self.users = [ UserFactory(date_joined=as_datetime(self.date_for - datetime.timedelta(days=60))) for i in range(0, 3) ] self.course_overviews = [ CourseOverviewFactory( created=as_datetime(self.date_for - datetime.timedelta(days=60))) for i in range(0, 3) ] self.cdm_recs = [ CourseDailyMetricsFactory(site=self.site, date_for=self.date_for, **cdm) for cdm in CDM_INPUT_TEST_DATA ] self.prev_day_sdm = SiteDailyMetricsFactory(site=self.site, date_for=prev_day( self.date_for), **SDM_DATA[1]) if is_multisite(): self.organization = OrganizationFactory(sites=[self.site]) for co in self.course_overviews: OrganizationCourseFactory(organization=self.organization, course_id=str(co.id)) if organizations_support_sites(): for user in self.users: UserOrganizationMappingFactory( user=user, organization=self.organization)
def test_get_previous_cumulative_active_user_count(self, prev_day_data, expected): if prev_day_data: SiteDailyMetricsFactory( date_for=prev_day(self.date_for), **prev_day_data) actual = pipeline_sdm.get_previous_cumulative_active_user_count( date_for=self.date_for) assert actual == expected
def test_get_previous_cumulative_active_user_count_not_yesterday(self): prior_date = days_from(self.date_for, -5) prior_sdm = SiteDailyMetricsFactory(site=self.site, date_for=prior_date, **SDM_DATA[1]) actual = pipeline_sdm.get_previous_cumulative_active_user_count( site=self.site, date_for=self.date_for) assert prior_sdm.cumulative_active_user_count > 0 assert actual == prior_sdm.cumulative_active_user_count
def test_get_site_mau_history_metrics_basic(db, monkeypatch): """Simple data, skipping doing a fixture for now Expected data: {'current_month': 12, 'history': [{'period': '2019/12', 'value': 6}, {'period': '2020/01', 'value': 7}, {'period': '2020/02', 'value': 8}, {'period': '2020/03', 'value': 9}, {'period': '2020/04', 'value': 10}, {'period': '2020/05', 'value': 11}, {'period': '2020/06', 'value': 12}]} TODO: We want to revisit both this test and the function under test """ all_months_back = 12 months_back = 6 mock_today = date(year=2020, month=6, day=1) last_month = mock_today - relativedelta(months=1) freezer = freeze_time(mock_today) freezer.start() start_month = mock_today - relativedelta(months=all_months_back) smm = [] our_site = SiteFactory() other_site = SiteFactory() for site in [our_site, other_site]: for counter, dt in enumerate( rrule(freq=MONTHLY, dtstart=start_month, until=last_month)): month_for = date(year=dt.year, month=dt.month, day=1) smm.append( SiteMonthlyMetricsFactory(site=site, month_for=month_for, active_user_count=counter)) current_month_active = 42 SiteDailyMetricsFactory(site=our_site, date_for=mock_today - relativedelta(day=2), mau=current_month_active) data = get_site_mau_history_metrics(site=our_site, months_back=months_back) freezer.stop() assert data['current_month'] == current_month_active for rec in data['history'][:-1]: year, month = [int(val) for val in rec['period'].split('/')] month_for = date(year=year, month=month, day=1) obj = SiteMonthlyMetrics.objects.get(site=our_site, month_for=month_for) assert obj.active_user_count == rec['value'] assert obj.site == our_site
def setup(self, db): ''' ''' self.site = Site.objects.first() self.date_fields = set([ 'date_for', 'created', 'modified', ]) self.expected_results_keys = set( [o.name for o in SiteDailyMetrics._meta.fields]) self.site_daily_metrics = SiteDailyMetricsFactory() self.serializer = SiteDailyMetricsSerializer( instance=self.site_daily_metrics)
def setup(self, db): self.date_for = datetime.date(2018, 10, 1) self.users = [UserFactory( date_joined=as_datetime(self.date_for - datetime.timedelta(days=60)) ) for i in range(0, 3)] self.course_overviews = [CourseOverviewFactory( created=as_datetime(self.date_for - datetime.timedelta(days=60)) ) for i in range(0, 3)] self.cdm_recs = [CourseDailyMetricsFactory( date_for=self.date_for, **cdm ) for cdm in CDM_INPUT_TEST_DATA] self.prev_day_sdm = SiteDailyMetricsFactory( date_for=prev_day(self.date_for), **SDM_PREV_DAY[1])
def sdm_test_data(db): """Quick-n-dirty test data construction Expected count is the highest 'total_user_count' """ dates = [ datetime(year=2020, month=3, day=15), datetime(year=2020, month=4, day=1), datetime(year=2020, month=4, day=15), datetime(year=2020, month=4, day=30), datetime(year=2020, month=5, day=1) ] our_date_range = [ datetime(year=2020, month=4, day=1), datetime(year=2020, month=4, day=30), ] my_site = SiteFactory() other_site = SiteFactory() my_sdm = [ # month before SiteDailyMetricsFactory(site=my_site, date_for=dates[0], total_user_count=10), # in our date range SiteDailyMetricsFactory(site=my_site, date_for=dates[1], total_user_count=20), SiteDailyMetricsFactory(site=my_site, date_for=dates[2], total_user_count=30), SiteDailyMetricsFactory(site=my_site, date_for=dates[3], total_user_count=25), # month after SiteDailyMetricsFactory(site=my_site, date_for=dates[4], total_user_count=500), ] # Create one SDM record for the other site in the month we query other_sdm = [ SiteDailyMetricsFactory(site=other_site, date_for=dates[2], total_user_count=13)] return dict( our_date_range=our_date_range, my_site=my_site, other_site=other_site, my_sdm=my_sdm, other_sdm=other_sdm, expected_count=30, )
def test_latest_previous_record(self): site = SiteFactory() # Create a set of records with non-continuous dates dates = [ datetime.date(2019, 10, 1), datetime.date(2019, 10, 2), datetime.date(2019, 10, 5), datetime.date(2019, 10, 29), datetime.date(2019, 11, 3), ] for rec_date in dates: SiteDailyMetricsFactory(site=site, date_for=rec_date) rec = SiteDailyMetrics.latest_previous_record(site=site) assert rec.date_for == dates[-1] rec2 = SiteDailyMetrics.latest_previous_record(site=site, date_for=dates[-1]) assert rec2.date_for == dates[-2] rec3 = SiteDailyMetrics.latest_previous_record(site=site, date_for=dates[0]) assert not rec3
def mock_sdm_load(self, site, date_for, **kwargs): return ( SiteDailyMetricsFactory(site=site), created, )
def setUp(self): self.site_daily_metrics = [ SiteDailyMetricsFactory() for i in range(1, 10) ]
def setup(self, db): '''Placeholder for test setup ''' self.site_daily_metrics = [SiteDailyMetricsFactory()]
def generate_sdm_series(first_day, last_day): return [ SiteDailyMetricsFactory(date_for=dt) for dt in rrule(DAILY, dtstart=first_day, until=last_day) ]