mirror of
https://github.com/GSA/notifications-api.git
synced 2026-08-05 14:10:47 -04:00
Merge branch 'master' into scheduled-delivery-of-jobs
Conflicts: app/dao/jobs_dao.py tests/app/dao/test_jobs_dao.py tests/app/job/test_rest.py
This commit is contained in:
@@ -6,11 +6,96 @@ from app.dao.jobs_dao import (
|
||||
dao_create_job,
|
||||
dao_update_job,
|
||||
dao_get_jobs_by_service_id,
|
||||
dao_get_scheduled_jobs
|
||||
dao_get_scheduled_jobs,
|
||||
dao_get_notification_outcomes_for_job
|
||||
)
|
||||
|
||||
from app.models import Job
|
||||
from tests.app.conftest import sample_job
|
||||
from tests.app.conftest import sample_notification, sample_job, sample_service
|
||||
|
||||
|
||||
def test_should_have_decorated_notifications_dao_functions():
|
||||
assert dao_get_notification_outcomes_for_job.__wrapped__.__name__ == 'dao_get_notification_outcomes_for_job' # noqa
|
||||
|
||||
|
||||
def test_should_get_all_statuses_for_notifications_associated_with_job(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service,
|
||||
sample_job):
|
||||
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='pending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='failed')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='technical-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='temporary-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='permanent-failure') # noqa
|
||||
|
||||
results = dao_get_notification_outcomes_for_job(sample_service.id, sample_job.id)
|
||||
assert [(row.count, row.status) for row in results] == [
|
||||
(1, 'created'),
|
||||
(1, 'sending'),
|
||||
(1, 'delivered'),
|
||||
(1, 'pending'),
|
||||
(1, 'failed'),
|
||||
(1, 'technical-failure'),
|
||||
(1, 'temporary-failure'),
|
||||
(1, 'permanent-failure')
|
||||
]
|
||||
|
||||
|
||||
def test_should_count_of_statuses_for_notifications_associated_with_job(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service,
|
||||
sample_job):
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=sample_job, status='delivered')
|
||||
|
||||
results = dao_get_notification_outcomes_for_job(sample_service.id, sample_job.id)
|
||||
assert [(row.count, row.status) for row in results] == [
|
||||
(2, 'created'),
|
||||
(4, 'sending'),
|
||||
(2, 'delivered')
|
||||
]
|
||||
|
||||
|
||||
def test_should_return_zero_length_array_if_no_notifications_for_job(sample_service, sample_job):
|
||||
assert len(dao_get_notification_outcomes_for_job(sample_job.id, sample_service.id)) == 0
|
||||
|
||||
|
||||
def test_should_return_notifications_only_for_this_job(notify_db, notify_db_session, sample_service):
|
||||
job_1 = sample_job(notify_db, notify_db_session, service=sample_service)
|
||||
job_2 = sample_job(notify_db, notify_db_session, service=sample_service)
|
||||
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=job_1, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_service, job=job_2, status='created')
|
||||
|
||||
results = dao_get_notification_outcomes_for_job(sample_service.id, job_1.id)
|
||||
assert [(row.count, row.status) for row in results] == [
|
||||
(1, 'created')
|
||||
]
|
||||
|
||||
|
||||
def test_should_return_notifications_only_for_this_service(notify_db, notify_db_session):
|
||||
service_1 = sample_service(notify_db, notify_db_session, service_name="one", email_from="one")
|
||||
service_2 = sample_service(notify_db, notify_db_session, service_name="two", email_from="two")
|
||||
|
||||
job_1 = sample_job(notify_db, notify_db_session, service=service_1)
|
||||
job_2 = sample_job(notify_db, notify_db_session, service=service_2)
|
||||
|
||||
sample_notification(notify_db, notify_db_session, service=service_1, job=job_1, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=service_2, job=job_2, status='created')
|
||||
|
||||
assert len(dao_get_notification_outcomes_for_job(service_1.id, job_2.id)) == 0
|
||||
|
||||
|
||||
def test_create_job(sample_template):
|
||||
|
||||
@@ -21,19 +21,21 @@ from app.models import (
|
||||
|
||||
from app.dao.notifications_dao import (
|
||||
dao_create_notification,
|
||||
dao_update_notification,
|
||||
get_notification_with_personalisation,
|
||||
get_notification_for_job,
|
||||
get_notifications_for_job,
|
||||
dao_get_notification_statistics_for_service,
|
||||
delete_notifications_created_more_than_a_week_ago,
|
||||
dao_get_last_template_usage,
|
||||
dao_get_notification_statistics_for_service_and_day,
|
||||
dao_get_potential_notification_statistics_for_day,
|
||||
dao_get_template_usage,
|
||||
dao_update_notification,
|
||||
delete_notifications_created_more_than_a_week_ago,
|
||||
get_notification_by_id,
|
||||
get_notification_for_job,
|
||||
get_notification_with_personalisation,
|
||||
get_notifications_for_job,
|
||||
get_notifications_for_service,
|
||||
update_notification_status_by_id,
|
||||
update_provider_stats,
|
||||
update_notification_status_by_reference,
|
||||
get_notifications_for_service, dao_get_7_day_agg_notification_statistics_for_service,
|
||||
dao_get_potential_notification_statistics_for_day, dao_get_notification_statistics_for_day,
|
||||
get_notification_by_id, dao_get_template_usage, dao_get_last_template_usage)
|
||||
update_provider_stats,
|
||||
)
|
||||
|
||||
from notifications_utils.template import get_sms_fragment_count
|
||||
|
||||
@@ -41,13 +43,9 @@ from tests.app.conftest import (sample_notification, sample_template, sample_ema
|
||||
|
||||
|
||||
def test_should_have_decorated_notifications_dao_functions():
|
||||
assert dao_get_notification_statistics_for_service.__wrapped__.__name__ == 'dao_get_notification_statistics_for_service' # noqa
|
||||
assert dao_get_last_template_usage.__wrapped__.__name__ == 'dao_get_last_template_usage' # noqa
|
||||
assert dao_get_template_usage.__wrapped__.__name__ == 'dao_get_template_usage' # noqa
|
||||
assert dao_get_notification_statistics_for_service_and_day.__wrapped__.__name__ == 'dao_get_notification_statistics_for_service_and_day' # noqa
|
||||
assert dao_get_notification_statistics_for_day.__wrapped__.__name__ == 'dao_get_notification_statistics_for_day' # noqa
|
||||
assert dao_get_potential_notification_statistics_for_day.__wrapped__.__name__ == 'dao_get_potential_notification_statistics_for_day' # noqa
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service.__wrapped__.__name__ == 'dao_get_7_day_agg_notification_statistics_for_service' # noqa
|
||||
assert dao_create_notification.__wrapped__.__name__ == 'dao_create_notification' # noqa
|
||||
assert update_notification_status_by_id.__wrapped__.__name__ == 'update_notification_status_by_id' # noqa
|
||||
assert dao_update_notification.__wrapped__.__name__ == 'dao_update_notification' # noqa
|
||||
@@ -439,67 +437,6 @@ def test_should_be_able_to_get_all_statistics_for_a_service(sample_template, mmg
|
||||
_assert_notification_stats(sample_template.service.id, sms_requested=3)
|
||||
|
||||
|
||||
def test_should_be_able_to_get_all_statistics_for_a_service_for_several_days(sample_template, mmg_provider):
|
||||
data = _notification_json(sample_template)
|
||||
|
||||
today = datetime.utcnow()
|
||||
yesterday = datetime.utcnow() - timedelta(days=1)
|
||||
two_days_ago = datetime.utcnow() - timedelta(days=2)
|
||||
data.update({'created_at': today})
|
||||
notification_1 = Notification(**data)
|
||||
data.update({'created_at': yesterday})
|
||||
notification_2 = Notification(**data)
|
||||
data.update({'created_at': two_days_ago})
|
||||
notification_3 = Notification(**data)
|
||||
|
||||
dao_create_notification(notification_1, sample_template.template_type)
|
||||
dao_create_notification(notification_2, sample_template.template_type)
|
||||
dao_create_notification(notification_3, sample_template.template_type)
|
||||
|
||||
stats = dao_get_notification_statistics_for_service(sample_template.service.id)
|
||||
assert len(stats) == 3
|
||||
assert stats[0].emails_requested == 0
|
||||
assert stats[0].sms_requested == 1
|
||||
assert stats[0].day == today.date()
|
||||
assert stats[1].emails_requested == 0
|
||||
assert stats[1].sms_requested == 1
|
||||
assert stats[1].day == yesterday.date()
|
||||
assert stats[2].emails_requested == 0
|
||||
assert stats[2].sms_requested == 1
|
||||
assert stats[2].day == two_days_ago.date()
|
||||
|
||||
|
||||
def test_should_be_empty_list_if_no_statistics_for_a_service(sample_service):
|
||||
assert len(dao_get_notification_statistics_for_service(sample_service.id)) == 0
|
||||
|
||||
|
||||
def test_should_be_able_to_get_all_statistics_for_a_service_for_several_days_previous(sample_template,
|
||||
mmg_provider):
|
||||
data = _notification_json(sample_template)
|
||||
|
||||
today = datetime.utcnow()
|
||||
seven_days_ago = datetime.utcnow() - timedelta(days=7)
|
||||
eight_days_ago = datetime.utcnow() - timedelta(days=8)
|
||||
data.update({'created_at': today})
|
||||
notification_1 = Notification(**data)
|
||||
data.update({'created_at': seven_days_ago})
|
||||
notification_2 = Notification(**data)
|
||||
data.update({'created_at': eight_days_ago})
|
||||
notification_3 = Notification(**data)
|
||||
dao_create_notification(notification_1, sample_template.template_type)
|
||||
dao_create_notification(notification_2, sample_template.template_type)
|
||||
dao_create_notification(notification_3, sample_template.template_type)
|
||||
|
||||
stats = dao_get_notification_statistics_for_service(sample_template.service.id, 7)
|
||||
assert len(stats) == 2
|
||||
assert stats[0].emails_requested == 0
|
||||
assert stats[0].sms_requested == 1
|
||||
assert stats[0].day == today.date()
|
||||
assert stats[1].emails_requested == 0
|
||||
assert stats[1].sms_requested == 1
|
||||
assert stats[1].day == seven_days_ago.date()
|
||||
|
||||
|
||||
def test_create_notification_creates_notification_with_personalisation(notify_db, notify_db_session,
|
||||
sample_template_with_placeholders,
|
||||
sample_job, mmg_provider):
|
||||
@@ -522,7 +459,7 @@ def test_create_notification_creates_notification_with_personalisation(notify_db
|
||||
assert data.template == notification_from_db.template
|
||||
assert data.template_version == notification_from_db.template_version
|
||||
assert data.created_at == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
assert {'name': 'Jo'} == notification_from_db.personalisation
|
||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||
|
||||
@@ -558,7 +495,7 @@ def test_save_notification_creates_sms_and_template_stats(sample_template, sampl
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert data['created_at'] == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||
|
||||
stats = NotificationStatistics.query.filter(NotificationStatistics.service_id == sample_template.service.id).first()
|
||||
@@ -591,7 +528,7 @@ def test_save_notification_and_create_email_and_template_stats(sample_email_temp
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert data['created_at'] == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
_assert_job_stats(sample_job.id, sent=1, count=1, delivered=0, failed=0)
|
||||
|
||||
stats = NotificationStatistics.query.filter(
|
||||
@@ -728,7 +665,7 @@ def test_save_notification_and_increment_job(sample_template, sample_job, mmg_pr
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert data['created_at'] == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
assert Job.query.get(sample_job.id).notifications_sent == 1
|
||||
|
||||
notification_2 = Notification(**data)
|
||||
@@ -779,7 +716,7 @@ def test_save_notification_and_increment_correct_job(notify_db, notify_db_sessio
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert data['created_at'] == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
assert job_1.id != job_2.id
|
||||
_assert_job_stats(job_id=job_1.id, sent=1, count=1)
|
||||
_assert_job_stats(job_id=job_2.id, sent=0, count=1)
|
||||
@@ -800,7 +737,7 @@ def test_save_notification_with_no_job(sample_template, mmg_provider):
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert data['created_at'] == notification_from_db.created_at
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
|
||||
|
||||
def test_get_notification(sample_notification):
|
||||
@@ -826,7 +763,7 @@ def test_save_notification_no_job_id(sample_template, mmg_provider):
|
||||
assert data['service'] == notification_from_db.service
|
||||
assert data['template'] == notification_from_db.template
|
||||
assert data['template_version'] == notification_from_db.template_version
|
||||
assert 'created' == notification_from_db.status
|
||||
assert notification_from_db.status == 'created'
|
||||
assert data.get('job_id') is None
|
||||
|
||||
|
||||
|
||||
@@ -1,122 +0,0 @@
|
||||
from datetime import (date, timedelta)
|
||||
|
||||
from app.models import NotificationStatistics
|
||||
from tests.app.conftest import sample_notification_statistics as create_sample_notification_statistics
|
||||
from app.dao.notifications_dao import dao_get_7_day_agg_notification_statistics_for_service
|
||||
|
||||
|
||||
def test_display_weekly_notification_statistics_sum_over_week(notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
fools = date(2016, 4, 1)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools + timedelta(days=1)
|
||||
)
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service(
|
||||
sample_service.id,
|
||||
fools
|
||||
).all() == [(0, 4, 2, 2, 4, 2, 2)]
|
||||
|
||||
|
||||
def test_display_weekly_notification_statistics_separate_over_weeks(notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
fools = date(2016, 4, 1)
|
||||
next_week = fools + timedelta(days=7)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=next_week
|
||||
)
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service(
|
||||
sample_service.id,
|
||||
fools
|
||||
).all() == [(1, 2, 1, 1, 2, 1, 1), (0, 2, 1, 1, 2, 1, 1)]
|
||||
|
||||
|
||||
def test_display_weekly_notification_statistics_7_days_from_date_from(notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
fools = date(2016, 4, 1)
|
||||
eow_fools = fools + timedelta(days=6)
|
||||
next_week = fools + timedelta(days=7)
|
||||
two_weeks_later = fools + timedelta(days=14)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=eow_fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=next_week
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=two_weeks_later
|
||||
)
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service(
|
||||
sample_service.id,
|
||||
fools
|
||||
).all() == [(2, 2, 1, 1, 2, 1, 1), (1, 2, 1, 1, 2, 1, 1), (0, 4, 2, 2, 4, 2, 2)]
|
||||
|
||||
|
||||
def test_display_weekly_notification_statistics_week_number_misses_week(notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
fools = date(2016, 4, 1)
|
||||
two_weeks_later = fools + timedelta(days=14)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=two_weeks_later
|
||||
)
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service(
|
||||
sample_service.id,
|
||||
fools
|
||||
).all() == [(2, 2, 1, 1, 2, 1, 1), (0, 2, 1, 1, 2, 1, 1)]
|
||||
|
||||
|
||||
def test_display_weekly_notification_statistics_week_limit(notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
fools = date(2016, 4, 1)
|
||||
two_weeks_later = fools + timedelta(days=14)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=fools
|
||||
)
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=two_weeks_later
|
||||
)
|
||||
assert dao_get_7_day_agg_notification_statistics_for_service(
|
||||
sample_service.id,
|
||||
fools,
|
||||
1
|
||||
).all() == [(0, 2, 1, 1, 2, 1, 1)]
|
||||
@@ -10,7 +10,7 @@ import app.celery.tasks
|
||||
from tests import create_authorization_header
|
||||
from tests.app.conftest import (
|
||||
sample_job as create_job,
|
||||
sample_notification as create_sample_notification)
|
||||
sample_notification as create_sample_notification, sample_notification)
|
||||
from app.dao.templates_dao import dao_update_template
|
||||
from app.models import NOTIFICATION_STATUS_TYPES
|
||||
|
||||
@@ -446,3 +446,83 @@ def test_get_all_notifications_for_job_filtered_by_status(
|
||||
resp = json.loads(response.get_data(as_text=True))
|
||||
assert len(resp['notifications']) == expected_notification_count
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
def test_get_job_by_id(notify_api, sample_job):
|
||||
job_id = str(sample_job.id)
|
||||
service_id = sample_job.service.id
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/job/{}'.format(service_id, job_id)
|
||||
auth_header = create_authorization_header(service_id=sample_job.service.id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 200
|
||||
resp_json = json.loads(response.get_data(as_text=True))
|
||||
assert resp_json['data']['id'] == job_id
|
||||
assert resp_json['data']['statistics'] == []
|
||||
assert resp_json['data']['created_by']['name'] == 'Test User'
|
||||
|
||||
|
||||
def test_get_job_by_id_should_return_statistics(notify_db, notify_db_session, notify_api, sample_job):
|
||||
job_id = str(sample_job.id)
|
||||
service_id = sample_job.service.id
|
||||
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='delivered')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='pending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='technical-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='permanent-failure') # noqa
|
||||
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/job/{}'.format(service_id, job_id)
|
||||
auth_header = create_authorization_header(service_id=sample_job.service.id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 200
|
||||
resp_json = json.loads(response.get_data(as_text=True))
|
||||
print(resp_json)
|
||||
assert resp_json['data']['id'] == job_id
|
||||
assert {'status': 'created', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'sending', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'delivered', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'pending', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'failed', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'technical-failure', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'temporary-failure', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'permanent-failure', 'count': 1} in resp_json['data']['statistics']
|
||||
assert resp_json['data']['created_by']['name'] == 'Test User'
|
||||
|
||||
|
||||
def test_get_job_by_id_should_return_summed_statistics(notify_db, notify_db_session, notify_api, sample_job):
|
||||
job_id = str(sample_job.id)
|
||||
service_id = sample_job.service.id
|
||||
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='created')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='sending')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='failed')
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='technical-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa
|
||||
sample_notification(notify_db, notify_db_session, service=sample_job.service, job=sample_job, status='temporary-failure') # noqa
|
||||
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/job/{}'.format(service_id, job_id)
|
||||
auth_header = create_authorization_header(service_id=sample_job.service.id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 200
|
||||
resp_json = json.loads(response.get_data(as_text=True))
|
||||
print(resp_json)
|
||||
assert resp_json['data']['id'] == job_id
|
||||
assert {'status': 'created', 'count': 3} in resp_json['data']['statistics']
|
||||
assert {'status': 'sending', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'failed', 'count': 3} in resp_json['data']['statistics']
|
||||
assert {'status': 'technical-failure', 'count': 1} in resp_json['data']['statistics']
|
||||
assert {'status': 'temporary-failure', 'count': 2} in resp_json['data']['statistics']
|
||||
assert resp_json['data']['created_by']['name'] == 'Test User'
|
||||
|
||||
@@ -4,9 +4,9 @@ from flask import json
|
||||
|
||||
import app.celery.tasks
|
||||
from app.dao.notifications_dao import (
|
||||
get_notification_by_id,
|
||||
dao_get_notification_statistics_for_service
|
||||
get_notification_by_id
|
||||
)
|
||||
from app.models import NotificationStatistics
|
||||
from tests.app.conftest import sample_notification as create_sample_notification
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ def test_firetext_callback_should_update_notification_status(notify_api, sample_
|
||||
updated = get_notification_by_id(sample_notification.id)
|
||||
assert updated.status == 'delivered'
|
||||
assert get_notification_by_id(sample_notification.id).status == 'delivered'
|
||||
stats = dao_get_notification_statistics_for_service(sample_notification.service_id)[0]
|
||||
stats = get_notification_stats(sample_notification.service_id)
|
||||
assert stats.sms_delivered == 1
|
||||
assert stats.sms_requested == 1
|
||||
assert stats.sms_failed == 0
|
||||
@@ -189,7 +189,7 @@ def test_firetext_callback_should_update_notification_status_failed(notify_api,
|
||||
sample_notification.id
|
||||
)
|
||||
assert get_notification_by_id(sample_notification.id).status == 'permanent-failure'
|
||||
stats = dao_get_notification_statistics_for_service(sample_notification.service_id)[0]
|
||||
stats = get_notification_stats(sample_notification.service_id)
|
||||
assert stats.sms_delivered == 0
|
||||
assert stats.sms_requested == 1
|
||||
assert stats.sms_failed == 1
|
||||
@@ -217,7 +217,7 @@ def test_firetext_callback_should_update_notification_status_pending(notify_api,
|
||||
notification.id
|
||||
)
|
||||
assert get_notification_by_id(notification.id).status == 'pending'
|
||||
stats = dao_get_notification_statistics_for_service(notification.service_id)[0]
|
||||
stats = get_notification_stats(notification.service_id)
|
||||
assert stats.sms_delivered == 0
|
||||
assert stats.sms_requested == 1
|
||||
assert stats.sms_failed == 0
|
||||
@@ -257,7 +257,7 @@ def test_firetext_callback_should_update_multiple_notification_status_sent(
|
||||
),
|
||||
headers=[('Content-Type', 'application/x-www-form-urlencoded')])
|
||||
|
||||
stats = dao_get_notification_statistics_for_service(notification1.service_id)[0]
|
||||
stats = get_notification_stats(notification1.service_id)
|
||||
assert stats.sms_delivered == 3
|
||||
assert stats.sms_requested == 3
|
||||
assert stats.sms_failed == 0
|
||||
@@ -481,7 +481,7 @@ def test_ses_callback_should_update_notification_status(
|
||||
assert json_resp['result'] == 'success'
|
||||
assert json_resp['message'] == 'SES callback succeeded'
|
||||
assert get_notification_by_id(notification.id).status == 'delivered'
|
||||
stats = dao_get_notification_statistics_for_service(notification.service_id)[0]
|
||||
stats = get_notification_stats(notification.service_id)
|
||||
assert stats.emails_delivered == 1
|
||||
assert stats.emails_requested == 1
|
||||
assert stats.emails_failed == 0
|
||||
@@ -536,7 +536,7 @@ def test_ses_callback_should_update_multiple_notification_status_sent(
|
||||
assert resp2.status_code == 200
|
||||
assert resp3.status_code == 200
|
||||
|
||||
stats = dao_get_notification_statistics_for_service(notification1.service_id)[0]
|
||||
stats = get_notification_stats(notification1.service_id)
|
||||
assert stats.emails_delivered == 3
|
||||
assert stats.emails_requested == 3
|
||||
assert stats.emails_failed == 0
|
||||
@@ -568,7 +568,7 @@ def test_ses_callback_should_set_status_to_temporary_failure(notify_api,
|
||||
assert json_resp['result'] == 'success'
|
||||
assert json_resp['message'] == 'SES callback succeeded'
|
||||
assert get_notification_by_id(notification.id).status == 'temporary-failure'
|
||||
stats = dao_get_notification_statistics_for_service(notification.service_id)[0]
|
||||
stats = get_notification_stats(notification.service_id)
|
||||
assert stats.emails_delivered == 0
|
||||
assert stats.emails_requested == 1
|
||||
assert stats.emails_failed == 1
|
||||
@@ -628,7 +628,7 @@ def test_ses_callback_should_set_status_to_permanent_failure(notify_api,
|
||||
assert json_resp['result'] == 'success'
|
||||
assert json_resp['message'] == 'SES callback succeeded'
|
||||
assert get_notification_by_id(notification.id).status == 'permanent-failure'
|
||||
stats = dao_get_notification_statistics_for_service(notification.service_id)[0]
|
||||
stats = get_notification_stats(notification.service_id)
|
||||
assert stats.emails_delivered == 0
|
||||
assert stats.emails_requested == 1
|
||||
assert stats.emails_failed == 1
|
||||
@@ -730,3 +730,7 @@ def ses_hard_bounce_callback():
|
||||
|
||||
def ses_soft_bounce_callback():
|
||||
return b'{\n "Type" : "Notification",\n "MessageId" : "ref",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Bounce\\",\\"bounce\\":{\\"bounceType\\":\\"Undetermined\\",\\"bounceSubType\\":\\"General\\"}, \\"mail\\":{\\"messageId\\":\\"ref\\",\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.uk\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa
|
||||
|
||||
|
||||
def get_notification_stats(service_id):
|
||||
return NotificationStatistics.query.filter_by(service_id=service_id).one()
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
import json
|
||||
from datetime import (
|
||||
date,
|
||||
timedelta
|
||||
)
|
||||
|
||||
from flask import url_for
|
||||
from tests import create_authorization_header
|
||||
from tests.app.conftest import sample_notification_statistics as create_sample_notification_statistics
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
|
||||
def test_get_notification_statistics_returns_empty_list_if_no_stats(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_template,
|
||||
sample_email_template):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
|
||||
path = '/service/{}/notifications-statistics'.format(sample_email_template.service.id)
|
||||
|
||||
auth_header = create_authorization_header(
|
||||
service_id=sample_email_template.service_id)
|
||||
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 200
|
||||
|
||||
stats = json.loads(response.get_data(as_text=True))
|
||||
assert stats['data'] == []
|
||||
|
||||
|
||||
def test_get_week_aggregate_statistics(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
sample_notification_statistics = create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=date(date.today().year, 4, 1))
|
||||
with notify_api.test_client() as client:
|
||||
endpoint = url_for(
|
||||
'notifications-statistics.get_notification_statistics_for_service_seven_day_aggregate',
|
||||
service_id=sample_service.id)
|
||||
auth_header = create_authorization_header(
|
||||
service_id=sample_service.id)
|
||||
|
||||
resp = client.get(endpoint, headers=[auth_header])
|
||||
assert resp.status_code == 200
|
||||
json_resp = json.loads(resp.get_data(as_text=True))
|
||||
week_len_index = len(json_resp['data']) - 1
|
||||
assert json_resp['data'][week_len_index]['emails_requested'] == 2
|
||||
assert json_resp['data'][week_len_index]['sms_requested'] == 2
|
||||
assert json_resp['data'][week_len_index]['week_start'] == date(date.today().year, 4, 1).strftime('%Y-%m-%d')
|
||||
assert json_resp['data'][week_len_index]['week_end'] == date(date.today().year, 4, 7).strftime('%Y-%m-%d')
|
||||
|
||||
|
||||
def test_get_week_aggregate_statistics_date_from(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
sample_notification_statistics = create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=date(date.today().year, 4, 1))
|
||||
date_from_str = date(date.today().year, 4, 1).strftime('%Y-%m-%d')
|
||||
with notify_api.test_client() as client:
|
||||
endpoint = url_for(
|
||||
'notifications-statistics.get_notification_statistics_for_service_seven_day_aggregate',
|
||||
service_id=sample_service.id,
|
||||
date_from=date_from_str)
|
||||
auth_header = create_authorization_header(
|
||||
service_id=sample_service.id)
|
||||
|
||||
resp = client.get(endpoint, headers=[auth_header])
|
||||
assert resp.status_code == 200
|
||||
json_resp = json.loads(resp.get_data(as_text=True))
|
||||
week_len_index = len(json_resp['data']) - 1
|
||||
assert json_resp['data'][week_len_index]['emails_requested'] == 2
|
||||
assert json_resp['data'][week_len_index]['sms_requested'] == 2
|
||||
assert json_resp['data'][week_len_index]['week_start'] == date_from_str
|
||||
assert json_resp['data'][week_len_index]['week_end'] == date(date.today().year, 4, 7).strftime('%Y-%m-%d')
|
||||
|
||||
|
||||
def test_get_week_aggregate_statistics_date_in_future(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
endpoint = url_for(
|
||||
'notifications-statistics.get_notification_statistics_for_service_seven_day_aggregate',
|
||||
service_id=sample_service.id,
|
||||
date_from=(date.today() + timedelta(days=1)).strftime('%Y-%m-%d'))
|
||||
auth_header = create_authorization_header(
|
||||
service_id=sample_service.id)
|
||||
|
||||
resp = client.get(endpoint, headers=[auth_header])
|
||||
assert resp.status_code == 400
|
||||
json_resp = json.loads(resp.get_data(as_text=True))
|
||||
assert json_resp['result'] == 'error'
|
||||
assert json_resp['message']['date_from'][0] == 'Date cannot be in the future'
|
||||
|
||||
|
||||
def test_get_week_aggregate_statistics_invalid_week_count(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
endpoint = url_for(
|
||||
'notifications-statistics.get_notification_statistics_for_service_seven_day_aggregate',
|
||||
service_id=sample_service.id,
|
||||
week_count=-1)
|
||||
auth_header = create_authorization_header(
|
||||
service_id=sample_service.id)
|
||||
|
||||
resp = client.get(endpoint, headers=[auth_header])
|
||||
assert resp.status_code == 400
|
||||
json_resp = json.loads(resp.get_data(as_text=True))
|
||||
assert json_resp['result'] == 'error'
|
||||
assert json_resp['message']['week_count'][0] == 'Not a positive integer'
|
||||
|
||||
|
||||
@freeze_time('2016-01-01')
|
||||
def test_get_notification_statistics_for_specific_day(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_template):
|
||||
the_day = date.today()
|
||||
|
||||
sample_notification_statistics = create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=the_day)
|
||||
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/notifications-statistics/day/{}'.format(sample_template.service_id, the_day)
|
||||
auth_header = create_authorization_header(service_id=sample_template.service_id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 200
|
||||
stats = json.loads(response.get_data(as_text=True))
|
||||
|
||||
assert stats['data']['id'] == str(sample_notification_statistics.id)
|
||||
assert stats['data']['day'] == the_day.strftime('%Y-%m-%d')
|
||||
|
||||
another_day = the_day - timedelta(days=1)
|
||||
path = '/service/{}/notifications-statistics/day/{}'.format(sample_template.service_id, another_day)
|
||||
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@freeze_time('2016-01-01')
|
||||
def test_get_notification_statistics_for_specific_day_returns_404_if_no_stats(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_template):
|
||||
the_day = date.today()
|
||||
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/notifications-statistics/day/{}'.format(sample_template.service_id, the_day)
|
||||
auth_header = create_authorization_header(service_id=sample_template.service_id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@freeze_time('2016-01-01')
|
||||
def test_get_notification_statistics_for_specific_day_returns_400_for_incorrect_date(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_template):
|
||||
the_day = date.today()
|
||||
incorrect_date_format = the_day.strftime('%d-%m-%Y')
|
||||
|
||||
create_sample_notification_statistics(
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
day=the_day)
|
||||
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
path = '/service/{}/notifications-statistics/day/{}'.format(
|
||||
sample_template.service_id,
|
||||
incorrect_date_format)
|
||||
auth_header = create_authorization_header(service_id=sample_template.service_id)
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 400
|
||||
resp_json = json.loads(response.get_data(as_text=True))
|
||||
assert resp_json['result'] == 'error'
|
||||
assert resp_json['message'] == 'Invalid date 01-01-2016'
|
||||
|
||||
another_dodgy_date = 'fish'
|
||||
path = '/service/{}/notifications-statistics/day/{}'.format(
|
||||
sample_template.service_id,
|
||||
another_dodgy_date)
|
||||
|
||||
response = client.get(path, headers=[auth_header])
|
||||
assert response.status_code == 400
|
||||
resp_json = json.loads(response.get_data(as_text=True))
|
||||
assert resp_json['result'] == 'error'
|
||||
assert resp_json['message'] == 'Invalid date fish'
|
||||
@@ -206,7 +206,7 @@ def test_normal_api_key_returns_notifications_created_from_jobs_and_from_api(
|
||||
|
||||
notifications = json.loads(response.get_data(as_text=True))['notifications']
|
||||
assert len(notifications) == 2
|
||||
assert set(x['id'] for x in notifications) == set([str(sample_notification.id), str(api_notification.id)])
|
||||
assert set(x['id'] for x in notifications) == {str(sample_notification.id), str(api_notification.id)}
|
||||
|
||||
|
||||
@pytest.mark.parametrize('key_type', [KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST])
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from datetime import datetime
|
||||
import json
|
||||
import uuid
|
||||
|
||||
@@ -263,7 +264,7 @@ def test_should_not_create_service_with_missing_if_user_id_is_not_in_database(no
|
||||
json_resp = json.loads(resp.get_data(as_text=True))
|
||||
assert resp.status_code == 404
|
||||
assert json_resp['result'] == 'error'
|
||||
assert 'No result found' == json_resp['message']
|
||||
assert json_resp['message'] == 'No result found'
|
||||
|
||||
|
||||
def test_should_not_create_service_if_missing_data(notify_api, sample_user):
|
||||
@@ -288,8 +289,6 @@ def test_should_not_create_service_if_missing_data(notify_api, sample_user):
|
||||
|
||||
|
||||
def test_should_not_create_service_with_duplicate_name(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_user,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
@@ -314,8 +313,6 @@ def test_should_not_create_service_with_duplicate_name(notify_api,
|
||||
|
||||
|
||||
def test_create_service_should_throw_duplicate_key_constraint_for_existing_email_from(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
service_factory,
|
||||
sample_user):
|
||||
first_service = service_factory.get('First service', email_from='first.service')
|
||||
@@ -432,7 +429,7 @@ def test_update_service_research_mode_throws_validation_error(notify_api, sample
|
||||
headers=[('Content-Type', 'application/json'), auth_header]
|
||||
)
|
||||
result = json.loads(resp.get_data(as_text=True))
|
||||
result['message']['research_mode'][0] == "Not a valid boolean."
|
||||
assert result['message']['research_mode'][0] == "Not a valid boolean."
|
||||
assert resp.status_code == 400
|
||||
|
||||
|
||||
@@ -505,7 +502,7 @@ def test_should_not_update_service_with_duplicate_email_from(notify_api,
|
||||
)
|
||||
|
||||
|
||||
def test_update_service_should_404_if_id_is_invalid(notify_api, notify_db, notify_db_session):
|
||||
def test_update_service_should_404_if_id_is_invalid(notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
data = {
|
||||
@@ -524,7 +521,7 @@ def test_update_service_should_404_if_id_is_invalid(notify_api, notify_db, notif
|
||||
assert resp.status_code == 404
|
||||
|
||||
|
||||
def test_get_users_by_service(notify_api, notify_db, notify_db_session, sample_service):
|
||||
def test_get_users_by_service(notify_api, sample_service):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
user_on_service = sample_service.users[0]
|
||||
@@ -544,8 +541,6 @@ def test_get_users_by_service(notify_api, notify_db, notify_db_session, sample_s
|
||||
|
||||
|
||||
def test_get_users_for_service_returns_empty_list_if_no_users_associated_with_service(notify_api,
|
||||
notify_db,
|
||||
notify_db_session,
|
||||
sample_service):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
@@ -1110,8 +1105,7 @@ def test_set_sms_sender_for_service_rejects_invalid_characters(notify_api, sampl
|
||||
'delivered': 0,
|
||||
'failed': 0
|
||||
})
|
||||
], ids=['seven_days', 'today']
|
||||
)
|
||||
], ids=['seven_days', 'today'])
|
||||
def test_get_detailed_service(notify_db, notify_db_session, notify_api, sample_service, today_only, stats):
|
||||
with notify_api.test_request_context(), notify_api.test_client() as client:
|
||||
with freeze_time('2000-01-01T12:00:00'):
|
||||
@@ -1156,3 +1150,94 @@ def test_get_weekly_notification_stats(notify_api, notify_db, notify_db_session)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def test_get_services_with_detailed_flag(notify_api, notify_db, notify_db_session):
|
||||
notifications = [
|
||||
create_sample_notification(notify_db, notify_db_session),
|
||||
create_sample_notification(notify_db, notify_db_session)
|
||||
]
|
||||
with notify_api.test_request_context(), notify_api.test_client() as client:
|
||||
resp = client.get(
|
||||
'/service?detailed=True',
|
||||
headers=[create_authorization_header()]
|
||||
)
|
||||
|
||||
assert resp.status_code == 200
|
||||
data = json.loads(resp.get_data(as_text=True))['data']
|
||||
assert len(data) == 1
|
||||
assert data[0]['name'] == 'Sample service'
|
||||
assert data[0]['id'] == str(notifications[0].service_id)
|
||||
assert data[0]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 0, 'failed': 0, 'requested': 2}
|
||||
}
|
||||
|
||||
|
||||
def test_get_detailed_services_groups_by_service(notify_db, notify_db_session):
|
||||
from app.service.rest import get_detailed_services
|
||||
|
||||
service_1 = create_sample_service(notify_db, notify_db_session, service_name="1", email_from='1')
|
||||
service_2 = create_sample_service(notify_db, notify_db_session, service_name="2", email_from='2')
|
||||
|
||||
create_sample_notification(notify_db, notify_db_session, service=service_1, status='created')
|
||||
create_sample_notification(notify_db, notify_db_session, service=service_2, status='created')
|
||||
create_sample_notification(notify_db, notify_db_session, service=service_1, status='delivered')
|
||||
create_sample_notification(notify_db, notify_db_session, service=service_1, status='created')
|
||||
|
||||
data = get_detailed_services()
|
||||
data = sorted(data, key=lambda x: x['name'])
|
||||
|
||||
assert len(data) == 2
|
||||
assert data[0]['id'] == str(service_1.id)
|
||||
assert data[0]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 1, 'failed': 0, 'requested': 3}
|
||||
}
|
||||
assert data[1]['id'] == str(service_2.id)
|
||||
assert data[1]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 0, 'failed': 0, 'requested': 1}
|
||||
}
|
||||
|
||||
|
||||
def test_get_detailed_services_includes_services_with_no_notifications(notify_db, notify_db_session):
|
||||
from app.service.rest import get_detailed_services
|
||||
|
||||
service_1 = create_sample_service(notify_db, notify_db_session, service_name="1", email_from='1')
|
||||
service_2 = create_sample_service(notify_db, notify_db_session, service_name="2", email_from='2')
|
||||
|
||||
create_sample_notification(notify_db, notify_db_session, service=service_1)
|
||||
|
||||
data = get_detailed_services()
|
||||
data = sorted(data, key=lambda x: x['name'])
|
||||
|
||||
assert len(data) == 2
|
||||
assert data[0]['id'] == str(service_1.id)
|
||||
assert data[0]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 0, 'failed': 0, 'requested': 1}
|
||||
}
|
||||
assert data[1]['id'] == str(service_2.id)
|
||||
assert data[1]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 0, 'failed': 0, 'requested': 0}
|
||||
}
|
||||
|
||||
|
||||
def test_get_detailed_services_only_includes_todays_notifications(notify_db, notify_db_session):
|
||||
from app.service.rest import get_detailed_services
|
||||
|
||||
create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 9, 23, 59))
|
||||
create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 10, 0, 0))
|
||||
create_sample_notification(notify_db, notify_db_session, created_at=datetime(2015, 10, 10, 12, 0))
|
||||
|
||||
with freeze_time('2015-10-10T12:00:00'):
|
||||
data = get_detailed_services()
|
||||
data = sorted(data, key=lambda x: x['id'])
|
||||
|
||||
assert len(data) == 1
|
||||
assert data[0]['statistics'] == {
|
||||
'email': {'delivered': 0, 'failed': 0, 'requested': 0},
|
||||
'sms': {'delivered': 0, 'failed': 0, 'requested': 2}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ from freezegun import freeze_time
|
||||
from app.service.statistics import (
|
||||
format_statistics,
|
||||
_weeks_for_range,
|
||||
_create_zeroed_stats_dicts,
|
||||
create_zeroed_stats_dicts,
|
||||
format_weekly_notification_stats
|
||||
)
|
||||
|
||||
@@ -63,7 +63,7 @@ def test_weeks_for_range(start, end, dates):
|
||||
|
||||
|
||||
def test_create_zeroed_stats_dicts():
|
||||
assert _create_zeroed_stats_dicts() == {
|
||||
assert create_zeroed_stats_dicts() == {
|
||||
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
|
||||
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user