mirror of
https://github.com/GSA/notifications-api.git
synced 2026-01-19 17:11:54 -05:00
1135 lines
34 KiB
Python
1135 lines
34 KiB
Python
from datetime import date, datetime, timedelta
|
|
from uuid import UUID
|
|
|
|
import pytest
|
|
from freezegun import freeze_time
|
|
|
|
from app.dao.fact_notification_status_dao import (
|
|
fetch_monthly_notification_statuses_per_service,
|
|
fetch_monthly_template_usage_for_service,
|
|
fetch_notification_status_for_service_by_month,
|
|
fetch_notification_status_for_service_for_day,
|
|
fetch_notification_status_for_service_for_today_and_7_previous_days,
|
|
fetch_notification_status_totals_for_all_services,
|
|
fetch_notification_statuses_for_job,
|
|
fetch_stats_for_all_services_by_date_range,
|
|
get_total_notifications_for_date_range,
|
|
update_fact_notification_status,
|
|
)
|
|
from app.enums import KeyType, NotificationStatus, NotificationType, TemplateType
|
|
from app.models import FactNotificationStatus
|
|
from app.utils import utc_now
|
|
from tests.app.db import (
|
|
create_ft_notification_status,
|
|
create_job,
|
|
create_notification,
|
|
create_service,
|
|
create_template,
|
|
create_template_folder,
|
|
)
|
|
|
|
|
|
def test_fetch_notification_status_for_service_by_month(notify_db_session):
|
|
service_1 = create_service(service_name="service_1")
|
|
service_2 = create_service(service_name="service_2")
|
|
|
|
create_template(service=service_1)
|
|
create_template(service=service_1, template_type=TemplateType.EMAIL)
|
|
# not the service being tested
|
|
create_template(service=service_2)
|
|
|
|
# loop messages for the month
|
|
for x in range(0, 14):
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 1, 1, 1, x, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
service_1.templates[0], created_at=datetime(2018, 1, 1, 1, 1, 0)
|
|
)
|
|
create_notification(
|
|
service_1.templates[1],
|
|
created_at=datetime(2018, 1, 1, 1, 1, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 2, 1, 1, 1, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
# not the right month
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 4, 1, 1, 1, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
# not the right service
|
|
create_notification(
|
|
service_2.templates[0],
|
|
created_at=datetime(2018, 2, 1, 1, 1, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
results = sorted(
|
|
fetch_notification_status_for_service_by_month(
|
|
date(2018, 1, 1), date(2018, 2, 28), service_1.id
|
|
),
|
|
key=lambda x: (x.month, x.notification_type, x.notification_status),
|
|
)
|
|
|
|
assert len(results) == 4
|
|
|
|
assert results[0].month.date() == date(2018, 1, 1)
|
|
assert results[0].notification_type == NotificationType.EMAIL
|
|
# TODO fix/investigate
|
|
# assert results[0].notification_status == NotificationStatus.DELIVERED
|
|
assert results[0].count == 1
|
|
|
|
assert results[1].month.date() == date(2018, 1, 1)
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].notification_status == NotificationStatus.CREATED
|
|
assert results[1].count == 1
|
|
|
|
assert results[2].month.date() == date(2018, 1, 1)
|
|
assert results[2].notification_type == NotificationType.SMS
|
|
assert results[2].notification_status == NotificationStatus.DELIVERED
|
|
assert results[2].count == 14
|
|
|
|
assert results[3].month.date() == date(2018, 2, 1)
|
|
assert results[3].notification_type == NotificationType.SMS
|
|
assert results[3].notification_status == NotificationStatus.DELIVERED
|
|
assert results[3].count == 1
|
|
|
|
|
|
def test_fetch_notification_status_for_service_for_day(notify_db_session):
|
|
service_1 = create_service(service_name="service_1")
|
|
service_2 = create_service(service_name="service_2")
|
|
|
|
create_template(service=service_1)
|
|
create_template(service=service_2)
|
|
|
|
# too early
|
|
create_notification(
|
|
service_1.templates[0], created_at=datetime(2018, 5, 31, 22, 59, 0)
|
|
)
|
|
|
|
# included
|
|
create_notification(
|
|
service_1.templates[0], created_at=datetime(2018, 5, 31, 23, 0, 0)
|
|
)
|
|
create_notification(
|
|
service_1.templates[0], created_at=datetime(2018, 6, 1, 22, 59, 0)
|
|
)
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 6, 1, 12, 0, 0),
|
|
key_type=KeyType.TEAM,
|
|
)
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 6, 1, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
# test key
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 6, 1, 12, 0, 0),
|
|
key_type=KeyType.TEST,
|
|
)
|
|
|
|
# wrong service
|
|
create_notification(
|
|
service_2.templates[0], created_at=datetime(2018, 6, 1, 12, 0, 0)
|
|
)
|
|
|
|
# tomorrow (somehow)
|
|
create_notification(
|
|
service_1.templates[0], created_at=datetime(2018, 6, 1, 23, 0, 0)
|
|
)
|
|
|
|
results = sorted(
|
|
fetch_notification_status_for_service_for_day(
|
|
datetime(2018, 6, 1), service_1.id
|
|
),
|
|
key=lambda x: x.notification_status,
|
|
)
|
|
assert len(results) == 2
|
|
|
|
assert results[0].month == datetime(2018, 6, 1, 0, 0)
|
|
assert results[0].notification_type == NotificationType.SMS
|
|
assert results[0].notification_status == NotificationStatus.CREATED
|
|
assert results[0].count == 3
|
|
|
|
assert results[1].month == datetime(2018, 6, 1, 0, 0)
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].notification_status == NotificationStatus.DELIVERED
|
|
assert results[1].count == 1
|
|
|
|
|
|
@freeze_time("2018-10-31T18:00:00")
|
|
def test_fetch_notification_status_for_service_for_today_and_7_previous_days(
|
|
notify_db_session,
|
|
):
|
|
service_1 = create_service(service_name="service_1")
|
|
sms_template = create_template(service=service_1, template_type=TemplateType.SMS)
|
|
sms_template_2 = create_template(service=service_1, template_type=TemplateType.SMS)
|
|
email_template = create_template(
|
|
service=service_1, template_type=TemplateType.EMAIL
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=10,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 25),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=8,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
notification_status=NotificationStatus.CREATED,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.EMAIL,
|
|
service_1,
|
|
count=3,
|
|
)
|
|
|
|
create_notification(sms_template, created_at=datetime(2018, 10, 31, 11, 0, 0))
|
|
create_notification(sms_template_2, created_at=datetime(2018, 10, 31, 11, 0, 0))
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 10, 31, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
email_template,
|
|
created_at=datetime(2018, 10, 31, 13, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
# too early, shouldn't be included
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 10, 30, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
results = sorted(
|
|
fetch_notification_status_for_service_for_today_and_7_previous_days(
|
|
service_1.id
|
|
),
|
|
key=lambda x: (x.notification_type, x.status),
|
|
)
|
|
|
|
assert len(results) == 3
|
|
|
|
assert results[0].notification_type == NotificationType.EMAIL
|
|
assert results[0].status == NotificationStatus.DELIVERED
|
|
assert results[0].count == 4
|
|
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].status == NotificationStatus.CREATED
|
|
assert results[1].count == 3
|
|
|
|
assert results[2].notification_type == NotificationType.SMS
|
|
assert results[2].status == NotificationStatus.DELIVERED
|
|
assert results[2].count == 19
|
|
|
|
|
|
@freeze_time("2018-10-31T18:00:00")
|
|
def test_fetch_notification_status_by_template_for_service_for_today_and_7_previous_days(
|
|
notify_db_session,
|
|
):
|
|
service_1 = create_service(service_name="service_1")
|
|
test_folder = create_template_folder(service=service_1, name="Test_Folder_For_This")
|
|
sms_template = create_template(
|
|
template_name="sms Template 1",
|
|
service=service_1,
|
|
template_type=TemplateType.SMS,
|
|
folder=test_folder,
|
|
)
|
|
sms_template_2 = create_template(
|
|
template_name="sms Template 2",
|
|
service=service_1,
|
|
template_type=TemplateType.SMS,
|
|
folder=test_folder,
|
|
)
|
|
email_template = create_template(
|
|
service=service_1, template_type=TemplateType.EMAIL
|
|
)
|
|
|
|
# create unused email template
|
|
create_template(service=service_1, template_type=TemplateType.EMAIL)
|
|
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=10,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=11,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 25),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=8,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
notification_status=NotificationStatus.CREATED,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.EMAIL,
|
|
service_1,
|
|
count=3,
|
|
)
|
|
|
|
create_notification(sms_template, created_at=datetime(2018, 10, 31, 11, 0, 0))
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 10, 31, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
sms_template_2,
|
|
created_at=datetime(2018, 10, 31, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
email_template,
|
|
created_at=datetime(2018, 10, 31, 13, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
# too early, shouldn't be included
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 10, 30, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
results = fetch_notification_status_for_service_for_today_and_7_previous_days(
|
|
service_1.id,
|
|
by_template=True,
|
|
)
|
|
|
|
expected = [
|
|
{
|
|
"folder": None,
|
|
"template_name": "email Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 31, 0, 0),
|
|
"notification_type": NotificationType.EMAIL,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 1,
|
|
},
|
|
{
|
|
"folder": None,
|
|
"template_name": "email Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 29, 0, 0),
|
|
"notification_type": NotificationType.EMAIL,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 3,
|
|
},
|
|
{
|
|
"folder": None,
|
|
"template_name": "sms Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 29, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.CREATED,
|
|
"count": 1,
|
|
},
|
|
{
|
|
"folder": "Test_Folder_For_This",
|
|
"template_name": "sms Template 1",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 31, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.CREATED,
|
|
"count": 1,
|
|
},
|
|
{
|
|
"folder": None,
|
|
"template_name": "sms Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 29, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 10,
|
|
},
|
|
{
|
|
"folder": "Test_Folder_For_This",
|
|
"template_name": "sms Template 2",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 31, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 1,
|
|
},
|
|
{
|
|
"folder": None,
|
|
"template_name": "sms Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 25, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 8,
|
|
},
|
|
{
|
|
"folder": "Test_Folder_For_This",
|
|
"template_name": "sms Template 1",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 31, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 1,
|
|
},
|
|
{
|
|
"folder": None,
|
|
"template_name": "sms Template Name",
|
|
"_no_label": False,
|
|
"created_by": "Test User",
|
|
"last_used": datetime(2018, 10, 29, 0, 0),
|
|
"notification_type": NotificationType.SMS,
|
|
"status": NotificationStatus.DELIVERED,
|
|
"count": 11,
|
|
},
|
|
]
|
|
|
|
expected = [
|
|
[
|
|
str(row[k]) if k != "last_used" else row[k].strftime("%Y-%m-%d")
|
|
for k in (
|
|
"folder",
|
|
"template_name",
|
|
"created_by",
|
|
"last_used",
|
|
"notification_type",
|
|
"status",
|
|
"count",
|
|
)
|
|
]
|
|
for row in sorted(
|
|
expected,
|
|
key=lambda x: (
|
|
str(x["notification_type"]),
|
|
str(x["status"]),
|
|
x["folder"] if x["folder"] is not None else "",
|
|
x["template_name"],
|
|
x["count"],
|
|
x["last_used"],
|
|
),
|
|
)
|
|
]
|
|
|
|
results = [
|
|
[
|
|
str(row[k]) if k != "last_used" else row[k].strftime("%Y-%m-%d")
|
|
for k in (
|
|
"folder",
|
|
"template_name",
|
|
"created_by",
|
|
"last_used",
|
|
"notification_type",
|
|
"status",
|
|
"count",
|
|
)
|
|
]
|
|
for row in sorted(
|
|
results,
|
|
key=lambda x: (
|
|
x.notification_type,
|
|
x.status,
|
|
x.folder if x.folder is not None else "",
|
|
x.template_name,
|
|
x.count,
|
|
x.last_used,
|
|
),
|
|
)
|
|
]
|
|
|
|
assert expected == results
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"start_date, end_date, expected_email, expected_sms, expected_created_sms",
|
|
[
|
|
(29, 30, 3, 10, 1), # not including today
|
|
(29, 31, 4, 11, 2), # today included
|
|
(26, 31, 4, 11, 2),
|
|
],
|
|
)
|
|
@freeze_time("2018-10-31 14:00")
|
|
def test_fetch_notification_status_totals_for_all_services(
|
|
notify_db_session,
|
|
start_date,
|
|
end_date,
|
|
expected_email,
|
|
expected_sms,
|
|
expected_created_sms,
|
|
):
|
|
set_up_data()
|
|
|
|
results = sorted(
|
|
fetch_notification_status_totals_for_all_services(
|
|
start_date=date(2018, 10, start_date), end_date=date(2018, 10, end_date)
|
|
),
|
|
key=lambda x: (x.notification_type, x.status),
|
|
)
|
|
|
|
assert len(results) == 3
|
|
|
|
assert results[0].notification_type == NotificationType.EMAIL
|
|
assert results[0].status == NotificationStatus.DELIVERED
|
|
assert results[0].count == expected_email
|
|
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].status == NotificationStatus.CREATED
|
|
assert results[1].count == expected_created_sms
|
|
|
|
assert results[2].notification_type == NotificationType.SMS
|
|
assert results[2].status == NotificationStatus.DELIVERED
|
|
assert results[2].count == expected_sms
|
|
|
|
|
|
@freeze_time("2018-04-21 14:00")
|
|
def test_fetch_notification_status_totals_for_all_services_works_in_est(
|
|
notify_db_session,
|
|
):
|
|
service_1 = create_service(service_name="service_1")
|
|
sms_template = create_template(service=service_1, template_type=TemplateType.SMS)
|
|
email_template = create_template(
|
|
service=service_1, template_type=TemplateType.EMAIL
|
|
)
|
|
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 4, 20, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 4, 21, 11, 0, 0),
|
|
status=NotificationStatus.CREATED,
|
|
)
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 4, 21, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
email_template,
|
|
created_at=datetime(2018, 4, 21, 13, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
email_template,
|
|
created_at=datetime(2018, 4, 21, 14, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
results = sorted(
|
|
fetch_notification_status_totals_for_all_services(
|
|
start_date=date(2018, 4, 21), end_date=date(2018, 4, 21)
|
|
),
|
|
key=lambda x: (x.notification_type, x.status),
|
|
)
|
|
|
|
assert len(results) == 3
|
|
|
|
assert results[0].notification_type == NotificationType.EMAIL
|
|
assert results[0].status == NotificationStatus.DELIVERED
|
|
assert results[0].count == 2
|
|
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].status == NotificationStatus.CREATED
|
|
assert results[1].count == 1
|
|
|
|
assert results[2].notification_type == NotificationType.SMS
|
|
assert results[2].status == NotificationStatus.DELIVERED
|
|
assert results[2].count == 1
|
|
|
|
|
|
def set_up_data():
|
|
service_2 = create_service(service_name="service_2")
|
|
service_1 = create_service(service_name="service_1")
|
|
sms_template = create_template(service=service_1, template_type=TemplateType.SMS)
|
|
email_template = create_template(
|
|
service=service_1, template_type=TemplateType.EMAIL
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 24),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=8,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
count=10,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29),
|
|
NotificationType.SMS,
|
|
service_1,
|
|
notification_status=NotificationStatus.CREATED,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 29), NotificationType.EMAIL, service_1, count=3
|
|
)
|
|
|
|
create_notification(
|
|
service_1.templates[0],
|
|
created_at=datetime(2018, 10, 30, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(sms_template, created_at=datetime(2018, 10, 31, 11, 0, 0))
|
|
create_notification(
|
|
sms_template,
|
|
created_at=datetime(2018, 10, 31, 12, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_notification(
|
|
email_template,
|
|
created_at=datetime(2018, 10, 31, 13, 0, 0),
|
|
status=NotificationStatus.DELIVERED,
|
|
)
|
|
return service_1, service_2
|
|
|
|
|
|
def test_fetch_notification_statuses_for_job(sample_template):
|
|
j1 = create_job(sample_template)
|
|
j2 = create_job(sample_template)
|
|
|
|
create_ft_notification_status(
|
|
date(2018, 10, 1),
|
|
job=j1,
|
|
notification_status=NotificationStatus.CREATED,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 1),
|
|
job=j1,
|
|
notification_status=NotificationStatus.DELIVERED,
|
|
count=2,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 2),
|
|
job=j1,
|
|
notification_status=NotificationStatus.CREATED,
|
|
count=4,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2018, 10, 1),
|
|
job=j2,
|
|
notification_status=NotificationStatus.CREATED,
|
|
count=8,
|
|
)
|
|
|
|
assert {x.status: x.count for x in fetch_notification_statuses_for_job(j1.id)} == {
|
|
NotificationStatus.CREATED: 5,
|
|
NotificationStatus.DELIVERED: 2,
|
|
}
|
|
|
|
|
|
@freeze_time("2018-10-31 14:00")
|
|
def test_fetch_stats_for_all_services_by_date_range(notify_db_session):
|
|
service_1, service_2 = set_up_data()
|
|
results = fetch_stats_for_all_services_by_date_range(
|
|
start_date=date(2018, 10, 29), end_date=date(2018, 10, 31)
|
|
)
|
|
assert len(results) == 4
|
|
|
|
assert results[0].service_id == service_1.id
|
|
assert results[0].notification_type == NotificationType.EMAIL
|
|
assert results[0].status == NotificationStatus.DELIVERED
|
|
assert results[0].count == 4
|
|
|
|
assert results[1].service_id == service_1.id
|
|
assert results[1].notification_type == NotificationType.SMS
|
|
assert results[1].status == NotificationStatus.CREATED
|
|
assert results[1].count == 2
|
|
|
|
assert results[2].service_id == service_1.id
|
|
assert results[2].notification_type == NotificationType.SMS
|
|
assert results[2].status == NotificationStatus.DELIVERED
|
|
assert results[2].count == 11
|
|
|
|
assert results[3].service_id == service_2.id
|
|
assert not results[3].notification_type
|
|
assert not results[3].status
|
|
assert not results[3].count
|
|
|
|
|
|
@freeze_time("2018-03-30 14:00")
|
|
def test_fetch_monthly_template_usage_for_service(sample_service):
|
|
template_one = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.SMS,
|
|
template_name="a",
|
|
)
|
|
template_two = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.EMAIL,
|
|
template_name="b",
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
local_date=date(2017, 12, 10),
|
|
service=sample_service,
|
|
template=template_two,
|
|
count=3,
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2017, 12, 10),
|
|
service=sample_service,
|
|
template=template_one,
|
|
count=6,
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 1, 1),
|
|
service=sample_service,
|
|
template=template_one,
|
|
count=4,
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 3, 1),
|
|
service=sample_service,
|
|
template=template_two,
|
|
count=5,
|
|
)
|
|
create_notification(template=template_two, created_at=utc_now() - timedelta(days=1))
|
|
create_notification(template=template_two, created_at=utc_now())
|
|
results = fetch_monthly_template_usage_for_service(
|
|
datetime(2017, 4, 1), datetime(2018, 3, 31), sample_service.id
|
|
)
|
|
|
|
assert len(results) == 4
|
|
|
|
assert results[0].template_id == template_one.id
|
|
assert results[0].name == template_one.name
|
|
assert results[0].template_type == template_one.template_type
|
|
assert results[0].month == 12
|
|
assert results[0].year == 2017
|
|
assert results[0].count == 6
|
|
assert results[1].template_id == template_two.id
|
|
assert results[1].name == template_two.name
|
|
assert results[1].template_type == template_two.template_type
|
|
assert results[1].month == 12
|
|
assert results[1].year == 2017
|
|
assert results[1].count == 3
|
|
|
|
assert results[2].template_id == template_one.id
|
|
assert results[2].name == template_one.name
|
|
assert results[2].template_type == template_one.template_type
|
|
assert results[2].month == 1
|
|
assert results[2].year == 2018
|
|
assert results[2].count == 4
|
|
|
|
assert results[3].template_id == template_two.id
|
|
assert results[3].name == template_two.name
|
|
assert results[3].template_type == template_two.template_type
|
|
assert results[3].month == 3
|
|
assert results[3].year == 2018
|
|
assert results[3].count == 6
|
|
|
|
|
|
@freeze_time("2018-03-30 14:00")
|
|
def test_fetch_monthly_template_usage_for_service_does_join_to_notifications_if_today_is_not_in_date_range(
|
|
sample_service,
|
|
):
|
|
template_one = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.SMS,
|
|
template_name="a",
|
|
)
|
|
template_two = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.EMAIL,
|
|
template_name="b",
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 2, 1),
|
|
service=template_two.service,
|
|
template=template_two,
|
|
count=15,
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 2, 2),
|
|
service=template_one.service,
|
|
template=template_one,
|
|
count=20,
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 3, 1),
|
|
service=template_one.service,
|
|
template=template_one,
|
|
count=3,
|
|
)
|
|
create_notification(template=template_one, created_at=utc_now())
|
|
results = fetch_monthly_template_usage_for_service(
|
|
datetime(2018, 1, 1), datetime(2018, 2, 20), template_one.service_id
|
|
)
|
|
|
|
assert len(results) == 2
|
|
|
|
assert results[0].template_id == template_one.id
|
|
assert results[0].name == template_one.name
|
|
assert results[0].template_type == template_one.template_type
|
|
assert results[0].month == 2
|
|
assert results[0].year == 2018
|
|
assert results[0].count == 20
|
|
assert results[1].template_id == template_two.id
|
|
assert results[1].name == template_two.name
|
|
assert results[1].template_type == template_two.template_type
|
|
assert results[1].month == 2
|
|
assert results[1].year == 2018
|
|
assert results[1].count == 15
|
|
|
|
|
|
@freeze_time("2018-03-30 14:00")
|
|
def test_fetch_monthly_template_usage_for_service_does_not_include_cancelled_status(
|
|
sample_template,
|
|
):
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 3, 1),
|
|
service=sample_template.service,
|
|
template=sample_template,
|
|
notification_status=NotificationStatus.CANCELLED,
|
|
count=15,
|
|
)
|
|
create_notification(
|
|
template=sample_template,
|
|
created_at=utc_now(),
|
|
status=NotificationStatus.CANCELLED,
|
|
)
|
|
results = fetch_monthly_template_usage_for_service(
|
|
datetime(2018, 1, 1), datetime(2018, 3, 31), sample_template.service_id
|
|
)
|
|
|
|
assert len(results) == 0
|
|
|
|
|
|
@freeze_time("2018-03-30 14:00")
|
|
def test_fetch_monthly_template_usage_for_service_does_not_include_test_notifications(
|
|
sample_template,
|
|
):
|
|
create_ft_notification_status(
|
|
local_date=date(2018, 3, 1),
|
|
service=sample_template.service,
|
|
template=sample_template,
|
|
notification_status=NotificationStatus.DELIVERED,
|
|
key_type=KeyType.TEST,
|
|
count=15,
|
|
)
|
|
create_notification(
|
|
template=sample_template,
|
|
created_at=utc_now(),
|
|
status=NotificationStatus.DELIVERED,
|
|
key_type=KeyType.TEST,
|
|
)
|
|
results = fetch_monthly_template_usage_for_service(
|
|
datetime(2018, 1, 1),
|
|
datetime(2018, 3, 31),
|
|
sample_template.service_id,
|
|
)
|
|
|
|
assert len(results) == 0
|
|
|
|
|
|
@freeze_time("2019-05-10 14:00")
|
|
def test_fetch_monthly_notification_statuses_per_service(notify_db_session):
|
|
service_one = create_service(
|
|
service_name="service one",
|
|
service_id=UUID("e4e34c4e-73c1-4802-811c-3dd273f21da4"),
|
|
)
|
|
service_two = create_service(
|
|
service_name="service two",
|
|
service_id=UUID("b19d7aad-6f09-4198-8b62-f6cf126b87e5"),
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
date(2019, 4, 30),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.DELIVERED,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 1),
|
|
notification_type=NotificationType.EMAIL,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.SENDING,
|
|
count=4,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 1),
|
|
notification_type=NotificationType.EMAIL,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.PENDING,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 2),
|
|
notification_type=NotificationType.EMAIL,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.TECHNICAL_FAILURE,
|
|
count=2,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 7),
|
|
notification_type=NotificationType.EMAIL,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.FAILED,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 10),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_two,
|
|
notification_status=NotificationStatus.PERMANENT_FAILURE,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 10),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_two,
|
|
notification_status=NotificationStatus.PERMANENT_FAILURE,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 13),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.SENT,
|
|
count=1,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 4, 1),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_two,
|
|
notification_status=NotificationStatus.TEMPORARY_FAILURE,
|
|
count=10,
|
|
)
|
|
create_ft_notification_status(
|
|
date(2019, 3, 31),
|
|
notification_type=NotificationType.SMS,
|
|
service=service_one,
|
|
notification_status=NotificationStatus.DELIVERED,
|
|
)
|
|
|
|
results = fetch_monthly_notification_statuses_per_service(
|
|
date(2019, 3, 1), date(2019, 4, 30)
|
|
)
|
|
|
|
assert len(results) == 5
|
|
# column order: date, service_id, service_name, notifaction_type, count_sending, count_delivered,
|
|
# count_technical_failure, count_temporary_failure, count_permanent_failure, count_sent
|
|
expected = [
|
|
[
|
|
date(2019, 3, 1),
|
|
service_two.id,
|
|
"service two",
|
|
NotificationType.SMS,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
0,
|
|
],
|
|
[
|
|
date(2019, 3, 1),
|
|
service_one.id,
|
|
"service one",
|
|
NotificationType.EMAIL,
|
|
5,
|
|
0,
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
],
|
|
[
|
|
date(2019, 3, 1),
|
|
service_one.id,
|
|
"service one",
|
|
NotificationType.SMS,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
],
|
|
[
|
|
date(2019, 4, 1),
|
|
service_two.id,
|
|
"service two",
|
|
NotificationType.SMS,
|
|
0,
|
|
0,
|
|
0,
|
|
10,
|
|
0,
|
|
0,
|
|
],
|
|
[
|
|
date(2019, 4, 1),
|
|
service_one.id,
|
|
"service one",
|
|
NotificationType.SMS,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
],
|
|
]
|
|
|
|
for row in results:
|
|
assert [x for x in row] in expected
|
|
|
|
|
|
@freeze_time("2019-04-10 14:00")
|
|
def test_fetch_monthly_notification_statuses_per_service_for_rows_that_should_be_excluded(
|
|
notify_db_session,
|
|
):
|
|
valid_service = create_service(service_name="valid service")
|
|
inactive_service = create_service(service_name="inactive", active=False)
|
|
restricted_service = create_service(service_name="restricted", restricted=True)
|
|
|
|
# notification in 'created' state
|
|
create_ft_notification_status(
|
|
date(2019, 3, 15),
|
|
service=valid_service,
|
|
notification_status=NotificationStatus.CREATED,
|
|
)
|
|
# notification created by inactive service
|
|
create_ft_notification_status(date(2019, 3, 15), service=inactive_service)
|
|
# notification created with test key
|
|
create_ft_notification_status(
|
|
date(2019, 3, 12), service=valid_service, key_type=KeyType.TEST
|
|
)
|
|
# notification created by trial mode service
|
|
create_ft_notification_status(date(2019, 3, 19), service=restricted_service)
|
|
# notifications outside date range
|
|
create_ft_notification_status(date(2019, 2, 28), service=valid_service)
|
|
create_ft_notification_status(date(2019, 4, 1), service=valid_service)
|
|
|
|
results = fetch_monthly_notification_statuses_per_service(
|
|
date(2019, 3, 1), date(2019, 3, 31)
|
|
)
|
|
assert len(results) == 0
|
|
|
|
|
|
def test_get_total_notifications_for_date_range(sample_service):
|
|
template_sms = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.SMS,
|
|
template_name="a",
|
|
)
|
|
template_email = create_template(
|
|
service=sample_service,
|
|
template_type=TemplateType.EMAIL,
|
|
template_name="b",
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2021, 2, 28),
|
|
service=template_email.service,
|
|
template=template_email,
|
|
count=15,
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2021, 2, 28),
|
|
service=template_sms.service,
|
|
template=template_sms,
|
|
count=20,
|
|
)
|
|
|
|
create_ft_notification_status(
|
|
local_date=date(2021, 3, 1),
|
|
service=template_email.service,
|
|
template=template_email,
|
|
count=15,
|
|
)
|
|
create_ft_notification_status(
|
|
local_date=date(2021, 3, 1),
|
|
service=template_sms.service,
|
|
template=template_sms,
|
|
count=20,
|
|
)
|
|
|
|
results = get_total_notifications_for_date_range(
|
|
start_date=datetime(2021, 3, 1), end_date=datetime(2021, 3, 1)
|
|
)
|
|
|
|
assert len(results) == 1
|
|
assert results[0] == (date.fromisoformat("2021-03-01"), 15, 20)
|
|
|
|
|
|
@pytest.mark.skip(reason="Need a better way to test variable DST date")
|
|
@freeze_time("2022-03-31T18:00:00")
|
|
@pytest.mark.parametrize(
|
|
"created_at_utc,process_day,expected_count",
|
|
[
|
|
# Clocks change on the 27th of March 2022, so the query needs to look at the
|
|
# time range 00:00 - 23:00 (UTC) thereafter.
|
|
("2022-03-27T00:30", date(2022, 3, 27), 1), # 27/03 00:30 GMT
|
|
("2022-03-27T22:30", date(2022, 3, 27), 1), # 27/03 23:30 BST
|
|
("2022-03-27T23:30", date(2022, 3, 27), 0), # 28/03 00:30 BST
|
|
("2022-03-26T23:30", date(2022, 3, 26), 1), # 26/03 23:30 GMT
|
|
],
|
|
)
|
|
def test_update_fact_notification_status_respects_gmt_bst(
|
|
sample_template,
|
|
sample_service,
|
|
created_at_utc,
|
|
process_day,
|
|
expected_count,
|
|
):
|
|
create_notification(template=sample_template, created_at=created_at_utc)
|
|
update_fact_notification_status(
|
|
process_day, NotificationType.SMS, sample_service.id
|
|
)
|
|
|
|
assert (
|
|
FactNotificationStatus.query.filter_by(
|
|
service_id=sample_service.id, local_date=process_day
|
|
).count()
|
|
== expected_count
|
|
)
|