mirror of
https://github.com/GSA/notifications-api.git
synced 2026-07-28 11:49:42 -04:00
Merge pull request #2676 from alphagov/add-returned-letters-table
Add returned letters table
This commit is contained in:
@@ -44,6 +44,7 @@ from app.models import (
|
||||
JOB_STATUS_IN_PROGRESS,
|
||||
LETTER_TYPE,
|
||||
SMS_TYPE,
|
||||
ReturnedLetter
|
||||
)
|
||||
|
||||
from tests.app import load_example_csv
|
||||
@@ -1626,3 +1627,15 @@ def test_process_returned_letters_list_updates_history_if_notification_is_alread
|
||||
|
||||
assert [n.status for n in notifications] == ['returned-letter', 'returned-letter']
|
||||
assert all(n.updated_at for n in notifications)
|
||||
|
||||
|
||||
def test_process_returned_letters_populates_returned_letters_table(
|
||||
sample_letter_template
|
||||
):
|
||||
create_notification_history(sample_letter_template, reference='ref1')
|
||||
create_notification_history(sample_letter_template, reference='ref2')
|
||||
|
||||
process_returned_letters_list(['ref1', 'ref2', 'unknown-ref'])
|
||||
|
||||
returned_letters = ReturnedLetter.query.all()
|
||||
assert len(returned_letters) == 2
|
||||
|
||||
118
tests/app/dao/test_returned_letters_dao.py
Normal file
118
tests/app/dao/test_returned_letters_dao.py
Normal file
@@ -0,0 +1,118 @@
|
||||
from datetime import datetime, timedelta, date
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
from app.dao.returned_letters_dao import insert_or_update_returned_letters, get_returned_letter_summary
|
||||
from app.models import ReturnedLetter
|
||||
from tests.app.db import create_notification, create_notification_history, create_returned_letter
|
||||
|
||||
|
||||
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_
|
||||
|
||||
|
||||
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_insert_or_update_returned_letters_when_no_notification(notify_db_session):
|
||||
insert_or_update_returned_letters(['ref1'])
|
||||
assert ReturnedLetter.query.count() == 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_insert_or_update_returned_letters_with_duplicates_in_reference_list(sample_letter_template):
|
||||
notification_1 = create_notification(template=sample_letter_template,
|
||||
reference='ref1')
|
||||
notification_2 = create_notification(template=sample_letter_template,
|
||||
reference='ref2')
|
||||
|
||||
assert ReturnedLetter.query.count() == 0
|
||||
insert_or_update_returned_letters(['ref1', 'ref2', 'ref1', 'ref2'])
|
||||
returned_letters = ReturnedLetter.query.all()
|
||||
assert len(returned_letters) == 2
|
||||
for x in returned_letters:
|
||||
assert x.notification_id in [notification_1.id, notification_2.id]
|
||||
|
||||
|
||||
def test_get_returned_letter_summary(sample_service):
|
||||
now = datetime.utcnow()
|
||||
create_returned_letter(sample_service, reported_at=now)
|
||||
create_returned_letter(sample_service, reported_at=now)
|
||||
|
||||
results = get_returned_letter_summary(sample_service.id)
|
||||
|
||||
assert len(results) == 1
|
||||
|
||||
assert results[0].returned_letter_count == 2
|
||||
assert results[0].reported_at == now.date()
|
||||
|
||||
|
||||
def test_get_returned_letter_summary_orders_by_reported_at(sample_service):
|
||||
now = datetime.utcnow()
|
||||
last_month = datetime.utcnow() - timedelta(days=30)
|
||||
create_returned_letter(sample_service, reported_at=now)
|
||||
create_returned_letter(sample_service, reported_at=now)
|
||||
create_returned_letter(sample_service, reported_at=now)
|
||||
create_returned_letter(sample_service, reported_at=last_month)
|
||||
create_returned_letter(sample_service, reported_at=last_month)
|
||||
create_returned_letter() # returned letter for a different service
|
||||
|
||||
results = get_returned_letter_summary(sample_service.id)
|
||||
|
||||
assert len(results) == 2
|
||||
assert results[0].reported_at == now.date()
|
||||
assert results[0].returned_letter_count == 3
|
||||
assert results[1].reported_at == last_month.date()
|
||||
assert results[1].returned_letter_count == 2
|
||||
@@ -59,7 +59,9 @@ from app.models import (
|
||||
TemplateFolder,
|
||||
LetterBranding,
|
||||
Domain,
|
||||
NotificationHistory
|
||||
NotificationHistory,
|
||||
NOTIFICATION_RETURNED_LETTER,
|
||||
ReturnedLetter
|
||||
)
|
||||
|
||||
|
||||
@@ -940,3 +942,20 @@ def set_up_usage_data(start_date):
|
||||
notifications_sent=15, billable_unit=4, rate=.55, postage='second')
|
||||
|
||||
return org, org_3, service, service_3, service_4, service_sms_only
|
||||
|
||||
|
||||
def create_returned_letter(service=None, reported_at=None):
|
||||
if not service:
|
||||
service = create_service(service_name='a - with sms and letter')
|
||||
template = create_template(service=service, template_type=LETTER_TYPE)
|
||||
notification = create_notification(template=template, status=NOTIFICATION_RETURNED_LETTER)
|
||||
returned_letter = ReturnedLetter(
|
||||
service_id=service.id,
|
||||
reported_at=reported_at or datetime.utcnow(),
|
||||
notification_id=notification.id,
|
||||
created_at=datetime.utcnow(),
|
||||
)
|
||||
|
||||
db.session.add(returned_letter)
|
||||
db.session.commit()
|
||||
return returned_letter
|
||||
|
||||
@@ -47,7 +47,7 @@ from tests.app.db import (
|
||||
create_domain,
|
||||
create_email_branding,
|
||||
create_annual_billing,
|
||||
)
|
||||
create_returned_letter)
|
||||
from tests.app.db import create_user
|
||||
|
||||
|
||||
@@ -3372,3 +3372,16 @@ def test_get_monthly_notification_data_by_service(mocker, admin_request):
|
||||
|
||||
dao_mock.assert_called_once_with(start_date, end_date)
|
||||
assert response == []
|
||||
|
||||
|
||||
@freeze_time('2019-12-11 13:30')
|
||||
def test_get_returned_letter_summary(admin_request, sample_service):
|
||||
create_returned_letter(sample_service, reported_at=datetime.utcnow() - timedelta(days=3))
|
||||
create_returned_letter(sample_service, reported_at=datetime.utcnow())
|
||||
create_returned_letter(sample_service, reported_at=datetime.utcnow())
|
||||
|
||||
response = admin_request.get('service.returned_letter_summary', service_id=sample_service.id)
|
||||
|
||||
assert len(response) == 2
|
||||
assert response[0] == {'returned_letter_count': 2, 'reported_at': '2019-12-11'}
|
||||
assert response[1] == {'returned_letter_count': 1, 'reported_at': '2019-12-08'}
|
||||
|
||||
Reference in New Issue
Block a user