def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True): if start_date == datetime.utcnow().date(): stats = dao_fetch_todays_stats_for_all_services( include_from_test_key=include_from_test_key, only_active=only_active) else: stats = fetch_stats_for_all_services_by_date_range( start_date=start_date, end_date=end_date, include_from_test_key=include_from_test_key, ) results = [] for service_id, rows in itertools.groupby(stats, lambda x: x.service_id): rows = list(rows) s = statistics.format_statistics(rows) results.append({ 'id': str(rows[0].service_id), 'name': rows[0].name, 'notification_type': rows[0].notification_type, 'research_mode': rows[0].research_mode, 'restricted': rows[0].restricted, 'active': rows[0].active, 'created_at': rows[0].created_at, 'statistics': s }) return results
def test_dao_fetch_todays_stats_for_all_services_groups_correctly( notify_db, notify_db_session): service1 = create_service(service_name='service 1', email_from='service.1') service2 = create_service(service_name='service 2', email_from='service.2') template_sms = create_template(service=service1) template_email = create_template(service=service1, template_type='email') template_two = create_template(service=service2) # service1: 2 sms with status "created" and one "failed", and one email create_notification(template=template_sms) create_notification(template=template_sms) create_notification(template=template_sms, status='failed') create_notification(template=template_email) # service2: 1 sms "created" create_notification(template=template_two) stats = dao_fetch_todays_stats_for_all_services() assert len(stats) == 4 assert (service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, 'sms', 'created', 2) in stats assert (service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, 'sms', 'failed', 1) in stats assert (service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, 'email', 'created', 1) in stats assert (service2.id, service2.name, service2.restricted, service2.research_mode, service2.active, service2.created_at, 'sms', 'created', 1) in stats
def test_dao_fetch_todays_stats_for_all_services_can_exclude_from_test_key(notify_db, notify_db_session): create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_NORMAL) create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_TEAM) create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_TEST) stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=False).all() assert len(stats) == 1 assert stats[0].count == 2
def test_dao_fetch_todays_stats_for_all_services_includes_all_keys_by_default(notify_db, notify_db_session): create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_NORMAL) create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_TEAM) create_notification(notify_db, notify_db_session, key_type=KEY_TYPE_TEST) stats = dao_fetch_todays_stats_for_all_services().all() assert len(stats) == 1 assert stats[0].count == 3
def test_dao_fetch_todays_stats_for_all_services_can_exclude_from_test_key(notify_db_session): template = create_template(service=create_service()) create_notification(template=template, key_type=KEY_TYPE_NORMAL) create_notification(template=template, key_type=KEY_TYPE_TEAM) create_notification(template=template, key_type=KEY_TYPE_TEST) stats = dao_fetch_todays_stats_for_all_services(include_from_test_key=False) assert len(stats) == 1 assert stats[0].count == 2
def test_dao_fetch_todays_stats_for_all_services_includes_all_keys_by_default(notify_db_session): template = create_template(service=create_service()) create_notification(template=template, key_type=KEY_TYPE_NORMAL) create_notification(template=template, key_type=KEY_TYPE_TEAM) create_notification(template=template, key_type=KEY_TYPE_TEST) stats = dao_fetch_todays_stats_for_all_services() assert len(stats) == 1 assert stats[0].count == 3
def test_dao_fetch_todays_stats_for_all_services_only_includes_today(notify_db): with freeze_time("2001-01-01T23:59:00"): just_before_midnight_yesterday = create_notification(notify_db, None, to_field="1", status="delivered") with freeze_time("2001-01-02T00:01:00"): just_after_midnight_today = create_notification(notify_db, None, to_field="2", status="failed") with freeze_time("2001-01-02T12:00:00"): stats = dao_fetch_todays_stats_for_all_services().all() stats = {row.status: row.count for row in stats} assert "delivered" not in stats assert stats["failed"] == 1
def get_detailed_services(start_date, end_date, only_active=False, include_from_test_key=True): if start_date == datetime.utcnow().date(): stats = dao_fetch_todays_stats_for_all_services( include_from_test_key=include_from_test_key, only_active=only_active) else: stats = fetch_stats_by_date_range_for_all_services( start_date=start_date, end_date=end_date, include_from_test_key=include_from_test_key, only_active=only_active) results = [] for service_id, rows in itertools.groupby(stats, lambda x: x.service_id): rows = list(rows) if rows[0].count is None: s = statistics.create_zeroed_stats_dicts() else: s = statistics.format_statistics(rows) sid = str(rows[0].service_id) s[EMAIL_TYPE]['templates'] = len( dao_get_all_templates_for_service(sid, EMAIL_TYPE)) s[SMS_TYPE]['templates'] = len( dao_get_all_templates_for_service(sid, SMS_TYPE)) s[LETTER_TYPE]['templates'] = len( dao_get_all_templates_for_service(sid, LETTER_TYPE)) domains = set() for user in dao_fetch_active_users_for_service(sid): parts = user.email_address.split('@') if len(parts) != 2: continue domains.add(parts[1].lower()) results.append({ 'id': sid, 'name': rows[0].name, 'notification_type': rows[0].notification_type, 'research_mode': rows[0].research_mode, 'restricted': rows[0].restricted, 'active': rows[0].active, 'created_at': rows[0].created_at, 'statistics': s, 'domains': sorted(list(domains)), 'organisation_type': rows[0].organisation_type }) return results
def test_dao_fetch_todays_stats_for_all_services_only_includes_today(notify_db_session): template = create_template(service=create_service()) with freeze_time('2001-01-01T23:59:00'): # just_before_midnight_yesterday create_notification(template=template, to_field='1', status='delivered') with freeze_time('2001-01-02T00:01:00'): # just_after_midnight_today create_notification(template=template, to_field='2', status='failed') with freeze_time('2001-01-02T12:00:00'): stats = dao_fetch_todays_stats_for_all_services() stats = {row.status: row.count for row in stats} assert 'delivered' not in stats assert stats['failed'] == 1
def test_dao_fetch_todays_stats_for_all_services_includes_all_services(notify_db_session): # two services, each with an email and sms notification service1 = create_service(service_name='service 1', email_from='service.1') service2 = create_service(service_name='service 2', email_from='service.2') template_email_one = create_template(service=service1, template_type='email') template_sms_one = create_template(service=service1, template_type='sms') template_email_two = create_template(service=service2, template_type='email') template_sms_two = create_template(service=service2, template_type='sms') create_notification(template=template_email_one) create_notification(template=template_sms_one) create_notification(template=template_email_two) create_notification(template=template_sms_two) stats = dao_fetch_todays_stats_for_all_services() assert len(stats) == 4 # services are ordered by service id; not explicit on email/sms or status assert stats == sorted(stats, key=lambda x: x.service_id)
def test_dao_fetch_todays_stats_for_all_services_only_includes_today( notify_db_session): template = create_template(service=create_service()) with freeze_time("2001-01-02T03:59:00"): # just_before_midnight_yesterday create_notification(template=template, to_field="1", status="delivered") with freeze_time("2001-01-02T05:01:00"): # just_after_midnight_today create_notification(template=template, to_field="2", status="failed") with freeze_time("2001-01-02T05:00:00"): stats = dao_fetch_todays_stats_for_all_services() stats = {row.status: row.count for row in stats} assert "delivered" not in stats assert stats["failed"] == 1
def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db, notify_db_session, service_factory): service1 = service_factory.get("service 1", email_from="service.1") service2 = service_factory.get("service 2", email_from="service.2") # service1: 2 sms with status "created" and one "failed", and one email create_notification(notify_db, notify_db_session, service=service1) create_notification(notify_db, notify_db_session, service=service1) create_notification(notify_db, notify_db_session, service=service1, status="failed") create_notification( notify_db, notify_db_session, service=service1, template=create_email_template(notify_db, notify_db_session, service=service1), ) # service2: 1 sms "created" create_notification(notify_db, notify_db_session, service=service2) stats = dao_fetch_todays_stats_for_all_services().all() assert len(stats) == 4 assert ("sms", "created", service1.id, 2) in stats assert ("sms", "failed", service1.id, 1) in stats assert ("email", "created", service1.id, 1) in stats assert ("sms", "created", service2.id, 1) in stats
def test_dao_fetch_todays_stats_for_all_services_includes_all_services(notify_db, notify_db_session, service_factory): # two services, each with an email and sms notification service1 = service_factory.get("service 1", email_from="service.1") service2 = service_factory.get("service 2", email_from="service.2") create_notification(notify_db, notify_db_session, service=service1) create_notification(notify_db, notify_db_session, service=service2) create_notification( notify_db, notify_db_session, service=service1, template=create_email_template(notify_db, notify_db_session, service=service1), ) create_notification( notify_db, notify_db_session, service=service2, template=create_email_template(notify_db, notify_db_session, service=service2), ) stats = dao_fetch_todays_stats_for_all_services().all() assert len(stats) == 4 # services are ordered by service id; not explicit on email/sms or status assert stats == sorted(stats, key=lambda x: x.service_id)
def test_dao_fetch_todays_stats_for_all_services_groups_correctly( notify_db, notify_db_session): service1 = create_service(service_name="service 1", email_from="service.1") service2 = create_service(service_name="service 2", email_from="service.2") template_sms = create_template(service=service1) template_email = create_template(service=service1, template_type="email") template_two = create_template(service=service2) # service1: 2 sms with status "created" and one "failed", and one email create_notification(template=template_sms) create_notification(template=template_sms) create_notification(template=template_sms, status="failed") create_notification(template=template_email) # service2: 1 sms "created" create_notification(template=template_two) stats = dao_fetch_todays_stats_for_all_services() assert len(stats) == 4 assert ( service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, "sms", "created", 2, ) in stats assert ( service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, "sms", "failed", 1, ) in stats assert ( service1.id, service1.name, service1.restricted, service1.research_mode, service1.active, service1.created_at, "email", "created", 1, ) in stats assert ( service2.id, service2.name, service2.restricted, service2.research_mode, service2.active, service2.created_at, "sms", "created", 1, ) in stats