def get_monthly_notification_stats(service_id): # check service_id validity dao_fetch_service_by_id(service_id) try: year = int(request.args.get('year', 'NaN')) except ValueError: raise InvalidRequest('Year must be a number', status_code=400) start_date, end_date = get_financial_year(year) data = statistics.create_empty_monthly_notification_status_stats_dict(year) stats = fetch_notification_status_for_service_by_month(start_date, end_date, service_id) statistics.add_monthly_notification_status_stats(data, stats) now = datetime.utcnow() if end_date > now: todays_deltas = fetch_notification_status_for_service_for_day(convert_utc_to_bst(now), service_id=service_id) statistics.add_monthly_notification_status_stats(data, todays_deltas) return jsonify(data=data)
def test_add_monthly_notification_status_stats(): row_data = [ { 'month': datetime(2018, 4, 1), 'notification_type': 'sms', 'notification_status': 'sending', 'count': 1 }, { 'month': datetime(2018, 4, 1), 'notification_type': 'sms', 'notification_status': 'delivered', 'count': 2 }, { 'month': datetime(2018, 4, 1), 'notification_type': 'email', 'notification_status': 'sending', 'count': 4 }, { 'month': datetime(2018, 5, 1), 'notification_type': 'sms', 'notification_status': 'sending', 'count': 8 }, ] rows = [] for r in row_data: m = Mock(spec=[]) for k, v in r.items(): setattr(m, k, v) rows.append(m) data = create_empty_monthly_notification_status_stats_dict(2018) # this data won't be affected data['2018-05']['email']['sending'] = 32 # this data will get combined with the 8 from row_data data['2018-05']['sms']['sending'] = 16 add_monthly_notification_status_stats(data, rows) assert data == { '2018-04': { 'sms': { 'sending': 1, 'delivered': 2 }, 'email': { 'sending': 4 }, 'letter': {} }, '2018-05': { 'sms': { 'sending': 24 }, 'email': { 'sending': 32 }, 'letter': {} }, '2018-06': { 'sms': {}, 'email': {}, 'letter': {} }, }
def test_create_empty_monthly_notification_status_stats_dict( year, expected_years): output = create_empty_monthly_notification_status_stats_dict(year) assert sorted(output.keys()) == expected_years for v in output.values(): assert v == {'sms': {}, 'email': {}, 'letter': {}}