Пример #1
0
def test_fetch_returned_letters_from_notifications_and_notification_history(sample_letter_template):
    today = datetime.now()
    last_month = datetime.now() - timedelta(days=30)

    letter_1 = create_notification(template=sample_letter_template, client_reference='letter_1',
                                   status=NOTIFICATION_RETURNED_LETTER,
                                   created_at=datetime.utcnow() - timedelta(days=1))
    returned_letter_1 = create_returned_letter(service=sample_letter_template.service, reported_at=today,
                                               notification_id=letter_1.id)
    letter_2 = create_notification_history(template=sample_letter_template, client_reference='letter_2',
                                           status=NOTIFICATION_RETURNED_LETTER, created_at=datetime.utcnow())
    returned_letter_2 = create_returned_letter(service=sample_letter_template.service, reported_at=today,
                                               notification_id=letter_2.id)
    letter_3 = create_notification_history(template=sample_letter_template, client_reference='letter_3',
                                           status=NOTIFICATION_RETURNED_LETTER)
    create_returned_letter(service=sample_letter_template.service, reported_at=last_month,
                           notification_id=letter_3.id)

    results = fetch_returned_letters(service_id=sample_letter_template.service_id, report_date=today.date())

    assert len(results) == 2
    assert results[0] == (letter_2.id, returned_letter_2.reported_at, letter_2.client_reference, letter_2.created_at,
                          sample_letter_template.name, letter_2.template_id, letter_2.template_version, False, None,
                          None, None, None, None, None)
    assert results[1] == (letter_1.id, returned_letter_1.reported_at, letter_1.client_reference, letter_1.created_at,
                          sample_letter_template.name, letter_1.template_id, letter_1.template_version, False,
                          letter_1.api_key_id, None, None, None, None, None)
Пример #2
0
def test_fetch_stats_ignores_historical_notification_data(sample_template):
    create_notification_history(template=sample_template)

    assert Notification.query.count() == 0
    assert NotificationHistory.query.count() == 1

    stats = dao_fetch_stats_for_service(sample_template.service_id, 7)
    assert len(stats) == 0
Пример #3
0
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
Пример #4
0
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
Пример #5
0
def test_insert_or_update_returned_letters_for_history_only(sample_letter_template):
    history_1 = create_notification_history(template=sample_letter_template,
                                            reference='ref1')
    history_2 = create_notification_history(template=sample_letter_template,
                                            reference='ref2')

    assert ReturnedLetter.query.count() == 0
    insert_or_update_returned_letters(['ref1', 'ref2'])
    returned_letters = ReturnedLetter.query.all()
    assert len(returned_letters) == 2
    for x in returned_letters:
        assert x.notification_id in [history_1.id, history_2.id]
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
Пример #7
0
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
Пример #8
0
def test_insert_or_update_returned_letters_updates(sample_letter_template):
    notification = create_notification(template=sample_letter_template,
                                       reference='ref1')
    history = create_notification_history(template=sample_letter_template,
                                          reference='ref2')

    assert ReturnedLetter.query.count() == 0
    with freeze_time('2019-12-09 13:30'):
        insert_or_update_returned_letters(['ref1', 'ref2'])
        returned_letters = ReturnedLetter.query.all()
        assert len(returned_letters) == 2
        for x in returned_letters:
            assert x.reported_at == date(2019, 12, 9)
            assert x.created_at == datetime(2019, 12, 9, 13, 30)
            assert not x.updated_at
            assert x.notification_id in [notification.id, history.id]

    with freeze_time('2019-12-10 14:20'):
        insert_or_update_returned_letters(['ref1', 'ref2'])
        returned_letters = ReturnedLetter.query.all()
        assert len(returned_letters) == 2
        for x in returned_letters:
            assert x.reported_at == date(2019, 12, 10)
            assert x.created_at == datetime(2019, 12, 9, 13, 30)
            assert x.updated_at == datetime(2019, 12, 10, 14, 20)
            assert x.notification_id in [notification.id, history.id]
def test_delete_notifications_does_nothing_if_notification_history_row_already_exists(
        sample_email_template, mocker):
    notification = create_notification(template=sample_email_template,
                                       created_at=datetime.utcnow() -
                                       timedelta(days=8),
                                       status='temporary-failure')
    create_notification_history(id=notification.id,
                                template=sample_email_template,
                                created_at=datetime.utcnow() -
                                timedelta(days=8),
                                status='delivered')

    delete_notifications_older_than_retention_by_type("email")

    history = NotificationHistory.query.all()
    assert len(history) == 1
    assert history[0].status == 'delivered'
Пример #10
0
def test_process_ses_results_in_complaint_if_notification_does_not_exist(
    sample_email_template, ):
    notification = create_notification_history(template=sample_email_template,
                                               reference="ref1")
    handle_complaint(json.loads(ses_complaint_callback()["Message"]))
    complaints = Complaint.query.all()
    assert len(complaints) == 1
    assert complaints[0].notification_id == notification.id
Пример #11
0
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
Пример #12
0
def test_fetch_returned_letters_with_jobs(sample_letter_job):
    today = datetime.now()
    letter_1 = create_notification_history(template=sample_letter_job.template, client_reference='letter_1',
                                           status=NOTIFICATION_RETURNED_LETTER,
                                           job=sample_letter_job, job_row_number=20,
                                           created_at=datetime.utcnow() - timedelta(minutes=1))
    returned_letter_1 = create_returned_letter(service=sample_letter_job.service, reported_at=today,
                                               notification_id=letter_1.id)

    results = fetch_returned_letters(service_id=sample_letter_job.service_id, report_date=today.date())
    assert len(results) == 1
    assert results[0] == (letter_1.id, returned_letter_1.reported_at, letter_1.client_reference, letter_1.created_at,
                          sample_letter_job.template.name, letter_1.template_id, letter_1.template_version, False, None,
                          None, None, None, sample_letter_job.original_file_name, 21)
def test_update_letter_notification_statuses_when_notification_does_not_exist_updates_notification_history(
        sample_letter_template, mocker):
    valid_file = 'ref-foo|Sent|1|Unsorted'
    mocker.patch('app.celery.tasks.s3.get_s3_file', return_value=valid_file)
    notification = create_notification_history(sample_letter_template,
                                               reference='ref-foo',
                                               status=NOTIFICATION_SENDING,
                                               billable_units=1)

    update_letter_notifications_statuses(
        filename="NOTIFY-20170823160812-RSP.TXT")

    updated_history = NotificationHistory.query.filter_by(
        id=notification.id).one()
    assert updated_history.status == NOTIFICATION_DELIVERED
Пример #14
0
def test_fetch_returned_letters_with_create_by_user(sample_letter_template):
    today = datetime.now()
    letter_1 = create_notification_history(template=sample_letter_template, client_reference='letter_1',
                                           status=NOTIFICATION_RETURNED_LETTER,
                                           created_at=datetime.utcnow() - timedelta(minutes=1),
                                           created_by_id=sample_letter_template.service.users[0].id)
    returned_letter_1 = create_returned_letter(service=sample_letter_template.service, reported_at=today,
                                               notification_id=letter_1.id)

    results = fetch_returned_letters(service_id=sample_letter_template.service_id, report_date=today.date())
    assert len(results) == 1
    assert results[0] == (letter_1.id, returned_letter_1.reported_at, letter_1.client_reference, letter_1.created_at,
                          sample_letter_template.name, letter_1.template_id, letter_1.template_version, False, None,
                          letter_1.created_by_id, sample_letter_template.service.users[0].name,
                          sample_letter_template.service.users[0].email_address, None, None)
Пример #15
0
def test_insert_or_update_returned_letters_inserts(sample_letter_template):
    notification = create_notification(template=sample_letter_template,
                                       reference='ref1')
    history = create_notification_history(template=sample_letter_template,
                                          reference='ref2')

    assert ReturnedLetter.query.count() == 0

    insert_or_update_returned_letters(['ref1', 'ref2'])

    returned_letters = ReturnedLetter.query.all()

    assert len(returned_letters) == 2
    returned_letters_ = [x.notification_id for x in returned_letters]
    assert notification.id in returned_letters_
    assert history.id in returned_letters_