def test_fetch_billing_data_for_today_includes_data_with_the_right_status(notify_db_session): service = create_service() template = create_template(service=service, template_type="email") for status in ['created', 'technical-failure']: create_notification(template=template, status=status) today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert results == [] for status in ['delivered', 'sending', 'temporary-failure']: create_notification(template=template, status=status) results = fetch_billing_data_for_day(today.date()) assert len(results) == 1 assert results[0].notifications_sent == 3
def test_fetch_billing_data_for_today_includes_data_with_the_right_key_type(notify_db_session): service = create_service() template = create_template(service=service, template_type="email") for key_type in ['normal', 'test', 'team']: create_notification(template=template, status='delivered', key_type=key_type) today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 1 assert results[0].notifications_sent == 2
def test_fetch_billing_data_for_day_is_grouped_by_international(notify_db_session): service = create_service() template = create_template(service=service) create_notification(template=template, status='delivered', international=True) create_notification(template=template, status='delivered', international=False) today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_is_grouped_by_provider(notify_db_session): service = create_service() template = create_template(service=service) create_notification(template=template, status="delivered", sent_by="sns") create_notification(template=template, status="delivered", sent_by="pinpoint") today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_is_grouped_by_rate_mulitplier(notify_db_session): service = create_service() template = create_template(service=service) create_notification(template=template, status='delivered', rate_multiplier=1) create_notification(template=template, status='delivered', rate_multiplier=2) today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_is_grouped_by_provider(notify_db_session): service = create_service() template = create_template(service=service) create_notification(template=template, status='delivered', sent_by='mmg') create_notification(template=template, status='delivered', sent_by='firetext') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_groups_by_page_count(notify_db_session): service = create_service() letter_template = create_template(service=service, template_type='letter') email_template = create_template(service=service, template_type='email') create_notification(template=letter_template, status='delivered', postage='second', billable_units=1) create_notification(template=letter_template, status='delivered', postage='second', billable_units=1) create_notification(template=letter_template, status='delivered', postage='second', billable_units=2) create_notification(template=email_template, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 3
def test_fetch_billing_data_for_today_includes_data_with_the_right_key_type( notify_db_session, ): service = create_service() template = create_template(service=service, template_type="email") for key_type in ["normal", "test", "team"]: create_notification(template=template, status="delivered", key_type=key_type) today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 1 assert results[0].notifications_sent == 2
def test_fetch_billing_data_for_day_returns_list_for_given_service(notify_db_session): service = create_service() service_2 = create_service(service_name='Service 2') template = create_template(service=service) template_2 = create_template(service=service_2) create_notification(template=template, status='delivered') create_notification(template=template_2, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(process_day=today.date(), service_id=service.id) assert len(results) == 1 assert results[0].service_id == service.id
def test_fetch_billing_data_for_day_sets_postage_for_emails_and_sms_to_none(notify_db_session): service = create_service() sms_template = create_template(service=service, template_type='sms') email_template = create_template(service=service, template_type='email') create_notification(template=sms_template, status='delivered') create_notification(template=email_template, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 2 assert results[0].postage == 'none' assert results[1].postage == 'none'
def test_fetch_billing_data_for_day_is_grouped_by_template_and_notification_type(notify_db_session): service = create_service() email_template = create_template(service=service, template_type="email") sms_template = create_template(service=service, template_type="sms") create_notification(template=email_template, status='delivered') create_notification(template=sms_template, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_groups_by_postage(notify_db_session): service = create_service() letter_template = create_template(service=service, template_type='letter') email_template = create_template(service=service, template_type='email') create_notification(template=letter_template, status='delivered', postage='first') create_notification(template=letter_template, status='delivered', postage='first') create_notification(template=letter_template, status='delivered', postage='second') create_notification(template=email_template, status='delivered') today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 3
def test_fetch_billing_data_for_day_is_grouped_by_service(notify_db_session): service_1 = create_service() service_2 = create_service(service_name='Service 2') email_template = create_template(service=service_1) sms_template = create_template(service=service_2) create_notification(template=email_template, status='delivered') create_notification(template=sms_template, status='delivered') today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 2 assert results[0].notifications_sent == 1 assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_uses_notification_history(notify_db_session): service = create_service() sms_template = create_template(service=service, template_type='sms') create_notification_history(template=sms_template, status='delivered', created_at=datetime.utcnow() - timedelta(days=8)) create_notification_history(template=sms_template, status='delivered', created_at=datetime.utcnow() - timedelta(days=8)) Notification.query.delete() db.session.commit() results = fetch_billing_data_for_day(process_day=datetime.utcnow() - timedelta(days=8), service_id=service.id) assert len(results) == 1 assert results[0].notifications_sent == 2
def test_fetch_billing_data_for_day_only_calls_query_for_all_channels( notify_db_session, notification_type): service = create_service(service_permissions=[notification_type]) email_template = create_template(service=service, template_type="email") sms_template = create_template(service=service, template_type="sms") letter_template = create_template(service=service, template_type="letter") create_notification(template=email_template, status='delivered') create_notification(template=sms_template, status='delivered') create_notification(template=letter_template, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(process_day=today.date(), check_permissions=False) assert len(results) == 3
def test_fetch_billing_data_for_today_includes_data_with_the_right_date(notify_db_session): process_day = datetime(2018, 4, 1, 13, 30, 0) service = create_service() template = create_template(service=service, template_type="email") create_notification(template=template, status='delivered', created_at=process_day) create_notification(template=template, status='delivered', created_at=datetime(2018, 3, 31, 23, 23, 23)) create_notification(template=template, status='delivered', created_at=datetime(2018, 3, 31, 20, 23, 23)) create_notification(template=template, status='sending', created_at=process_day + timedelta(days=1)) day_under_test = convert_utc_to_bst(process_day) results = fetch_billing_data_for_day(day_under_test.date()) assert len(results) == 1 assert results[0].notifications_sent == 2
def test_fetch_billing_data_for_day_sets_postage_for_emails_and_sms_to_none( notify_db_session, ): service = create_service() sms_template = create_template(service=service, template_type="sms") email_template = create_template(service=service, template_type="email") create_notification(template=sms_template, status="delivered") create_notification(template=email_template, status="delivered") today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 2 assert results[0].postage == "none" assert results[1].postage == "none"
def rebuild_ft_data(process_day, service): deleted_rows = delete_billing_data_for_service_for_day( process_day, service) current_app.logger.info( 'deleted {} existing billing rows for {} on {}'.format( deleted_rows, service, process_day)) transit_data = fetch_billing_data_for_day(process_day=process_day, service_id=service) # transit_data = every row that should exist for data in transit_data: # upsert existing rows update_fact_billing(data, process_day) current_app.logger.info( 'added/updated {} billing rows for {} on {}'.format( len(transit_data), service, process_day))
def create_nightly_billing_for_day(process_day): process_day = datetime.strptime(process_day, "%Y-%m-%d").date() start = datetime.utcnow() transit_data = fetch_billing_data_for_day(process_day=process_day) end = datetime.utcnow() current_app.logger.info("create-nightly-billing-for-day {} fetched in {} seconds".format(process_day, (end - start).seconds)) for data in transit_data: update_fact_billing(data, process_day) current_app.logger.info( "create-nightly-billing-for-day task complete. {} rows updated for day: {}".format(len(transit_data), process_day) )
def test_fetch_billing_data_for_day_uses_correct_table(notify_db_session): service = create_service() create_service_data_retention(service, notification_type='email', days_of_retention=3) sms_template = create_template(service=service, template_type='sms') email_template = create_template(service=service, template_type='email') five_days_ago = datetime.utcnow() - timedelta(days=5) create_notification(template=sms_template, status='delivered', created_at=five_days_ago) create_notification_history(template=email_template, status='delivered', created_at=five_days_ago) results = fetch_billing_data_for_day(process_day=five_days_ago.date(), service_id=service.id) assert len(results) == 2 assert results[0].notification_type == 'sms' assert results[0].notifications_sent == 1 assert results[1].notification_type == 'email' assert results[1].notifications_sent == 1
def test_fetch_billing_data_for_day_is_grouped_by_notification_type(notify_db_session): service = create_service() sms_template = create_template(service=service, template_type='sms') email_template = create_template(service=service, template_type='email') letter_template = create_template(service=service, template_type='letter') create_notification(template=sms_template, status='delivered') create_notification(template=sms_template, status='delivered') create_notification(template=sms_template, status='delivered') create_notification(template=email_template, status='delivered') create_notification(template=email_template, status='delivered') create_notification(template=letter_template, status='delivered') today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 3 notification_types = [x[2] for x in results if x[2] in ['email', 'sms', 'letter']] assert len(notification_types) == 3
def test_fetch_billing_data_for_day_is_grouped_by_notification_type(notify_db_session): service = create_service() sms_template = create_template(service=service, template_type="sms") email_template = create_template(service=service, template_type="email") letter_template = create_template(service=service, template_type="letter") create_notification(template=sms_template, status="delivered") create_notification(template=sms_template, status="delivered") create_notification(template=sms_template, status="delivered") create_notification(template=email_template, status="delivered") create_notification(template=email_template, status="delivered") create_notification(template=letter_template, status="delivered") today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert len(results) == 3 notification_types = [x[2] for x in results if x[2] in ["email", "sms", "letter"]] assert len(notification_types) == 3
def test_fetch_billing_data_for_day_bills_correctly_for_status(notify_db_session): service = create_service() sms_template = create_template(service=service, template_type='sms') email_template = create_template(service=service, template_type='email') letter_template = create_template(service=service, template_type='letter') for status in NOTIFICATION_STATUS_TYPES: create_notification(template=sms_template, status=status) create_notification(template=email_template, status=status) create_notification(template=letter_template, status=status) today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(process_day=today.date(), service_id=service.id) sms_results = [x for x in results if x[2] == 'sms'] email_results = [x for x in results if x[2] == 'email'] letter_results = [x for x in results if x[2] == 'letter'] assert 7 == sms_results[0][7] assert 7 == email_results[0][7] assert 3 == letter_results[0][7]
def create_nightly_billing(day_start=None): # day_start is a datetime.date() object. e.g. # 3 days of data counting back from day_start is consolidated if day_start is None: day_start = datetime.today() - timedelta(days=1) else: # When calling the task its a string in the format of "YYYY-MM-DD" day_start = datetime.strptime(day_start, "%Y-%m-%d") for i in range(0, 10): process_day = day_start - timedelta(days=i) transit_data = fetch_billing_data_for_day(process_day=process_day) for data in transit_data: update_fact_billing(data, process_day) current_app.logger.info( "create-nightly-billing task complete. {} rows updated for day: {}" .format(len(transit_data), process_day))
def create_nightly_billing_for_day(process_day): process_day = datetime.strptime(process_day, "%Y-%m-%d").date() current_app.logger.info( f'create-nightly-billing-for-day task for {process_day}: started') start = datetime.utcnow() transit_data = fetch_billing_data_for_day(process_day=process_day) end = datetime.utcnow() current_app.logger.info( f'create-nightly-billing-for-day task for {process_day}: data fetched in {(end - start).seconds} seconds' ) for data in transit_data: update_fact_billing(data, process_day) current_app.logger.info( f"create-nightly-billing-for-day task for {process_day}: " f"task complete. {len(transit_data)} rows updated")
def test_fetch_billing_data_for_day_uses_notification_history(notify_db_session): local_now = convert_utc_to_local_timezone(datetime.utcnow()) service = create_service() sms_template = create_template(service=service, template_type="sms") create_notification_history( template=sms_template, status="delivered", created_at=datetime.utcnow() - timedelta(days=8), ) create_notification_history( template=sms_template, status="delivered", created_at=datetime.utcnow() - timedelta(days=8), ) Notification.query.delete() db.session.commit() results = fetch_billing_data_for_day(process_day=local_now - timedelta(days=8), service_id=service.id) assert len(results) == 1 assert results[0].notifications_sent == 2
def test_fetch_billing_data_for_day_is_grouped_by_international( notify_db_session): service = create_service() sms_template = create_template(service=service) letter_template = create_template(template_type='letter', service=service) create_notification(template=sms_template, status='delivered', international=True) create_notification(template=sms_template, status='delivered', international=False) create_notification(template=letter_template, status='delivered', international=True) create_notification(template=letter_template, status='delivered', international=False) today = convert_utc_to_bst(datetime.utcnow()) results = fetch_billing_data_for_day(today.date()) assert len(results) == 4 assert all(result.notifications_sent == 1 for result in results)
def test_fetch_billing_data_for_day_returns_empty_list(notify_db_session): today = convert_utc_to_local_timezone(datetime.utcnow()) results = fetch_billing_data_for_day(today) assert results == []