Files
notifications-admin/tests/app/test_statistics_utils.py
Chris Hill-Scott f3a0c505bd Enforce order and style of imports
Done using isort[1], with the following command:
```
isort -rc ./app ./tests
```

Adds linting to the `run_tests.sh` script to stop badly-sorted imports
getting re-introduced.

Chosen style is ‘Vertical Hanging Indent’ with trailing commas, because
I think it gives the cleanest diffs, eg:
```
from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
)
```

1. https://pypi.python.org/pypi/isort
2018-02-27 16:35:13 +00:00

152 lines
3.8 KiB
Python

import pytest
from app.statistics_utils import (
add_rate_to_job,
add_rates_to,
statistics_by_state,
sum_of_statistics,
)
@pytest.mark.parametrize('delivery_statistics', [
None,
[{}],
[{'emails_requested': 0}, {'emails_requested': 0}]
])
def test_sum_of_statistics_puts_in_defaults_of_zero(delivery_statistics):
resp = sum_of_statistics(delivery_statistics)
assert resp == {
'emails_delivered': 0,
'emails_requested': 0,
'emails_failed': 0,
'sms_requested': 0,
'sms_delivered': 0,
'sms_failed': 0
}
def test_sum_of_statistics_sums_inputs():
delivery_statistics = [
{
'emails_delivered': 1,
'emails_requested': 2,
'emails_failed': 3,
'sms_requested': 4,
'sms_delivered': 5,
'sms_failed': 6
},
{
'emails_delivered': 10,
'emails_requested': 20,
'emails_failed': 30,
'sms_requested': 40,
'sms_delivered': 50,
'sms_failed': 60
}
]
resp = sum_of_statistics(delivery_statistics)
assert resp == {
'emails_delivered': 11,
'emails_requested': 22,
'emails_failed': 33,
'sms_requested': 44,
'sms_delivered': 55,
'sms_failed': 66
}
@pytest.mark.parametrize('emails_failed,emails_requested,expected_failure_rate', [
(0, 0, '0'),
(0, 1, '0.0'),
(1, 3, '33.3')
])
def test_add_rates_sets_email_failure_rate(emails_failed, emails_requested, expected_failure_rate):
resp = add_rates_to({
'emails_failed': emails_failed,
'emails_requested': emails_requested,
'sms_failed': 0,
'sms_requested': 0
})
assert resp['emails_failure_rate'] == expected_failure_rate
@pytest.mark.parametrize('sms_failed,sms_requested,expected_failure_rate', [
(0, 0, '0'),
(0, 1, '0.0'),
(1, 3, '33.3')
])
def test_add_rates_sets_sms_failure_rate(sms_failed, sms_requested, expected_failure_rate):
resp = add_rates_to({
'emails_failed': 0,
'emails_requested': 0,
'sms_failed': sms_failed,
'sms_requested': sms_requested
})
assert resp['sms_failure_rate'] == expected_failure_rate
def test_add_rates_keeps_original_raw_data():
resp = add_rates_to({
'emails_failed': 1,
'emails_requested': 2,
'sms_failed': 3,
'sms_requested': 4
})
assert resp['emails_failed'] == 1
assert resp['emails_requested'] == 2
assert resp['sms_failed'] == 3
assert resp['sms_requested'] == 4
def test_service_statistics_by_state():
resp = statistics_by_state({
'emails_requested': 3,
'emails_failed': 1,
'emails_delivered': 1,
'sms_requested': 3,
'sms_failed': 1,
'sms_delivered': 1
})
for message_type in ['email', 'sms']:
assert resp[message_type]['processed'] == 3
assert resp[message_type]['sending'] == 1
assert resp[message_type]['delivered'] == 1
assert resp[message_type]['failed'] == 1
@pytest.mark.parametrize('failed, delivered, expected_failure_rate', [
(0, 0, 0),
(0, 1, 0),
(1, 1, 50),
(1, 0, 100),
(1, 4, 20)
])
def test_add_rate_to_job_calculates_rate(failed, delivered, expected_failure_rate):
resp = add_rate_to_job(
{
'notifications_failed': failed,
'notifications_delivered': delivered,
'id': 'foo'
}
)
assert resp['failure_rate'] == expected_failure_rate
def test_add_rate_to_job_preserves_initial_fields():
resp = add_rate_to_job(
{
'notifications_failed': 0,
'notifications_delivered': 0,
'id': 'foo'
}
)
assert set(resp.keys()) == {'notifications_failed', 'notifications_delivered', 'id', 'failure_rate'}