def test__update_fact_notification_status_updates_row(notify_db_session): first_service = create_service(service_name='First Service') first_template = create_template(service=first_service) create_notification(template=first_template, status='delivered') process_day = datetime.utcnow() data = fetch_notification_status_for_day(process_day=process_day) update_fact_notification_status(data=data, process_day=process_day.date()) new_fact_data = FactNotificationStatus.query.order_by( FactNotificationStatus.bst_date, FactNotificationStatus.notification_type).all() assert len(new_fact_data) == 1 assert new_fact_data[0].notification_count == 1 create_notification(template=first_template, status='delivered') data = fetch_notification_status_for_day(process_day=process_day) update_fact_notification_status(data=data, process_day=process_day.date()) updated_fact_data = FactNotificationStatus.query.order_by( FactNotificationStatus.bst_date, FactNotificationStatus.notification_type).all() assert len(updated_fact_data) == 1 assert updated_fact_data[0].notification_count == 2
def test_update_fact_notification_status(notify_db_session): first_service = create_service(service_name='First Service') first_template = create_template(service=first_service) second_service = create_service(service_name='second Service') second_template = create_template(service=second_service, template_type='email') third_service = create_service(service_name='third Service') third_template = create_template(service=third_service, template_type='letter') create_notification(template=first_template, status='delivered') create_notification(template=first_template, created_at=datetime.utcnow() - timedelta(days=1)) # simulate a service with data retention - data has been moved to history and does not exist in notifications create_notification_history(template=second_template, status='temporary-failure') create_notification_history(template=second_template, created_at=datetime.utcnow() - timedelta(days=1)) create_notification(template=third_template, status='created') create_notification(template=third_template, created_at=datetime.utcnow() - timedelta(days=1)) process_day = datetime.utcnow() data = fetch_notification_status_for_day(process_day=process_day) update_fact_notification_status(data=data, process_day=process_day.date()) new_fact_data = FactNotificationStatus.query.order_by( FactNotificationStatus.bst_date, FactNotificationStatus.notification_type).all() assert len(new_fact_data) == 3 assert new_fact_data[0].bst_date == process_day.date() assert new_fact_data[0].template_id == second_template.id assert new_fact_data[0].service_id == second_service.id assert new_fact_data[0].job_id == UUID( '00000000-0000-0000-0000-000000000000') assert new_fact_data[0].notification_type == 'email' assert new_fact_data[0].notification_status == 'temporary-failure' assert new_fact_data[0].notification_count == 1 assert new_fact_data[1].bst_date == process_day.date() assert new_fact_data[1].template_id == third_template.id assert new_fact_data[1].service_id == third_service.id assert new_fact_data[1].job_id == UUID( '00000000-0000-0000-0000-000000000000') assert new_fact_data[1].notification_type == 'letter' assert new_fact_data[1].notification_status == 'created' assert new_fact_data[1].notification_count == 1 assert new_fact_data[2].bst_date == process_day.date() assert new_fact_data[2].template_id == first_template.id assert new_fact_data[2].service_id == first_service.id assert new_fact_data[2].job_id == UUID( '00000000-0000-0000-0000-000000000000') assert new_fact_data[2].notification_type == 'sms' assert new_fact_data[2].notification_status == 'delivered' assert new_fact_data[2].notification_count == 1
def test_update_fact_notification_status(notify_db_session): first_service = create_service(service_name='First Service') first_template = create_template(service=first_service) second_service = create_service(service_name='second Service') second_template = create_template(service=second_service, template_type='email') third_service = create_service(service_name='third Service') third_template = create_template(service=third_service, template_type='letter') create_service_data_retention(second_service, 'email', days_of_retention=3) process_day = date.today() - timedelta(days=5) with freeze_time(datetime.combine(process_day, time.min)): create_notification(template=first_template, status='delivered') # 2nd service email has 3 day data retention - data has been moved to history and doesn't exist in notifications create_notification_history(template=second_template, status='temporary-failure') create_notification(template=third_template, status='sending') # these created notifications from a different day get ignored with freeze_time(datetime.combine(date.today() - timedelta(days=4), time.min)): create_notification(template=first_template) create_notification_history(template=second_template) create_notification(template=third_template) for notification_type in ('letter', 'sms', 'email'): data = fetch_notification_status_for_day(process_day=process_day, notification_type=notification_type) update_fact_notification_status(data=data, process_day=process_day, notification_type=notification_type) new_fact_data = FactNotificationStatus.query.order_by(FactNotificationStatus.bst_date, FactNotificationStatus.notification_type ).all() assert len(new_fact_data) == 3 assert new_fact_data[0].bst_date == process_day assert new_fact_data[0].template_id == second_template.id assert new_fact_data[0].service_id == second_service.id assert new_fact_data[0].job_id == UUID('00000000-0000-0000-0000-000000000000') assert new_fact_data[0].notification_type == 'email' assert new_fact_data[0].notification_status == 'temporary-failure' assert new_fact_data[0].notification_count == 1 assert new_fact_data[1].bst_date == process_day assert new_fact_data[1].template_id == third_template.id assert new_fact_data[1].service_id == third_service.id assert new_fact_data[1].job_id == UUID('00000000-0000-0000-0000-000000000000') assert new_fact_data[1].notification_type == 'letter' assert new_fact_data[1].notification_status == 'sending' assert new_fact_data[1].notification_count == 1 assert new_fact_data[2].bst_date == process_day assert new_fact_data[2].template_id == first_template.id assert new_fact_data[2].service_id == first_service.id assert new_fact_data[2].job_id == UUID('00000000-0000-0000-0000-000000000000') assert new_fact_data[2].notification_type == 'sms' assert new_fact_data[2].notification_status == 'delivered' assert new_fact_data[2].notification_count == 1
def fetch_and_update_fact_notification_status(process_day): transit_data = fetch_notification_status_for_day(process_day=process_day) update_fact_notification_status(transit_data, process_day) current_app.logger.info( "create-nightly-notification-status task: {} rows updated for day: {}".format( len(transit_data), process_day ) )
def create_nightly_notification_status_for_day(process_day): process_day = datetime.strptime(process_day, "%Y-%m-%d").date() start = datetime.utcnow() transit_data = fetch_notification_status_for_day(process_day=process_day) end = datetime.utcnow() current_app.logger.info( "create-nightly-notification-status-for-day {} fetched in {} seconds".format(process_day, (end - start).seconds) ) update_fact_notification_status(transit_data, process_day) current_app.logger.info( "create-nightly-notification-status-for-day task complete: {} rows updated for day: {}".format( len(transit_data), process_day ) )
def create_nightly_notification_status(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, 3): process_day = day_start - timedelta(days=i) transit_data = fetch_notification_status_for_day( process_day=process_day) update_fact_notification_status(transit_data, process_day) current_app.logger.info( "create-nightly-notification-status task: {} rows updated for day: {}" )
def create_nightly_notification_status_for_day(process_day, notification_type): process_day = datetime.strptime(process_day, "%Y-%m-%d").date() current_app.logger.info( f'create-nightly-notification-status-for-day task for {process_day} type {notification_type}: started' ) start = datetime.utcnow() transit_data = fetch_notification_status_for_day( process_day=process_day, notification_type=notification_type) end = datetime.utcnow() current_app.logger.info( f'create-nightly-notification-status-for-day task for {process_day} type {notification_type}: ' f'data fetched in {(end - start).seconds} seconds') update_fact_notification_status(transit_data, process_day, notification_type) current_app.logger.info( f'create-nightly-notification-status-for-day task for {process_day} type {notification_type}: ' f'task complete - {len(transit_data)} rows updated')