Files
notifications-admin/tests/app/notify_client/test_notify_admin_api_client.py
Katie Smith 9dc13f1d8e Add new report to show monthly notification stats for each service
This report will be used by the engagement team. There is a form to give
a start and end date for the report, and the form is then downloaded
as a CSV file when the form is submitted.
2019-07-23 11:32:28 +01:00

120 lines
4.0 KiB
Python

import uuid
from datetime import date
from unittest.mock import patch
import pytest
import werkzeug
from app.models.service import Service
from app.notify_client import NotifyAdminAPIClient
from app.notify_client.notification_api_client import notification_api_client
from tests import service_json
from tests.conftest import api_user_active, platform_admin_user, set_config
@pytest.mark.parametrize('method', [
'put',
'post',
'delete'
])
@pytest.mark.parametrize('user', [
api_user_active(str(uuid.uuid4())),
platform_admin_user(str(uuid.uuid4()))
], ids=['api_user', 'platform_admin'])
@pytest.mark.parametrize('service', [
service_json(active=True),
None
], ids=['active_service', 'no_service'])
def test_active_service_can_be_modified(app_, method, user, service):
api_client = NotifyAdminAPIClient()
with app_.test_request_context() as request_context, app_.test_client() as client:
client.login(user)
request_context.service = Service(service)
with patch.object(api_client, 'request') as request:
ret = getattr(api_client, method)('url', 'data')
assert request.called
assert ret == request.return_value
@pytest.mark.parametrize('method', [
'put',
'post',
'delete'
])
def test_inactive_service_cannot_be_modified_by_normal_user(app_, api_user_active, method):
api_client = NotifyAdminAPIClient()
with app_.test_request_context() as request_context, app_.test_client() as client:
client.login(api_user_active)
request_context.service = Service(service_json(active=False))
with patch.object(api_client, 'request') as request:
with pytest.raises(werkzeug.exceptions.Forbidden):
getattr(api_client, method)('url', 'data')
assert not request.called
@pytest.mark.parametrize('method', [
'put',
'post',
'delete'
])
def test_inactive_service_can_be_modified_by_platform_admin(app_, platform_admin_user, method):
api_client = NotifyAdminAPIClient()
with app_.test_request_context() as request_context, app_.test_client() as client:
client.login(platform_admin_user)
request_context.service = Service(service_json(active=False))
with patch.object(api_client, 'request') as request:
ret = getattr(api_client, method)('url', 'data')
assert request.called
assert ret == request.return_value
def test_generate_headers_sets_standard_headers(app_):
api_client = NotifyAdminAPIClient()
with set_config(app_, 'ROUTE_SECRET_KEY_1', 'proxy-secret'):
api_client.init_app(app_)
# with patch('app.notify_client.has_request_context', return_value=False):
headers = api_client.generate_headers('api_token')
assert set(headers.keys()) == {'Authorization', 'Content-type', 'User-agent', 'X-Custom-Forwarder'}
assert headers['Authorization'] == 'Bearer api_token'
assert headers['Content-type'] == 'application/json'
assert headers['User-agent'].startswith('NOTIFY-API-PYTHON-CLIENT')
assert headers['X-Custom-Forwarder'] == 'proxy-secret'
def test_generate_headers_sets_request_id_if_in_request_context(app_):
api_client = NotifyAdminAPIClient()
api_client.init_app(app_)
with app_.test_request_context() as request_context:
headers = api_client.generate_headers('api_token')
assert set(headers.keys()) == {
'Authorization', 'Content-type', 'User-agent', 'X-Custom-Forwarder', 'X-B3-TraceId', 'X-B3-SpanId',
}
assert headers['X-B3-TraceId'] == request_context.request.request_id
assert headers['X-B3-SpanId'] == request_context.request.span_id
def test_get_notification_status_by_service(mocker):
mock_get = mocker.patch.object(notification_api_client, 'get')
start_date = date(2019, 4, 1)
end_date = date(2019, 4, 30)
notification_api_client.get_notification_status_by_service(start_date, end_date)
mock_get.assert_called_once_with(
url='service/monthly-data-by-service',
params={'start_date': '2019-04-01', 'end_date': '2019-04-30'}
)