mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-22 16:31:15 -05:00
Added in a new endpoint and DAO function to provide the data for the new platform admin statistics page. The DAO method gets different data from the Notifications / NotificationHistory table and also groups it differently. The old endpoint has not been deleted yet to allow the numbers on the old and new pages to be compared.
132 lines
4.6 KiB
Python
132 lines
4.6 KiB
Python
import collections
|
|
|
|
import pytest
|
|
|
|
from app.service.statistics import (
|
|
format_admin_stats,
|
|
format_statistics,
|
|
create_stats_dict,
|
|
create_zeroed_stats_dicts,
|
|
)
|
|
|
|
StatsRow = collections.namedtuple('row', ('notification_type', 'status', 'count'))
|
|
NewStatsRow = collections.namedtuple('row', ('notification_type', 'status', 'key_type', 'count'))
|
|
|
|
|
|
# email_counts and sms_counts are 3-tuple of requested, delivered, failed
|
|
@pytest.mark.idparametrize('stats, email_counts, sms_counts, letter_counts', {
|
|
'empty': ([], [0, 0, 0], [0, 0, 0], [0, 0, 0]),
|
|
'always_increment_requested': ([
|
|
StatsRow('email', 'delivered', 1),
|
|
StatsRow('email', 'failed', 1)
|
|
], [2, 1, 1], [0, 0, 0], [0, 0, 0]),
|
|
'dont_mix_template_types': ([
|
|
StatsRow('email', 'delivered', 1),
|
|
StatsRow('sms', 'delivered', 1),
|
|
StatsRow('letter', 'delivered', 1)
|
|
], [1, 1, 0], [1, 1, 0], [1, 1, 0]),
|
|
'convert_fail_statuses_to_failed': ([
|
|
StatsRow('email', 'failed', 1),
|
|
StatsRow('email', 'technical-failure', 1),
|
|
StatsRow('email', 'temporary-failure', 1),
|
|
StatsRow('email', 'permanent-failure', 1),
|
|
], [4, 0, 4], [0, 0, 0], [0, 0, 0]),
|
|
'convert_sent_to_delivered': ([
|
|
StatsRow('sms', 'sending', 1),
|
|
StatsRow('sms', 'delivered', 1),
|
|
StatsRow('sms', 'sent', 1),
|
|
], [0, 0, 0], [3, 2, 0], [0, 0, 0]),
|
|
})
|
|
def test_format_statistics(stats, email_counts, sms_counts, letter_counts):
|
|
|
|
ret = format_statistics(stats)
|
|
|
|
assert ret['email'] == {
|
|
status: count
|
|
for status, count
|
|
in zip(['requested', 'delivered', 'failed'], email_counts)
|
|
}
|
|
|
|
assert ret['sms'] == {
|
|
status: count
|
|
for status, count
|
|
in zip(['requested', 'delivered', 'failed'], sms_counts)
|
|
}
|
|
|
|
assert ret['letter'] == {
|
|
status: count
|
|
for status, count
|
|
in zip(['requested', 'delivered', 'failed'], letter_counts)
|
|
}
|
|
|
|
|
|
def test_create_zeroed_stats_dicts():
|
|
assert create_zeroed_stats_dicts() == {
|
|
'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
|
|
'email': {'requested': 0, 'delivered': 0, 'failed': 0},
|
|
'letter': {'requested': 0, 'delivered': 0, 'failed': 0},
|
|
}
|
|
|
|
|
|
def test_create_stats_dict():
|
|
assert create_stats_dict() == {
|
|
'sms': {'total': 0,
|
|
'test-key': 0,
|
|
'failures': {'technical-failure': 0,
|
|
'permanent-failure': 0,
|
|
'temporary-failure': 0,
|
|
'virus-scan-failed': 0}},
|
|
'email': {'total': 0,
|
|
'test-key': 0,
|
|
'failures': {'technical-failure': 0,
|
|
'permanent-failure': 0,
|
|
'temporary-failure': 0,
|
|
'virus-scan-failed': 0}},
|
|
'letter': {'total': 0,
|
|
'test-key': 0,
|
|
'failures': {'technical-failure': 0,
|
|
'permanent-failure': 0,
|
|
'temporary-failure': 0,
|
|
'virus-scan-failed': 0}}
|
|
}
|
|
|
|
|
|
def test_format_admin_stats_only_includes_test_key_notifications_in_test_key_section():
|
|
rows = [
|
|
NewStatsRow('email', 'technical-failure', 'test', 3),
|
|
NewStatsRow('sms', 'permanent-failure', 'test', 4),
|
|
NewStatsRow('letter', 'virus-scan-failed', 'test', 5),
|
|
]
|
|
stats_dict = format_admin_stats(rows)
|
|
|
|
assert stats_dict['email']['total'] == 0
|
|
assert stats_dict['email']['failures']['technical-failure'] == 0
|
|
assert stats_dict['email']['test-key'] == 3
|
|
|
|
assert stats_dict['sms']['total'] == 0
|
|
assert stats_dict['sms']['failures']['permanent-failure'] == 0
|
|
assert stats_dict['sms']['test-key'] == 4
|
|
|
|
assert stats_dict['letter']['total'] == 0
|
|
assert stats_dict['letter']['failures']['virus-scan-failed'] == 0
|
|
assert stats_dict['letter']['test-key'] == 5
|
|
|
|
|
|
def test_format_admin_stats_counts_non_test_key_notifications_correctly():
|
|
rows = [
|
|
NewStatsRow('email', 'technical-failure', 'normal', 1),
|
|
NewStatsRow('email', 'created', 'team', 3),
|
|
NewStatsRow('sms', 'temporary-failure', 'normal', 6),
|
|
NewStatsRow('sms', 'sent', 'normal', 2),
|
|
NewStatsRow('letter', 'pending-virus-check', 'normal', 1),
|
|
]
|
|
stats_dict = format_admin_stats(rows)
|
|
|
|
assert stats_dict['email']['total'] == 4
|
|
assert stats_dict['email']['failures']['technical-failure'] == 1
|
|
|
|
assert stats_dict['sms']['total'] == 8
|
|
assert stats_dict['sms']['failures']['permanent-failure'] == 0
|
|
|
|
assert stats_dict['letter']['total'] == 1
|