mirror of
https://github.com/GSA/notifications-api.git
synced 2026-01-30 06:21:50 -05:00
Merge branch 'master' into do-not-write-test-data-to-the-history-table
Conflicts: app/dao/notifications_dao.py
This commit is contained in:
@@ -98,7 +98,7 @@ def test_send_sms_raises_if_firetext_rejects(mocker, mock_firetext_client):
|
||||
assert '"code": 1' in exc.value.text
|
||||
|
||||
|
||||
def test_send_sms_raises_if_firetext_rejects(mocker, mock_firetext_client):
|
||||
def test_send_sms_raises_if_firetext_rejects_with_unexpected_data(mocker, mock_firetext_client):
|
||||
to = content = reference = 'foo'
|
||||
response_dict = {"something": "gone bad"}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import uuid
|
||||
from datetime import (datetime, date, timedelta)
|
||||
|
||||
from sqlalchemy.orm.session import make_transient
|
||||
import requests_mock
|
||||
import pytest
|
||||
from flask import current_app
|
||||
@@ -18,6 +19,8 @@ from app.models import (
|
||||
Permission,
|
||||
ProviderStatistics,
|
||||
ProviderDetails,
|
||||
ProviderDetailsHistory,
|
||||
ProviderRates,
|
||||
NotificationStatistics,
|
||||
ServiceWhitelist,
|
||||
KEY_TYPE_NORMAL, KEY_TYPE_TEST, KEY_TYPE_TEAM,
|
||||
@@ -857,3 +860,33 @@ def sample_provider_rate(notify_db, notify_db_session, valid_from=None, rate=Non
|
||||
valid_from=valid_from if valid_from is not None else datetime.utcnow(),
|
||||
rate=rate if rate is not None else 1,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def restore_provider_details(notify_db, notify_db_session):
|
||||
"""
|
||||
We view ProviderDetails as a static in notify_db_session, since we don't modify it... except we do, we updated
|
||||
priority. This fixture is designed to be used in tests that will knowingly touch provider details, to restore them
|
||||
to previous state.
|
||||
|
||||
Note: This doesn't technically require notify_db_session (only notify_db), but kept as a requirement to encourage
|
||||
good usage - if you're modifying ProviderDetails' state then it's good to clear down the rest of the DB too
|
||||
"""
|
||||
existing_provider_details = ProviderDetails.query.all()
|
||||
existing_provider_details_history = ProviderDetailsHistory.query.all()
|
||||
# make transient removes the objects from the session - since we'll want to delete them later
|
||||
for epd in existing_provider_details:
|
||||
make_transient(epd)
|
||||
for epdh in existing_provider_details_history:
|
||||
make_transient(epdh)
|
||||
|
||||
yield
|
||||
|
||||
# also delete these as they depend on provider_details
|
||||
ProviderRates.query.delete()
|
||||
ProviderDetails.query.delete()
|
||||
ProviderDetailsHistory.query.delete()
|
||||
notify_db.session.commit()
|
||||
notify_db.session.add_all(existing_provider_details)
|
||||
notify_db.session.add_all(existing_provider_details_history)
|
||||
notify_db.session.commit()
|
||||
|
||||
@@ -1,22 +1,27 @@
|
||||
from app.models import ProviderDetails
|
||||
from datetime import datetime
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
from app.models import ProviderDetails, ProviderDetailsHistory
|
||||
from app import clients
|
||||
from app.dao.provider_details_dao import (
|
||||
get_provider_details,
|
||||
get_provider_details_by_notification_type
|
||||
get_provider_details_by_notification_type,
|
||||
dao_update_provider_details
|
||||
)
|
||||
|
||||
|
||||
def test_can_get_all_providers(notify_db, notify_db_session):
|
||||
def test_can_get_all_providers(restore_provider_details):
|
||||
assert len(get_provider_details()) == 4
|
||||
|
||||
|
||||
def test_can_get_sms_providers(notify_db, notify_db_session):
|
||||
assert len(get_provider_details_by_notification_type('sms')) == 3
|
||||
types = [provider.notification_type for provider in get_provider_details_by_notification_type('sms')]
|
||||
assert all('sms' == notification_type for notification_type in types)
|
||||
def test_can_get_sms_providers(restore_provider_details):
|
||||
sms_providers = get_provider_details_by_notification_type('sms')
|
||||
assert len(sms_providers) == 3
|
||||
assert all('sms' == prov.notification_type for prov in sms_providers)
|
||||
|
||||
|
||||
def test_can_get_sms_providers_in_order(notify_db, notify_db_session):
|
||||
def test_can_get_sms_providers_in_order(restore_provider_details):
|
||||
providers = get_provider_details_by_notification_type('sms')
|
||||
|
||||
assert providers[0].identifier == "mmg"
|
||||
@@ -24,35 +29,52 @@ def test_can_get_sms_providers_in_order(notify_db, notify_db_session):
|
||||
assert providers[2].identifier == "loadtesting"
|
||||
|
||||
|
||||
def test_can_get_email_providers_in_order(notify_db, notify_db_session):
|
||||
def test_can_get_email_providers_in_order(restore_provider_details):
|
||||
providers = get_provider_details_by_notification_type('email')
|
||||
|
||||
assert providers[0].identifier == "ses"
|
||||
|
||||
|
||||
def test_can_get_email_providers(notify_db, notify_db_session):
|
||||
def test_can_get_email_providers(restore_provider_details):
|
||||
assert len(get_provider_details_by_notification_type('email')) == 1
|
||||
types = [provider.notification_type for provider in get_provider_details_by_notification_type('email')]
|
||||
assert all('email' == notification_type for notification_type in types)
|
||||
|
||||
|
||||
def test_should_error_if_any_provider_in_database_not_in_code(notify_db, notify_db_session, notify_api):
|
||||
providers = ProviderDetails.query.all()
|
||||
|
||||
for provider in providers:
|
||||
if provider.notification_type == 'sms':
|
||||
assert clients.get_sms_client(provider.identifier)
|
||||
if provider.notification_type == 'email':
|
||||
assert clients.get_email_client(provider.identifier)
|
||||
|
||||
|
||||
def test_should_not_error_if_any_provider_in_code_not_in_database(notify_db, notify_db_session, notify_api):
|
||||
def test_should_not_error_if_any_provider_in_code_not_in_database(restore_provider_details):
|
||||
providers = ProviderDetails.query.all()
|
||||
|
||||
ProviderDetails.query.filter_by(identifier='mmg').delete()
|
||||
|
||||
for provider in providers:
|
||||
if provider.notification_type == 'sms':
|
||||
assert clients.get_sms_client(provider.identifier)
|
||||
if provider.notification_type == 'email':
|
||||
assert clients.get_email_client(provider.identifier)
|
||||
assert clients.get_sms_client('mmg')
|
||||
|
||||
|
||||
@freeze_time('2000-01-01T00:00:00')
|
||||
def test_update_adds_history(restore_provider_details):
|
||||
ses = ProviderDetails.query.filter(ProviderDetails.identifier == 'ses').one()
|
||||
ses_history = ProviderDetailsHistory.query.filter(ProviderDetailsHistory.id == ses.id).one()
|
||||
|
||||
assert ses.version == 1
|
||||
assert ses_history.version == 1
|
||||
assert ses.updated_at is None
|
||||
|
||||
ses.active = False
|
||||
|
||||
dao_update_provider_details(ses)
|
||||
|
||||
assert not ses.active
|
||||
assert ses.updated_at == datetime(2000, 1, 1, 0, 0, 0)
|
||||
|
||||
ses_history = ProviderDetailsHistory.query.filter(
|
||||
ProviderDetailsHistory.id == ses.id
|
||||
).order_by(
|
||||
ProviderDetailsHistory.version
|
||||
).all()
|
||||
|
||||
assert ses_history[0].active
|
||||
assert ses_history[0].version == 1
|
||||
assert ses_history[0].updated_at is None
|
||||
|
||||
assert not ses_history[1].active
|
||||
assert ses_history[1].version == 2
|
||||
assert ses_history[1].updated_at == datetime(2000, 1, 1, 0, 0, 0)
|
||||
|
||||
@@ -1,150 +1,103 @@
|
||||
import pytest
|
||||
from flask import json
|
||||
|
||||
from app.models import ProviderDetails
|
||||
|
||||
from tests import create_authorization_header
|
||||
|
||||
|
||||
def test_get_provider_details_in_type_and_identifier_order(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
assert response.status_code == 200
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
assert len(json_resp) == 4
|
||||
def test_get_provider_details_in_type_and_identifier_order(client, notify_db):
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[create_authorization_header()]
|
||||
)
|
||||
assert response.status_code == 200
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
assert len(json_resp) == 4
|
||||
|
||||
assert json_resp[0]['identifier'] == 'ses'
|
||||
assert json_resp[1]['identifier'] == 'mmg'
|
||||
assert json_resp[2]['identifier'] == 'firetext'
|
||||
assert json_resp[3]['identifier'] == 'loadtesting'
|
||||
assert json_resp[0]['identifier'] == 'ses'
|
||||
assert json_resp[1]['identifier'] == 'mmg'
|
||||
assert json_resp[2]['identifier'] == 'firetext'
|
||||
assert json_resp[3]['identifier'] == 'loadtesting'
|
||||
|
||||
|
||||
def test_get_provider_details_by_id(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
def test_get_provider_details_by_id(client, notify_db):
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[create_authorization_header()]
|
||||
)
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
|
||||
provider_resp = client.get(
|
||||
'/provider-details/{}'.format(json_resp[0]['id']),
|
||||
headers=[auth_header]
|
||||
)
|
||||
provider_resp = client.get(
|
||||
'/provider-details/{}'.format(json_resp[0]['id']),
|
||||
headers=[create_authorization_header()]
|
||||
)
|
||||
|
||||
provider = json.loads(provider_resp.get_data(as_text=True))['provider_details']
|
||||
assert provider['identifier'] == json_resp[0]['identifier']
|
||||
provider = json.loads(provider_resp.get_data(as_text=True))['provider_details']
|
||||
assert provider['identifier'] == json_resp[0]['identifier']
|
||||
|
||||
|
||||
def test_get_provider_details_contains_correct_fields(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
allowed_keys = {"id", "display_name", "identifier", "priority", 'notification_type', "active"}
|
||||
assert \
|
||||
allowed_keys == \
|
||||
set(json_resp[0].keys())
|
||||
def test_get_provider_details_contains_correct_fields(client, notify_db):
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[create_authorization_header()]
|
||||
)
|
||||
json_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
allowed_keys = {
|
||||
"id", "display_name", "identifier", "priority", 'notification_type', "active", "version", "updated_at"
|
||||
}
|
||||
assert allowed_keys == set(json_resp[0].keys())
|
||||
|
||||
|
||||
def test_should_be_able_to_update_priority(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
fetch_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
def test_should_be_able_to_update_priority(client, restore_provider_details):
|
||||
provider = ProviderDetails.query.first()
|
||||
|
||||
provider_id = fetch_resp[2]['id']
|
||||
|
||||
update_resp = client.post(
|
||||
'/provider-details/{}'.format(provider_id),
|
||||
headers=[('Content-Type', 'application/json'), auth_header],
|
||||
data=json.dumps({
|
||||
'priority': 5
|
||||
})
|
||||
)
|
||||
assert update_resp.status_code == 200
|
||||
update_json = json.loads(update_resp.get_data(as_text=True))['provider_details']
|
||||
assert update_json['identifier'] == 'firetext'
|
||||
assert update_json['priority'] == 5
|
||||
|
||||
update_resp = client.post(
|
||||
'/provider-details/{}'.format(provider_id),
|
||||
headers=[('Content-Type', 'application/json'), auth_header],
|
||||
data=json.dumps({
|
||||
'priority': 20
|
||||
})
|
||||
)
|
||||
assert update_resp.status_code == 200
|
||||
update_resp = client.post(
|
||||
'/provider-details/{}'.format(provider.id),
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()],
|
||||
data=json.dumps({
|
||||
'priority': 5
|
||||
})
|
||||
)
|
||||
assert update_resp.status_code == 200
|
||||
update_json = json.loads(update_resp.get_data(as_text=True))['provider_details']
|
||||
assert update_json['identifier'] == provider.identifier
|
||||
assert update_json['priority'] == 5
|
||||
assert provider.priority == 5
|
||||
|
||||
|
||||
def test_should_be_able_to_update_status(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
fetch_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
def test_should_be_able_to_update_status(client, restore_provider_details):
|
||||
provider = ProviderDetails.query.first()
|
||||
|
||||
firetext = next(x for x in fetch_resp if x['identifier'] == 'firetext')
|
||||
|
||||
update_resp_1 = client.post(
|
||||
'/provider-details/{}'.format(firetext['id']),
|
||||
headers=[('Content-Type', 'application/json'), auth_header],
|
||||
data=json.dumps({
|
||||
'active': False
|
||||
})
|
||||
)
|
||||
assert update_resp_1.status_code == 200
|
||||
update_resp_1 = json.loads(update_resp_1.get_data(as_text=True))['provider_details']
|
||||
assert update_resp_1['identifier'] == 'firetext'
|
||||
assert not update_resp_1['active']
|
||||
|
||||
update_resp_2 = client.post(
|
||||
'/provider-details/{}'.format(firetext['id']),
|
||||
headers=[('Content-Type', 'application/json'), auth_header],
|
||||
data=json.dumps({
|
||||
'active': True
|
||||
})
|
||||
)
|
||||
assert update_resp_2.status_code == 200
|
||||
update_resp_2 = json.loads(update_resp_2.get_data(as_text=True))['provider_details']
|
||||
assert update_resp_2['identifier'] == 'firetext'
|
||||
assert update_resp_2['active']
|
||||
update_resp_1 = client.post(
|
||||
'/provider-details/{}'.format(provider.id),
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()],
|
||||
data=json.dumps({
|
||||
'active': False
|
||||
})
|
||||
)
|
||||
assert update_resp_1.status_code == 200
|
||||
update_resp_1 = json.loads(update_resp_1.get_data(as_text=True))['provider_details']
|
||||
assert update_resp_1['identifier'] == provider.identifier
|
||||
assert not update_resp_1['active']
|
||||
assert not provider.active
|
||||
|
||||
|
||||
def test_should_not_be_able_to_update_identifier(notify_db, notify_db_session, notify_api):
|
||||
with notify_api.test_request_context():
|
||||
with notify_api.test_client() as client:
|
||||
auth_header = create_authorization_header()
|
||||
response = client.get(
|
||||
'/provider-details',
|
||||
headers=[auth_header]
|
||||
)
|
||||
fetch_resp = json.loads(response.get_data(as_text=True))['provider_details']
|
||||
@pytest.mark.parametrize('field,value', [
|
||||
('identifier', 'new'),
|
||||
('version', 7),
|
||||
('updated_at', None)
|
||||
])
|
||||
def test_should_not_be_able_to_update_disallowed_fields(client, restore_provider_details, field, value):
|
||||
provider = ProviderDetails.query.first()
|
||||
|
||||
provider_id = fetch_resp[2]['id']
|
||||
|
||||
update_resp = client.post(
|
||||
'/provider-details/{}'.format(provider_id),
|
||||
headers=[('Content-Type', 'application/json'), auth_header],
|
||||
data=json.dumps({
|
||||
'identifier': "new"
|
||||
})
|
||||
)
|
||||
assert update_resp.status_code == 400
|
||||
update_resp = json.loads(update_resp.get_data(as_text=True))
|
||||
assert update_resp['message']['identifier'][0] == 'Not permitted to be updated'
|
||||
assert update_resp['result'] == 'error'
|
||||
update_resp = client.post(
|
||||
'/provider-details/{}'.format(provider.id),
|
||||
headers=[('Content-Type', 'application/json'), create_authorization_header()],
|
||||
data=json.dumps({field: value})
|
||||
)
|
||||
assert update_resp.status_code == 400
|
||||
update_resp = json.loads(update_resp.get_data(as_text=True))
|
||||
print(update_resp)
|
||||
assert update_resp['message'][field][0] == 'Not permitted to be updated'
|
||||
assert update_resp['result'] == 'error'
|
||||
|
||||
@@ -70,7 +70,7 @@ def notify_db_session(notify_db):
|
||||
|
||||
notify_db.session.remove()
|
||||
for tbl in reversed(notify_db.metadata.sorted_tables):
|
||||
if tbl.name not in ["provider_details", "key_types", "branding_type", "job_status"]:
|
||||
if tbl.name not in ["provider_details", "key_types", "branding_type", "job_status", "provider_details_history"]:
|
||||
notify_db.engine.execute(tbl.delete())
|
||||
notify_db.session.commit()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user