More cleanup.

Signed-off-by: Cliff Hill <Clifford.hill@gsa.gov>
This commit is contained in:
Cliff Hill
2024-02-13 11:04:02 -05:00
parent acecf9792d
commit 63aa12e4ef
15 changed files with 662 additions and 203 deletions

View File

@@ -174,7 +174,9 @@ def test_get_yearly_usage_by_monthly_from_ft_billing(admin_request, notify_db_se
email_rows = [row for row in json_response if row["notification_type"] == "email"]
assert len(email_rows) == 0
sms_row = next(x for x in json_response if x["notification_type"] == NotificationType.SMS)
sms_row = next(
x for x in json_response if x["notification_type"] == NotificationType.SMS
)
assert sms_row["month"] == "January"
assert sms_row["notification_type"] == NotificationType.SMS

View File

@@ -278,8 +278,12 @@ def test_delete_notifications_task_calls_task_for_services_with_data_retention_o
letter_service = create_service(service_name="c")
create_service_data_retention(sms_service, notification_type=NotificationType.SMS)
create_service_data_retention(email_service, notification_type=NotificationType.EMAIL)
create_service_data_retention(letter_service, notification_type=NotificationType.LETTER)
create_service_data_retention(
email_service, notification_type=NotificationType.EMAIL
)
create_service_data_retention(
letter_service, notification_type=NotificationType.LETTER
)
mock_subtask = mocker.patch(
"app.celery.nightly_tasks.delete_notifications_for_service_and_type"

View File

@@ -415,25 +415,38 @@ def test_create_nightly_notification_status_for_service_and_day(notify_db_sessio
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=TemplateType.EMAIL,)
second_template = create_template(
service=second_service,
template_type=TemplateType.EMAIL,
)
process_day = datetime.utcnow().date() - timedelta(days=5)
with freeze_time(datetime.combine(process_day, time.max)):
create_notification(template=first_template, status=NotificationStatus.DELIVERED,)
create_notification(
template=first_template,
status=NotificationStatus.DELIVERED,
)
create_notification(template=second_template, status=NotificationStatus.FAILED)
# team API key notifications are included
create_notification(
template=second_template, status=NotificationStatus.SENDING, key_type=KeyType.TEAM,
template=second_template,
status=NotificationStatus.SENDING,
key_type=KeyType.TEAM,
)
# test notifications are ignored
create_notification(
template=second_template, status=NotificationStatus.SENDING, key_type=KeyType.TEST,
template=second_template,
status=NotificationStatus.SENDING,
key_type=KeyType.TEST,
)
# historical notifications are included
create_notification_history(template=second_template, status=NotificationStatus.DELIVERED,)
create_notification_history(
template=second_template,
status=NotificationStatus.DELIVERED,
)
# these created notifications from a different day get ignored
with freeze_time(
@@ -445,10 +458,14 @@ def test_create_nightly_notification_status_for_service_and_day(notify_db_sessio
assert len(FactNotificationStatus.query.all()) == 0
create_nightly_notification_status_for_service_and_day(
str(process_day), first_service.id, NotificationType.SMS,
str(process_day),
first_service.id,
NotificationType.SMS,
)
create_nightly_notification_status_for_service_and_day(
str(process_day), second_service.id, NotificationType.EMAIL,
str(process_day),
second_service.id,
NotificationType.EMAIL,
)
new_fact_data = FactNotificationStatus.query.order_by(
@@ -501,9 +518,13 @@ def test_create_nightly_notification_status_for_service_and_day_overwrites_old_d
process_day = datetime.utcnow().date()
# first run: one notification, expect one row (just one status)
notification = create_notification(template=first_template, status=NotificationStatus.SENDING)
notification = create_notification(
template=first_template, status=NotificationStatus.SENDING
)
create_nightly_notification_status_for_service_and_day(
str(process_day), first_service.id, NotificationType.SMS,
str(process_day),
first_service.id,
NotificationType.SMS,
)
new_fact_data = FactNotificationStatus.query.all()
@@ -516,7 +537,9 @@ def test_create_nightly_notification_status_for_service_and_day_overwrites_old_d
notification.status = NotificationStatus.DELIVERED
create_notification(template=first_template, status=NotificationStatus.CREATED)
create_nightly_notification_status_for_service_and_day(
str(process_day), first_service.id, NotificationType.SMS,
str(process_day),
first_service.id,
NotificationType.SMS,
)
updated_fact_data = FactNotificationStatus.query.order_by(
@@ -536,22 +559,32 @@ def test_create_nightly_notification_status_for_service_and_day_respects_bst(
sample_template,
):
create_notification(
sample_template, status=NotificationStatus.DELIVERED, created_at=datetime(2019, 4, 2, 5, 0),
sample_template,
status=NotificationStatus.DELIVERED,
created_at=datetime(2019, 4, 2, 5, 0),
) # too new
create_notification(
sample_template, status=NotificationStatus.CREATED, created_at=datetime(2019, 4, 2, 5, 59),
sample_template,
status=NotificationStatus.CREATED,
created_at=datetime(2019, 4, 2, 5, 59),
)
create_notification(
sample_template, status=NotificationStatus.CREATED, created_at=datetime(2019, 4, 1, 4, 0),
sample_template,
status=NotificationStatus.CREATED,
created_at=datetime(2019, 4, 1, 4, 0),
)
create_notification(
sample_template, status=NotificationStatus.DELIVERED, created_at=datetime(2019, 3, 21, 17, 59),
sample_template,
status=NotificationStatus.DELIVERED,
created_at=datetime(2019, 3, 21, 17, 59),
) # too old
create_nightly_notification_status_for_service_and_day(
"2019-04-01", sample_template.service_id, NotificationType.SMS,
"2019-04-01",
sample_template.service_id,
NotificationType.SMS,
)
noti_status = FactNotificationStatus.query.order_by(

View File

@@ -101,7 +101,9 @@ def test_should_update_scheduled_jobs_and_put_on_queue(mocker, sample_template):
one_minute_in_the_past = datetime.utcnow() - timedelta(minutes=1)
job = create_job(
sample_template, job_status=JobStatus.SCHEDULED, scheduled_for=one_minute_in_the_past
sample_template,
job_status=JobStatus.SCHEDULED,
scheduled_for=one_minute_in_the_past,
)
run_scheduled_jobs()
@@ -118,10 +120,14 @@ def test_should_update_all_scheduled_jobs_and_put_on_queue(sample_template, mock
ten_minutes_in_the_past = datetime.utcnow() - timedelta(minutes=10)
twenty_minutes_in_the_past = datetime.utcnow() - timedelta(minutes=20)
job_1 = create_job(
sample_template, job_status=JobStatus.SCHEDULED, scheduled_for=one_minute_in_the_past,
sample_template,
job_status=JobStatus.SCHEDULED,
scheduled_for=one_minute_in_the_past,
)
job_2 = create_job(
sample_template, job_status=JobStatus.SCHEDULED, scheduled_for=ten_minutes_in_the_past,
sample_template,
job_status=JobStatus.SCHEDULED,
scheduled_for=ten_minutes_in_the_past,
)
job_3 = create_job(
sample_template,
@@ -299,8 +305,12 @@ def test_replay_created_notifications(notify_db_session, sample_service, mocker)
"app.celery.provider_tasks.deliver_sms.apply_async"
)
sms_template = create_template(service=sample_service, template_type=TemplateType.SMS)
email_template = create_template(service=sample_service, template_type=TemplateType.EMAIL)
sms_template = create_template(
service=sample_service, template_type=TemplateType.SMS
)
email_template = create_template(
service=sample_service, template_type=TemplateType.EMAIL
)
older_than = (60 * 60) + (60 * 15) # 1 hour 15 minutes
# notifications expected to be resent
old_sms = create_notification(
@@ -325,10 +335,14 @@ def test_replay_created_notifications(notify_db_session, sample_service, mocker)
status=NotificationStatus.DELIVERED,
)
create_notification(
template=sms_template, created_at=datetime.utcnow(), status=NotificationStatus.CREATED,
template=sms_template,
created_at=datetime.utcnow(),
status=NotificationStatus.CREATED,
)
create_notification(
template=email_template, created_at=datetime.utcnow(), status=NotificationStatus.CREATED,
template=email_template,
created_at=datetime.utcnow(),
status=NotificationStatus.CREATED,
)
replay_created_notifications()

View File

@@ -21,7 +21,9 @@ from tests.app.db import (
)
@pytest.mark.parametrize("notification_type", [NotificationType.EMAIL, NotificationType.SMS])
@pytest.mark.parametrize(
"notification_type", [NotificationType.EMAIL, NotificationType.SMS]
)
def test_send_delivery_status_to_service_post_https_request_to_service_with_encrypted_data(
notify_db_session, notification_type
):
@@ -103,7 +105,10 @@ def test_send_complaint_to_service_posts_https_request_to_service_with_encrypted
] == "Bearer {}".format(callback_api.bearer_token)
@pytest.mark.parametrize("notification_type", [NotificationType.EMAIL, NotificationType.SMS],)
@pytest.mark.parametrize(
"notification_type",
[NotificationType.EMAIL, NotificationType.SMS],
)
@pytest.mark.parametrize("status_code", [429, 500, 503])
def test__send_data_to_service_callback_api_retries_if_request_returns_error_code_with_encrypted_data(
notify_db_session, mocker, notification_type, status_code
@@ -131,7 +136,10 @@ def test__send_data_to_service_callback_api_retries_if_request_returns_error_cod
assert mocked.call_args[1]["queue"] == "service-callbacks-retry"
@pytest.mark.parametrize("notification_type", [NotificationType.EMAIL, NotificationType.SMS],)
@pytest.mark.parametrize(
"notification_type",
[NotificationType.EMAIL, NotificationType.SMS],
)
def test__send_data_to_service_callback_api_does_not_retry_if_request_returns_404_with_encrypted_data(
notify_db_session, mocker, notification_type
):
@@ -160,7 +168,10 @@ def test__send_data_to_service_callback_api_does_not_retry_if_request_returns_40
def test_send_delivery_status_to_service_succeeds_if_sent_at_is_none(
notify_db_session, mocker
):
callback_api, template = _set_up_test_data(NotificationType.EMAIL, CallbackType.DELIVERY_STATUS,)
callback_api, template = _set_up_test_data(
NotificationType.EMAIL,
CallbackType.DELIVERY_STATUS,
)
datestr = datetime(2017, 6, 20)
notification = create_notification(
template=template,

View File

@@ -475,7 +475,11 @@ def test_save_email_should_save_default_email_reply_to_text_on_notification(
create_reply_to_email(
service=service, email_address="reply_to@digital.fake.gov", is_default=True
)
template = create_template(service=service, template_type=TemplateType.EMAIL, subject="Hello",)
template = create_template(
service=service,
template_type=TemplateType.EMAIL,
subject="Hello",
)
notification = _notification_json(template, to="test@example.com")
mocker.patch("app.celery.provider_tasks.deliver_email.apply_async")
@@ -536,7 +540,11 @@ def test_should_not_save_email_if_restricted_service_and_invalid_email_address(
):
user = create_user()
service = create_service(user=user, restricted=True)
template = create_template(service=service, template_type=TemplateType.EMAIL, subject="Hello",)
template = create_template(
service=service,
template_type=TemplateType.EMAIL,
subject="Hello",
)
notification = _notification_json(template, to="test@example.com")
notification_id = uuid.uuid4()
@@ -551,7 +559,10 @@ def test_should_not_save_email_if_restricted_service_and_invalid_email_address(
def test_should_save_sms_template_to_and_persist_with_job_id(sample_job, mocker):
notification = _notification_json(
sample_job.template, to="+447234123123", job_id=sample_job.id, row_number=2,
sample_job.template,
to="+447234123123",
job_id=sample_job.id,
row_number=2,
)
mocker.patch("app.celery.provider_tasks.deliver_sms.apply_async")
@@ -726,11 +737,15 @@ def test_save_email_uses_the_reply_to_text_when_provided(sample_email_template,
service = sample_email_template.service
notification_id = uuid.uuid4()
service_email_reply_to_dao.add_reply_to_email_address_for_service(
service.id, "default@example.com", True,
service.id,
"default@example.com",
True,
)
other_email_reply_to = (
service_email_reply_to_dao.add_reply_to_email_address_for_service(
service.id, "other@example.com", False,
service.id,
"other@example.com",
False,
)
)
@@ -754,7 +769,9 @@ def test_save_email_uses_the_default_reply_to_text_if_sender_id_is_none(
service = sample_email_template.service
notification_id = uuid.uuid4()
service_email_reply_to_dao.add_reply_to_email_address_for_service(
service.id, "default@example.com", True,
service.id,
"default@example.com",
True,
)
save_email(
@@ -925,7 +942,9 @@ def test_save_sms_uses_non_default_sms_sender_reply_to_text_if_provided(
service = create_service_with_defined_sms_sender(sms_sender_value="2028675309")
template = create_template(service=service)
new_sender = service_sms_sender_dao.dao_add_sms_sender_for_service(
service.id, "new-sender", False,
service.id,
"new-sender",
False,
)
notification = _notification_json(template, to="202-867-5301")
@@ -1377,7 +1396,10 @@ def test_process_incomplete_jobs_sets_status_to_in_progress_and_resets_processin
@freeze_time("2020-03-25 14:30")
@pytest.mark.parametrize("notification_type", [NotificationType.SMS, NotificationType.EMAIL],)
@pytest.mark.parametrize(
"notification_type",
[NotificationType.SMS, NotificationType.EMAIL],
)
def test_save_api_email_or_sms(mocker, sample_service, notification_type):
template = (
create_template(sample_service)
@@ -1427,7 +1449,9 @@ def test_save_api_email_or_sms(mocker, sample_service, notification_type):
@freeze_time("2020-03-25 14:30")
@pytest.mark.parametrize("notification_type", [NotificationType.SMS, NotificationType.EMAIL])
@pytest.mark.parametrize(
"notification_type", [NotificationType.SMS, NotificationType.EMAIL]
)
def test_save_api_email_dont_retry_if_notification_already_exists(
sample_service, mocker, notification_type
):
@@ -1549,8 +1573,18 @@ def test_save_tasks_use_cached_service_and_template(
@pytest.mark.parametrize(
"notification_type, task_function, expected_queue, recipient",
(
(NotificationType.SMS, save_api_sms, QueueNames.SEND_SMS, "+447700900855",),
(NotificationType.EMAIL, save_api_email, QueueNames.SEND_EMAIL, "jane.citizen@example.com",),
(
NotificationType.SMS,
save_api_sms,
QueueNames.SEND_SMS,
"+447700900855",
),
(
NotificationType.EMAIL,
save_api_email,
QueueNames.SEND_EMAIL,
"jane.citizen@example.com",
),
),
)
def test_save_api_tasks_use_cache(

View File

@@ -1,7 +1,7 @@
import json
from types import CodeType
import uuid
from datetime import datetime, timedelta
from types import CodeType
import pytest
import pytz

View File

@@ -22,7 +22,7 @@ from app.dao.fact_billing_dao import (
)
from app.dao.organization_dao import dao_add_service_to_organization
from app.enums import NotificationStatus, NotificationType, TemplateType
from app.models import FactBilling, Notification
from app.models import FactBilling
from tests.app.db import (
create_annual_billing,
create_ft_billing,
@@ -95,7 +95,11 @@ def test_fetch_billing_data_for_today_includes_data_with_the_right_key_type(
service = create_service()
template = create_template(service=service, template_type=TemplateType.EMAIL)
for key_type in ["normal", "test", "team"]:
create_notification(template=template, status=NotificationStatus.DELIVERED, key_type=key_type,)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
key_type=key_type,
)
today = datetime.utcnow()
results = fetch_billing_data_for_day(today.date())
@@ -103,7 +107,9 @@ def test_fetch_billing_data_for_today_includes_data_with_the_right_key_type(
assert results[0].notifications_sent == 2
@pytest.mark.parametrize("notification_type", [NotificationType.EMAIL, NotificationType.SMS])
@pytest.mark.parametrize(
"notification_type", [NotificationType.EMAIL, NotificationType.SMS]
)
def test_fetch_billing_data_for_day_only_calls_query_for_permission_type(
notify_db_session, notification_type
):
@@ -119,7 +125,10 @@ def test_fetch_billing_data_for_day_only_calls_query_for_permission_type(
assert len(results) == 1
@pytest.mark.parametrize("notification_type", [NotificationType.EMAIL, NotificationType.SMS],)
@pytest.mark.parametrize(
"notification_type",
[NotificationType.EMAIL, NotificationType.SMS],
)
def test_fetch_billing_data_for_day_only_calls_query_for_all_channels(
notify_db_session, notification_type
):
@@ -130,7 +139,8 @@ def test_fetch_billing_data_for_day_only_calls_query_for_all_channels(
create_notification(template=sms_template, status=NotificationStatus.DELIVERED)
today = datetime.utcnow()
results = fetch_billing_data_for_day(
process_day=today.date(), check_permissions=False,
process_day=today.date(),
check_permissions=False,
)
assert len(results) == 2
@@ -142,7 +152,11 @@ def test_fetch_billing_data_for_today_includes_data_with_the_right_date(
process_day = datetime(2018, 4, 1, 13, 30, 0)
service = create_service()
template = create_template(service=service, template_type=TemplateType.EMAIL)
create_notification(template=template, status=NotificationStatus.DELIVERED, created_at=process_day,)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
created_at=process_day,
)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
@@ -155,7 +169,12 @@ def test_fetch_billing_data_for_today_includes_data_with_the_right_date(
created_at=datetime(2018, 4, 1, 0, 23, 23),
)
create_notification(
template=template, status=NotificationStatus.SENDING, created_at=process_day + timedelta(days=1,)
template=template,
status=NotificationStatus.SENDING,
created_at=process_day
+ timedelta(
days=1,
),
)
day_under_test = process_day
@@ -198,8 +217,16 @@ def test_fetch_billing_data_for_day_is_grouped_by_service(notify_db_session):
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=NotificationStatus.DELIVERED, sent_by="sns",)
create_notification(template=template, status=NotificationStatus.DELIVERED, sent_by="sns",)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
sent_by="sns",
)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
sent_by="sns",
)
today = datetime.utcnow()
results = fetch_billing_data_for_day(today.date())
@@ -211,8 +238,16 @@ def test_fetch_billing_data_for_day_is_grouped_by_provider(notify_db_session):
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=NotificationStatus.DELIVERED, rate_multiplier=1,)
create_notification(template=template, status=NotificationStatus.DELIVERED, rate_multiplier=2,)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
rate_multiplier=1,
)
create_notification(
template=template,
status=NotificationStatus.DELIVERED,
rate_multiplier=2,
)
today = datetime.utcnow()
results = fetch_billing_data_for_day(today.date())
@@ -224,8 +259,16 @@ def test_fetch_billing_data_for_day_is_grouped_by_rate_mulitplier(notify_db_sess
def test_fetch_billing_data_for_day_is_grouped_by_international(notify_db_session):
service = create_service()
sms_template = create_template(service=service)
create_notification(template=sms_template, status=NotificationStatus.DELIVERED, international=True,)
create_notification(template=sms_template, status=NotificationStatus.DELIVERED, international=False,)
create_notification(
template=sms_template,
status=NotificationStatus.DELIVERED,
international=True,
)
create_notification(
template=sms_template,
status=NotificationStatus.DELIVERED,
international=False,
)
today = datetime.utcnow()
results = fetch_billing_data_for_day(today.date())
@@ -266,10 +309,14 @@ def test_fetch_billing_data_for_day_uses_correct_table(notify_db_session):
five_days_ago = datetime.utcnow() - timedelta(days=5)
create_notification(
template=sms_template, status=NotificationStatus.DELIVERED, created_at=five_days_ago,
template=sms_template,
status=NotificationStatus.DELIVERED,
created_at=five_days_ago,
)
create_notification_history(
template=email_template, status=NotificationStatus.DELIVERED, created_at=five_days_ago,
template=email_template,
status=NotificationStatus.DELIVERED,
created_at=five_days_ago,
)
results = fetch_billing_data_for_day(
@@ -311,16 +358,24 @@ def test_fetch_billing_data_for_day_bills_correctly_for_status(notify_db_session
)
sms_results = [x for x in results if x.notification_type == NotificationType.SMS]
email_results = [x for x in results if x.notification_type == NotificationType.EMAIL]
email_results = [
x for x in results if x.notification_type == NotificationType.EMAIL
]
# we expect as many rows as we check for notification types
assert 6 == sms_results[0].notifications_sent
assert 4 == email_results[0].notifications_sent
def test_get_rates_for_billing(notify_db_session):
create_rate(start_date=datetime.utcnow(), value=12, notification_type=NotificationType.EMAIL)
create_rate(start_date=datetime.utcnow(), value=22, notification_type=NotificationType.SMS)
create_rate(start_date=datetime.utcnow(), value=33, notification_type=NotificationType.EMAIL)
create_rate(
start_date=datetime.utcnow(), value=12, notification_type=NotificationType.EMAIL
)
create_rate(
start_date=datetime.utcnow(), value=22, notification_type=NotificationType.SMS
)
create_rate(
start_date=datetime.utcnow(), value=33, notification_type=NotificationType.EMAIL
)
rates = get_rates_for_billing()
assert len(rates) == 3
@@ -329,17 +384,25 @@ def test_get_rates_for_billing(notify_db_session):
@freeze_time("2017-06-01 12:00")
def test_get_rate(notify_db_session):
create_rate(
start_date=datetime(2017, 5, 30, 23, 0), value=1.2, notification_type=NotificationType.EMAIL,
start_date=datetime(2017, 5, 30, 23, 0),
value=1.2,
notification_type=NotificationType.EMAIL,
)
create_rate(
start_date=datetime(2017, 5, 30, 23, 0), value=2.2, notification_type=NotificationType.SMS,
start_date=datetime(2017, 5, 30, 23, 0),
value=2.2,
notification_type=NotificationType.SMS,
)
create_rate(
start_date=datetime(2017, 5, 30, 23, 0), value=3.3, notification_type=NotificationType.EMAIL,
start_date=datetime(2017, 5, 30, 23, 0),
value=3.3,
notification_type=NotificationType.EMAIL,
)
rates = get_rates_for_billing()
rate = get_rate(rates, notification_type=NotificationType.SMS, date=date(2017, 6, 1))
rate = get_rate(
rates, notification_type=NotificationType.SMS, date=date(2017, 6, 1)
)
assert rate == 2.2
@@ -351,10 +414,14 @@ def test_get_rate_chooses_right_rate_depending_on_date(
notify_db_session, date, expected_rate
):
create_rate(
start_date=datetime(2016, 1, 1, 0, 0), value=1.2, notification_type=NotificationType.SMS,
start_date=datetime(2016, 1, 1, 0, 0),
value=1.2,
notification_type=NotificationType.SMS,
)
create_rate(
start_date=datetime(2018, 9, 30, 23, 0), value=2.2, notification_type=NotificationType.SMS,
start_date=datetime(2018, 9, 30, 23, 0),
value=2.2,
notification_type=NotificationType.SMS,
)
rates = get_rates_for_billing()
@@ -397,7 +464,9 @@ def test_fetch_monthly_billing_for_year(notify_db_session):
def test_fetch_monthly_billing_for_year_variable_rates(notify_db_session):
service = set_up_yearly_data_variable_rates()
create_annual_billing(
service_id=service.id, free_sms_fragment_limit=6, financial_year_start=2018,
service_id=service.id,
free_sms_fragment_limit=6,
financial_year_start=2018,
)
results = fetch_monthly_billing_for_year(service.id, 2018)
@@ -501,7 +570,9 @@ def test_fetch_billing_totals_for_year_uses_current_annual_billing(notify_db_ses
def test_fetch_billing_totals_for_year_variable_rates(notify_db_session):
service = set_up_yearly_data_variable_rates()
create_annual_billing(
service_id=service.id, free_sms_fragment_limit=6, financial_year_start=2018,
service_id=service.id,
free_sms_fragment_limit=6,
financial_year_start=2018,
)
results = fetch_billing_totals_for_year(service_id=service.id, year=2018)
@@ -558,13 +629,21 @@ def test_fetch_sms_free_allowance_remainder_until_date_with_two_services(
org = create_organization(name="Org for {}".format(service.name))
dao_add_service_to_organization(service=service, organization_id=org.id)
create_annual_billing(
service_id=service.id, free_sms_fragment_limit=10, financial_year_start=2016,
service_id=service.id,
free_sms_fragment_limit=10,
financial_year_start=2016,
)
create_ft_billing(
template=template, local_date=datetime(2016, 4, 20), billable_unit=2, rate=0.11,
template=template,
local_date=datetime(2016, 4, 20),
billable_unit=2,
rate=0.11,
)
create_ft_billing(
template=template, local_date=datetime(2016, 5, 20), billable_unit=3, rate=0.11,
template=template,
local_date=datetime(2016, 5, 20),
billable_unit=3,
rate=0.11,
)
service_2 = create_service(service_name="used free allowance")
@@ -693,7 +772,9 @@ def test_fetch_sms_billing_for_all_services_with_remainder(notify_db_session):
)
service_4 = create_service(service_name="d - email only")
email_template = create_template(service=service_4, template_type=TemplateType.EMAIL)
email_template = create_template(
service=service_4, template_type=TemplateType.EMAIL
)
org_4 = create_organization(name="Org for {}".format(service_4.name))
dao_add_service_to_organization(service=service_4, organization_id=org_4.id)
create_annual_billing(
@@ -827,13 +908,17 @@ def test_fetch_usage_year_for_organization(notify_db_session):
financial_year_start=2019,
)
dao_add_service_to_organization(
service=service_with_emails_for_org, organization_id=fixtures["org_1"].id,
service=service_with_emails_for_org,
organization_id=fixtures["org_1"].id,
)
template = create_template(
service=service_with_emails_for_org, template_type=TemplateType.EMAIL,
service=service_with_emails_for_org,
template_type=TemplateType.EMAIL,
)
create_ft_billing(
local_date=datetime(2019, 5, 1), template=template, notifications_sent=1100,
local_date=datetime(2019, 5, 1),
template=template,
notifications_sent=1100,
)
results = fetch_usage_year_for_organization(fixtures["org_1"].id, 2019)
@@ -1039,8 +1124,12 @@ def test_fetch_usage_year_for_organization_only_returns_data_for_live_services(
live_service = create_service(restricted=False)
sms_template = create_template(service=live_service)
trial_service = create_service(restricted=True, service_name="trial_service")
email_template = create_template(service=trial_service, template_type=TemplateType.EMAIL)
trial_sms_template = create_template(service=trial_service, template_type=TemplateType.SMS)
email_template = create_template(
service=trial_service, template_type=TemplateType.EMAIL
)
trial_sms_template = create_template(
service=trial_service, template_type=TemplateType.SMS
)
dao_add_service_to_organization(service=live_service, organization_id=org.id)
dao_add_service_to_organization(service=trial_service, organization_id=org.id)
create_ft_billing(

View File

@@ -255,23 +255,52 @@ def test_fetch_notification_status_by_template_for_service_for_today_and_7_previ
# 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,
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_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,
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,
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,
email_template,
created_at=datetime(2018, 10, 31, 13, 0, 0),
status=NotificationStatus.DELIVERED,
)
# too early, shouldn't be included
@@ -282,19 +311,83 @@ def test_fetch_notification_status_by_template_for_service_for_today_and_7_previ
)
results = fetch_notification_status_for_service_for_today_and_7_previous_days(
service_1.id, by_template=True,
service_1.id,
by_template=True,
)
assert [
("email Template Name", False, mock.ANY, NotificationType.EMAIL, NotificationStatus.DELIVERED, 1,),
("email Template Name", False, mock.ANY, NotificationType.EMAIL, NotificationStatus.DELIVERED, 3,),
("sms Template 1", False, mock.ANY, NotificationType.SMS, NotificationStatus.CREATED, 1,),
("sms Template Name", False, mock.ANY, NotificationType.SMS, NotificationStatus.CREATED, 1,),
("sms Template 1", False, mock.ANY, NotificationType.SMS, NotificationStatus.DELIVERED, 1,),
("sms Template 2", False, mock.ANY, NotificationType.SMS, NotificationStatus.DELIVERED, 1,),
("sms Template Name", False, mock.ANY, NotificationType.SMS, NotificationStatus.DELIVERED, 8,),
("sms Template Name", False, mock.ANY, NotificationType.SMS, NotificationStatus.DELIVERED, 10,),
("sms Template Name", False, mock.ANY, NotificationType.SMS, NotificationStatus.DELIVERED, 11,),
(
"email Template Name",
False,
mock.ANY,
NotificationType.EMAIL,
NotificationStatus.DELIVERED,
1,
),
(
"email Template Name",
False,
mock.ANY,
NotificationType.EMAIL,
NotificationStatus.DELIVERED,
3,
),
(
"sms Template 1",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.CREATED,
1,
),
(
"sms Template Name",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.CREATED,
1,
),
(
"sms Template 1",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.DELIVERED,
1,
),
(
"sms Template 2",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.DELIVERED,
1,
),
(
"sms Template Name",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.DELIVERED,
8,
),
(
"sms Template Name",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.DELIVERED,
10,
),
(
"sms Template Name",
False,
mock.ANY,
NotificationType.SMS,
NotificationStatus.DELIVERED,
11,
),
] == sorted(
results, key=lambda x: (x.notification_type, x.status, x.template_name, x.count)
)
@@ -352,19 +445,29 @@ def test_fetch_notification_status_totals_for_all_services_works_in_est(
)
create_notification(
sms_template, created_at=datetime(2018, 4, 20, 12, 0, 0), status=NotificationStatus.DELIVERED,
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,
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,
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,
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,
email_template,
created_at=datetime(2018, 4, 21, 14, 0, 0),
status=NotificationStatus.DELIVERED,
)
results = sorted(
@@ -396,12 +499,27 @@ def set_up_data():
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,
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_ft_notification_status(date(2018, 10, 29), NotificationType.EMAIL, service_1, count=3)
create_notification(
service_1.templates[0],
@@ -410,10 +528,14 @@ def set_up_data():
)
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,
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,
email_template,
created_at=datetime(2018, 10, 31, 13, 0, 0),
status=NotificationStatus.DELIVERED,
)
return service_1, service_2
@@ -423,16 +545,28 @@ def test_fetch_notification_statuses_for_job(sample_template):
j2 = create_job(sample_template)
create_ft_notification_status(
date(2018, 10, 1), job=j1, notification_status=NotificationStatus.CREATED, count=1,
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,
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,
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,
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)} == {
@@ -473,10 +607,14 @@ def test_fetch_stats_for_all_services_by_date_range(notify_db_session):
@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",
service=sample_service,
template_type=TemplateType.SMS,
template_name="a",
)
template_two = create_template(
service=sample_service, template_type=TemplateType.EMAIL, template_name="b",
service=sample_service,
template_type=TemplateType.EMAIL,
template_name="b",
)
create_ft_notification_status(
@@ -548,10 +686,14 @@ def test_fetch_monthly_template_usage_for_service_does_join_to_notifications_if_
sample_service,
):
template_one = create_template(
service=sample_service, template_type=TemplateType.SMS, template_name="a",
service=sample_service,
template_type=TemplateType.SMS,
template_name="a",
)
template_two = create_template(
service=sample_service, template_type=TmplateType.EMAIL, template_name="b",
service=sample_service,
template_type=TemplateType.EMAIL,
template_name="b",
)
create_ft_notification_status(
local_date=date(2018, 2, 1),
@@ -604,7 +746,9 @@ def test_fetch_monthly_template_usage_for_service_does_not_include_cancelled_sta
count=15,
)
create_notification(
template=sample_template, created_at=datetime.utcnow(), status=NotificationStatus.CANCELLED,
template=sample_template,
created_at=datetime.utcnow(),
status=NotificationStatus.CANCELLED,
)
results = fetch_monthly_template_usage_for_service(
datetime(2018, 1, 1), datetime(2018, 3, 31), sample_template.service_id
@@ -632,7 +776,9 @@ def test_fetch_monthly_template_usage_for_service_does_not_include_test_notifica
key_type=KeyType.TEST,
)
results = fetch_monthly_template_usage_for_service(
datetime(2018, 1, 1), datetime(2018, 3, 31), sample_template.service_id,
datetime(2018, 1, 1),
datetime(2018, 3, 31),
sample_template.service_id,
)
assert len(results) == 0
@@ -821,10 +967,14 @@ def test_fetch_monthly_notification_statuses_per_service_for_rows_that_should_be
def test_get_total_notifications_for_date_range(sample_service):
template_sms = create_template(
service=sample_service, template_type=TemplateType.SMS, template_name="a",
service=sample_service,
template_type=TemplateType.SMS,
template_name="a",
)
template_email = create_template(
service=sample_service, template_type=TemplateType.EMAIL, template_name="b",
service=sample_service,
template_type=TemplateType.EMAIL,
template_name="b",
)
create_ft_notification_status(
local_date=date(2021, 2, 28),

View File

@@ -66,10 +66,12 @@ def test_get_all_inbound_sms_filters_on_service(notify_db_session):
def test_get_all_inbound_sms_filters_on_time(sample_service, notify_db_session):
create_inbound_sms(
sample_service, created_at=datetime(2017, 8, 6, 23, 59),
sample_service,
created_at=datetime(2017, 8, 6, 23, 59),
) # sunday evening
sms_two = create_inbound_sms(
sample_service, created_at=datetime(2017, 8, 7, 0, 0),
sample_service,
created_at=datetime(2017, 8, 7, 0, 0),
) # monday (7th) morning
with freeze_time("2017-08-14 12:00"):
@@ -111,13 +113,19 @@ def test_should_delete_inbound_sms_according_to_data_retention(notify_db_session
services = [short_retention_service, no_retention_service, long_retention_service]
create_service_data_retention(
long_retention_service, notification_type=NotificationType.SMS, days_of_retention=30,
long_retention_service,
notification_type=NotificationType.SMS,
days_of_retention=30,
)
create_service_data_retention(
short_retention_service, notification_type=NotificationType.SMS, days_of_retention=3,
short_retention_service,
notification_type=NotificationType.SMS,
days_of_retention=3,
)
create_service_data_retention(
short_retention_service, notification_type=NotificationType.EMAIL, days_of_retention=4,
short_retention_service,
notification_type=NotificationType.EMAIL,
days_of_retention=4,
)
dates = [

View File

@@ -46,7 +46,9 @@ def test_can_get_sms_non_international_providers(notify_db_session):
def test_can_get_sms_international_providers(notify_db_session):
sms_providers = get_provider_details_by_notification_type(NotificationType.SMS, True)
sms_providers = get_provider_details_by_notification_type(
NotificationType.SMS, True
)
assert len(sms_providers) == 1
assert all(NotificationType.SMS == prov.notification_type for prov in sms_providers)
assert all(prov.supports_international for prov in sms_providers)
@@ -68,9 +70,13 @@ def test_can_get_email_providers(notify_db_session):
assert len(get_provider_details_by_notification_type(NotificationType.EMAIL)) == 1
types = [
provider.notification_type
for provider in get_provider_details_by_notification_type(NotificationType.EMAIL)
for provider in get_provider_details_by_notification_type(
NotificationType.EMAIL
)
]
assert all(NotificationType.EMAIL == notification_type for notification_type in types)
assert all(
NotificationType.EMAIL == notification_type for notification_type in types
)
def test_should_not_error_if_any_provider_in_code_not_in_database(

View File

@@ -17,8 +17,16 @@ from tests.app.db import create_service, create_service_data_retention
def test_fetch_service_data_retention(sample_service):
email_data_retention = insert_service_data_retention(sample_service.id, NotificationType.EMAIL, 3,)
sms_data_retention = insert_service_data_retention(sample_service.id, NotificationType.SMS, 5,)
email_data_retention = insert_service_data_retention(
sample_service.id,
NotificationType.EMAIL,
3,
)
sms_data_retention = insert_service_data_retention(
sample_service.id,
NotificationType.SMS,
5,
)
list_of_data_retention = fetch_service_data_retention(sample_service.id)
@@ -29,7 +37,11 @@ def test_fetch_service_data_retention(sample_service):
def test_fetch_service_data_retention_only_returns_row_for_service(sample_service):
another_service = create_service(service_name="Another service")
email_data_retention = insert_service_data_retention(sample_service.id, NotificationType.EMAIL, 3,)
email_data_retention = insert_service_data_retention(
sample_service.id,
NotificationType.EMAIL,
3,
)
insert_service_data_retention(another_service.id, NotificationType.SMS, 5)
list_of_data_retention = fetch_service_data_retention(sample_service.id)
@@ -62,7 +74,11 @@ def test_fetch_service_data_retention_by_id_returns_none_if_id_not_for_service(
sample_service,
):
another_service = create_service(service_name="Another service")
email_data_retention = insert_service_data_retention(sample_service.id, NotificationType.EMAIL, 3,)
email_data_retention = insert_service_data_retention(
sample_service.id,
NotificationType.EMAIL,
3,
)
result = fetch_service_data_retention_by_id(
another_service.id, email_data_retention.id
)
@@ -71,7 +87,9 @@ def test_fetch_service_data_retention_by_id_returns_none_if_id_not_for_service(
def test_insert_service_data_retention(sample_service):
insert_service_data_retention(
service_id=sample_service.id, notification_type=NotificationType.EMAIL, days_of_retention=3,
service_id=sample_service.id,
notification_type=NotificationType.EMAIL,
days_of_retention=3,
)
results = ServiceDataRetention.query.all()
@@ -84,17 +102,23 @@ def test_insert_service_data_retention(sample_service):
def test_insert_service_data_retention_throws_unique_constraint(sample_service):
insert_service_data_retention(
service_id=sample_service.id, notification_type=NotificationType.EMAIL, days_of_retention=3,
service_id=sample_service.id,
notification_type=NotificationType.EMAIL,
days_of_retention=3,
)
with pytest.raises(expected_exception=IntegrityError):
insert_service_data_retention(
service_id=sample_service.id, notification_type=NotificationType.EMAIL, days_of_retention=5,
service_id=sample_service.id,
notification_type=NotificationType.EMAIL,
days_of_retention=5,
)
def test_update_service_data_retention(sample_service):
data_retention = insert_service_data_retention(
service_id=sample_service.id, notification_type=NotificationType.SMS, days_of_retention=3
service_id=sample_service.id,
notification_type=NotificationType.SMS,
days_of_retention=3,
)
updated_count = update_service_data_retention(
service_data_retention_id=data_retention.id,
@@ -128,7 +152,9 @@ def test_update_service_data_retention_does_not_update_row_if_data_retention_is_
sample_service,
):
data_retention = insert_service_data_retention(
service_id=sample_service.id, notification_type=NotificationType.EMAIL, days_of_retention=3,
service_id=sample_service.id,
notification_type=NotificationType.EMAIL,
days_of_retention=3,
)
updated_count = update_service_data_retention(
service_data_retention_id=data_retention.id,
@@ -139,7 +165,11 @@ def test_update_service_data_retention_does_not_update_row_if_data_retention_is_
@pytest.mark.parametrize(
"notification_type, alternate", [(NotificationType.SMS, NotificationType.EMAIL), (NotificationType.EMAIL, NotificationType.SMS),],
"notification_type, alternate",
[
(NotificationType.SMS, NotificationType.EMAIL),
(NotificationType.EMAIL, NotificationType.SMS),
],
)
def test_fetch_service_data_retention_by_notification_type(
sample_service, notification_type, alternate
@@ -158,5 +188,6 @@ def test_fetch_service_data_retention_by_notification_type_returns_none_when_no_
sample_service,
):
assert not fetch_service_data_retention_by_notification_type(
sample_service.id, NotificationType.EMAIL,
sample_service.id,
NotificationType.EMAIL,
)

View File

@@ -40,7 +40,15 @@ from app.dao.services_dao import (
get_services_by_partial_name,
)
from app.dao.users_dao import create_user_code, save_model_user
from app.enums import KeyType, OrganizationType
from app.enums import (
CodeType,
KeyType,
NotificationStatus,
NotificationType,
OrganizationType,
ServicePermissionType,
TemplateType,
)
from app.models import (
ApiKey,
InvitedUser,
@@ -51,7 +59,6 @@ from app.models import (
Permission,
Service,
ServicePermission,
ServicePermissionType,
ServiceUser,
Template,
TemplateHistory,
@@ -766,7 +773,9 @@ def test_update_service_permission_creates_a_history_record_with_current_data(
),
)
permission = [p for p in service.permissions if p.permission == "sms"][0]
permission = [
p for p in service.permissions if p.permission == ServicePermissionType.SMS
][0]
service.permissions.remove(permission)
dao_update_service(service)
@@ -824,8 +833,8 @@ def test_delete_service_and_associated_objects(notify_db_session):
service = create_service(
user=user, service_permissions=None, organization=organization
)
create_user_code(user=user, code="somecode", code_type="email")
create_user_code(user=user, code="somecode", code_type="sms")
create_user_code(user=user, code="somecode", code_type=CodeType.EMAIL)
create_user_code(user=user, code="somecode", code_type=CodeType.SMS)
template = create_template(service=service)
api_key = create_api_key(service=service)
create_notification(template=template, api_key=api_key)
@@ -953,27 +962,29 @@ def test_fetch_stats_ignores_historical_notification_data(sample_template):
def test_dao_fetch_todays_stats_for_service(notify_db_session):
service = create_service()
sms_template = create_template(service=service)
email_template = create_template(service=service, template_type="email")
email_template = create_template(service=service, template_type=TemplateType.EMAIL)
# two created email, one failed email, and one created sms
create_notification(template=email_template, status="created")
create_notification(template=email_template, status="created")
create_notification(template=email_template, status="technical-failure")
create_notification(template=sms_template, status="created")
create_notification(template=email_template, status=NotificationStatus.CREATED)
create_notification(template=email_template, status=NotificationStatus.CREATED)
create_notification(
template=email_template, status=NotificationStatus.TECHNICAL_FAILURE
)
create_notification(template=sms_template, status=NotificationStatus.CREATED)
stats = dao_fetch_todays_stats_for_service(service.id)
stats = sorted(stats, key=lambda x: (x.notification_type, x.status))
assert len(stats) == 3
assert stats[0].notification_type == "email"
assert stats[0].status == "created"
assert stats[0].notification_type == NotificationType.EMAIL
assert stats[0].status == NotificationStatus.CREATED
assert stats[0].count == 2
assert stats[1].notification_type == "email"
assert stats[1].status == "technical-failure"
assert stats[1].notification_type == NotificationType.EMAIL
assert stats[1].status == NotificationStatus.TECHNICAL_FAILURE
assert stats[1].count == 1
assert stats[2].notification_type == "sms"
assert stats[2].status == "created"
assert stats[2].notification_type == NotificationType.SMS
assert stats[2].status == NotificationStatus.CREATED
assert stats[2].count == 1
@@ -998,8 +1009,8 @@ def test_dao_fetch_todays_stats_for_service_should_ignore_test_key(notify_db_ses
stats = dao_fetch_todays_stats_for_service(service.id)
assert len(stats) == 1
assert stats[0].notification_type == "sms"
assert stats[0].status == "created"
assert stats[0].notification_type == NotificationType.SMS
assert stats[0].status == NotificationStatus.CREATED
assert stats[0].count == 3
@@ -1008,15 +1019,27 @@ def test_dao_fetch_todays_stats_for_service_only_includes_today(notify_db_sessio
# two created email, one failed email, and one created sms
with freeze_time("2001-01-02T04:59:00"):
# just_before_midnight_yesterday
create_notification(template=template, to_field="1", status="delivered")
create_notification(
template=template,
to_field="1",
status=NotificationStatus.DELIVERED,
)
with freeze_time("2001-01-02T05:01:00"):
# just_after_midnight_today
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template,
to_field="2",
status=NotificationStatus.FAILED,
)
with freeze_time("2001-01-02T12:00:00"):
# right_now
create_notification(template=template, to_field="3", status="created")
create_notification(
template=template,
to_field="3",
status=NotificationStatus.CREATED,
)
stats = dao_fetch_todays_stats_for_service(template.service_id)
@@ -1033,14 +1056,26 @@ def test_dao_fetch_todays_stats_for_service_only_includes_today_when_clocks_spri
template = create_template(service=create_service())
with freeze_time("2021-03-27T23:59:59"):
# just before midnight yesterday in UTC -- not included
create_notification(template=template, to_field="1", status="permanent-failure")
create_notification(
template=template,
to_field="1",
status=NotificationStatus.PERMANENT_FAILURE,
)
with freeze_time("2021-03-28T00:01:00"):
# just after midnight yesterday in UTC -- included
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template,
to_field="2",
status=NotificationStatus.FAILED,
)
with freeze_time("2021-03-28T12:00:00"):
# we have entered BST at this point but had not for the previous two notifications --included
# collect stats for this timestamp
create_notification(template=template, to_field="3", status="created")
create_notification(
template=template,
to_field="3",
status=NotificationStatus.CREATED,
)
stats = dao_fetch_todays_stats_for_service(template.service_id)
stats = {row.status: row.count for row in stats}
@@ -1057,14 +1092,20 @@ def test_dao_fetch_todays_stats_for_service_only_includes_today_during_bst(
template = create_template(service=create_service())
with freeze_time("2021-03-28T23:59:59"):
# just before midnight BST -- not included
create_notification(template=template, to_field="1", status="permanent-failure")
create_notification(
template=template, to_field="1", status=NotificationStatus.PERMANENT_FAILURE
)
with freeze_time("2021-03-29T04:00:01"):
# just after midnight BST -- included
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template, to_field="2", status=NotificationStatus.FAILED
)
with freeze_time("2021-03-29T12:00:00"):
# well after midnight BST -- included
# collect stats for this timestamp
create_notification(template=template, to_field="3", status="created")
create_notification(
template=template, to_field="3", status=NotificationStatus.CREATED
)
stats = dao_fetch_todays_stats_for_service(template.service_id)
stats = {row.status: row.count for row in stats}
@@ -1080,15 +1121,21 @@ def test_dao_fetch_todays_stats_for_service_only_includes_today_when_clocks_fall
template = create_template(service=create_service())
with freeze_time("2021-10-30T22:59:59"):
# just before midnight BST -- not included
create_notification(template=template, to_field="1", status="permanent-failure")
create_notification(
template=template, to_field="1", status=NotificationStatus.PERMANENT_FAILURE
)
with freeze_time("2021-10-31T23:00:01"):
# just after midnight BST -- included
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template, to_field="2", status=NotificationStatus.FAILED
)
# clocks go back to UTC on 31 October at 2am
with freeze_time("2021-10-31T12:00:00"):
# well after midnight -- included
# collect stats for this timestamp
create_notification(template=template, to_field="3", status="created")
create_notification(
template=template, to_field="3", status=NotificationStatus.CREATED
)
stats = dao_fetch_todays_stats_for_service(template.service_id)
stats = {row.status: row.count for row in stats}
@@ -1102,15 +1149,21 @@ def test_dao_fetch_todays_stats_for_service_only_includes_during_utc(notify_db_s
template = create_template(service=create_service())
with freeze_time("2021-10-30T12:59:59"):
# just before midnight UTC -- not included
create_notification(template=template, to_field="1", status="permanent-failure")
create_notification(
template=template, to_field="1", status=NotificationStatus.PERMANENT_FAILURE
)
with freeze_time("2021-10-31T05:00:01"):
# just after midnight UTC -- included
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template, to_field="2", status=NotificationStatus.FAILED
)
# clocks go back to UTC on 31 October at 2am
with freeze_time("2021-10-31T12:00:00"):
# well after midnight -- included
# collect stats for this timestamp
create_notification(template=template, to_field="3", status="created")
create_notification(
template=template, to_field="3", status=NotificationStatus.CREATED
)
stats = dao_fetch_todays_stats_for_service(template.service_id)
stats = {row.status: row.count for row in stats}
@@ -1126,10 +1179,14 @@ def test_dao_fetch_todays_stats_for_all_services_includes_all_services(
# two services, each with an email and sms notification
service1 = create_service(service_name="service 1", email_from="service.1")
service2 = create_service(service_name="service 2", email_from="service.2")
template_email_one = create_template(service=service1, template_type="email")
template_sms_one = create_template(service=service1, template_type="sms")
template_email_two = create_template(service=service2, template_type="email")
template_sms_two = create_template(service=service2, template_type="sms")
template_email_one = create_template(
service=service1, template_type=TemplateType.EMAIL
)
template_sms_one = create_template(service=service1, template_type=TemplateType.SMS)
template_email_two = create_template(
service=service2, template_type=TemplateType.EMAIL
)
template_sms_two = create_template(service=service2, template_type=TemplateType.SMS)
create_notification(template=template_email_one)
create_notification(template=template_sms_one)
create_notification(template=template_email_two)
@@ -1146,11 +1203,15 @@ def test_dao_fetch_todays_stats_for_all_services_only_includes_today(notify_db_s
template = create_template(service=create_service())
with freeze_time("2001-01-01T23:59:00"):
# just_before_midnight_yesterday
create_notification(template=template, to_field="1", status="delivered")
create_notification(
template=template, to_field="1", status=NotificationStatus.DELIVERED
)
with freeze_time("2001-01-02T05:01:00"):
# just_after_midnight_today
create_notification(template=template, to_field="2", status="failed")
create_notification(
template=template, to_field="2", status=NotificationStatus.FAILED
)
with freeze_time("2001-01-02T12:00:00"):
stats = dao_fetch_todays_stats_for_all_services()
@@ -1164,12 +1225,12 @@ def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db_sess
service1 = create_service(service_name="service 1", email_from="service.1")
service2 = create_service(service_name="service 2", email_from="service.2")
template_sms = create_template(service=service1)
template_email = create_template(service=service1, template_type="email")
template_email = create_template(service=service1, template_type=TemplateType.EMAIL)
template_two = create_template(service=service2)
# service1: 2 sms with status "created" and one "failed", and one email
create_notification(template=template_sms)
create_notification(template=template_sms)
create_notification(template=template_sms, status="failed")
create_notification(template=template_sms, status=NotificationStatus.FAILED)
create_notification(template=template_email)
# service2: 1 sms "created"
create_notification(template=template_two)
@@ -1182,8 +1243,8 @@ def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db_sess
service1.restricted,
service1.active,
service1.created_at,
"sms",
"created",
NotificationType.SMS,
NotificationStatus.CREATED,
2,
) in stats
assert (
@@ -1192,8 +1253,8 @@ def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db_sess
service1.restricted,
service1.active,
service1.created_at,
"sms",
"failed",
NotificationType.SMS,
NotificationStatus.FAILED,
1,
) in stats
assert (
@@ -1202,8 +1263,8 @@ def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db_sess
service1.restricted,
service1.active,
service1.created_at,
"email",
"created",
NotificationType.EMAIL,
NotificationStatus.CREATED,
1,
) in stats
assert (
@@ -1212,8 +1273,8 @@ def test_dao_fetch_todays_stats_for_all_services_groups_correctly(notify_db_sess
service2.restricted,
service2.active,
service2.created_at,
"sms",
"created",
NotificationType.SMS,
NotificationType.CREATED,
1,
) in stats
@@ -1388,7 +1449,9 @@ def test_dao_find_services_sending_to_tv_numbers(notify_db_session, fake_uuid):
template = create_template(service)
for _ in range(0, 5):
create_notification(
template, normalised_to=tv_number, status="permanent-failure"
template,
normalised_to=tv_number,
status=NotificationStatus.PERMANENT_FAILURE,
)
service_6 = create_service(
@@ -1398,27 +1461,35 @@ def test_dao_find_services_sending_to_tv_numbers(notify_db_session, fake_uuid):
template_6 = create_template(service_6)
for _ in range(0, 5):
create_notification(
template_6, normalised_to=tv_number, status="permanent-failure"
template_6,
normalised_to=tv_number,
status=NotificationStatus.PERMANENT_FAILURE,
)
service_2 = create_service(service_name="Service 2") # below threshold is excluded
template_2 = create_template(service_2)
create_notification(template_2, normalised_to=tv_number, status="permanent-failure")
create_notification(
template_2,
normalised_to=tv_number,
status=NotificationStatus.PERMANENT_FAILURE,
)
for _ in range(0, 5):
# test key type is excluded
create_notification(
template_2,
normalised_to=tv_number,
status="permanent-failure",
key_type="test",
status=NotificationStatus.PERMANENT_FAILURE,
key_type=KeyType.TEST,
)
for _ in range(0, 5):
# normal numbers are not counted by the query
create_notification(template_2, normalised_to=normal_number, status="delivered")
create_notification(
template_2, normalised_to=normal_number, status=NotificationStatus.DELIVERED
)
create_notification(
template_2,
normalised_to=normal_number_resembling_tv_number,
status="delivered",
status=NotificationStatus.DELIVERED,
)
start_date = datetime.utcnow() - timedelta(days=1)
@@ -1442,27 +1513,31 @@ def test_dao_find_services_with_high_failure_rates(notify_db_session, fake_uuid)
for service in services:
template = create_template(service)
for _ in range(0, 3):
create_notification(template, status="permanent-failure")
create_notification(template, status="delivered")
create_notification(template, status="sending")
create_notification(template, status="temporary-failure")
create_notification(template, status=NotificationStatus.PERMANENT_FAILURE)
create_notification(template, status=NotificationStatus.DELIVERED)
create_notification(template, status=NotificationStatus.SENDING)
create_notification(template, status=NotificationStatus.TEMPORART_FAILURE)
service_6 = create_service(service_name="Service 6")
with freeze_time("2019-11-30 15:00:00.000000"):
template_6 = create_template(service_6)
for _ in range(0, 4):
create_notification(
template_6, status="permanent-failure"
template_6,
status=NotificationStatus.PERMANENT_FAILURE,
) # notifications too old are excluded
service_2 = create_service(service_name="Service 2")
template_2 = create_template(service_2)
for _ in range(0, 4):
create_notification(
template_2, status="permanent-failure", key_type="test"
template_2,
status=NotificationStatus.PERMANENT_FAILURE,
key_type=KeyType.TEST,
) # test key type is excluded
create_notification(
template_2, status="permanent-failure"
template_2,
status=NotificationStatus.PERMANET_FAILURE,
) # below threshold is excluded
start_date = datetime.utcnow() - timedelta(days=1)

View File

@@ -150,7 +150,11 @@ def test_notification_for_csv_returns_correct_job_row_number(sample_job):
[
(TemplateType.EMAIL, "failed", "Failed"),
(TemplateType.EMAIL, "technical-failure", "Technical failure"),
(TemplateType.EMAIL, "temporary-failure", "Inbox not accepting messages right now",),
(
TemplateType.EMAIL,
"temporary-failure",
"Inbox not accepting messages right now",
),
(TemplateType.EMAIL, "permanent-failure", "Email address doesnt exist"),
(
TemplateType.SMS,

View File

@@ -1,5 +1,3 @@
from itertools import product
import pytest
from flask import json