Merge branch 'master' into remove-nasty-query-from-dashboard

This commit is contained in:
Martyn Inglis
2017-05-23 13:55:30 +01:00
15 changed files with 143 additions and 126 deletions

View File

@@ -24,7 +24,8 @@ from app.celery.tasks import (
persist_letter,
get_template_class,
update_job_to_sent_to_dvla,
update_letter_notifications_statuses
update_letter_notifications_statuses,
process_updates_from_file
)
from app.dao import jobs_dao, services_dao
from app.models import (
@@ -1094,10 +1095,19 @@ def test_update_letter_notifications_statuses_calls_with_correct_bucket_location
s3_mock.assert_called_with('{}-ftp'.format(current_app.config['NOTIFY_EMAIL_DOMAIN']), 'foo.txt')
def test_update_letter_notifications_statuses_builds_updates_list(notify_api, mocker):
def test_update_letter_notifications_statuses_builds_updates_from_content(notify_api, mocker):
valid_file = 'ref-foo|Sent|1|Unsorted\nref-bar|Sent|2|Sorted'
mocker.patch('app.celery.tasks.s3.get_s3_file', return_value=valid_file)
updates = update_letter_notifications_statuses(filename='foo.txt')
update_mock = mocker.patch('app.celery.tasks.process_updates_from_file')
update_letter_notifications_statuses(filename='foo.txt')
update_mock.assert_called_with('ref-foo|Sent|1|Unsorted\nref-bar|Sent|2|Sorted')
def test_update_letter_notifications_statuses_builds_updates_list(notify_api, mocker):
valid_file = 'ref-foo|Sent|1|Unsorted\nref-bar|Sent|2|Sorted'
updates = process_updates_from_file(valid_file)
assert len(updates) == 2

View File

@@ -1,7 +1,7 @@
import pytest
from app.dao.service_permissions_dao import dao_fetch_service_permissions, dao_remove_service_permission
from app.models import EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INCOMING_SMS_TYPE
from app.models import EMAIL_TYPE, SMS_TYPE, LETTER_TYPE, INTERNATIONAL_SMS_TYPE, INBOUND_SMS_TYPE
from tests.app.db import create_service_permission, create_service
@@ -34,11 +34,11 @@ def test_fetch_service_permissions_gets_service_permissions(service_without_perm
def test_remove_service_permission(service_without_permissions):
create_service_permission(service_id=service_without_permissions.id, permission=EMAIL_TYPE)
create_service_permission(service_id=service_without_permissions.id, permission=INCOMING_SMS_TYPE)
create_service_permission(service_id=service_without_permissions.id, permission=INBOUND_SMS_TYPE)
dao_remove_service_permission(service_without_permissions.id, EMAIL_TYPE)
permissions = dao_fetch_service_permissions(service_without_permissions.id)
assert len(permissions) == 1
assert permissions[0].permission == INCOMING_SMS_TYPE
assert permissions[0].permission == INBOUND_SMS_TYPE
assert permissions[0].service_id == service_without_permissions.id

View File

@@ -44,6 +44,8 @@ from app.models import (
User,
InvitedUser,
Service,
ServicePermission,
ServicePermissionTypes,
BRANDING_GOVUK,
DVLA_ORG_HM_GOVERNMENT,
KEY_TYPE_NORMAL,
@@ -52,7 +54,8 @@ from app.models import (
EMAIL_TYPE,
SMS_TYPE,
LETTER_TYPE,
INTERNATIONAL_SMS_TYPE
INTERNATIONAL_SMS_TYPE,
SERVICE_PERMISSION_TYPES
)
from tests.app.db import create_user, create_service
@@ -286,6 +289,14 @@ def test_remove_permission_from_service_by_id_returns_service_with_correct_permi
assert service.permissions[0].permission == EMAIL_TYPE
def test_remove_service_does_not_remove_service_permission_types(sample_service):
delete_service_and_all_associated_db_objects(sample_service)
services = dao_fetch_all_services()
assert len(services) == 0
assert set([p.name for p in ServicePermissionTypes.query.all()]) & set(SERVICE_PERMISSION_TYPES)
def test_create_service_by_id_adding_and_removing_letter_returns_service_without_letter(service_factory):
service = service_factory.get('testing', email_from='testing')
@@ -392,6 +403,9 @@ def test_delete_service_and_associated_objects(notify_db,
sample_invited_user,
sample_permission,
sample_provider_statistics):
# Default service permissions of Email and SMS
assert ServicePermission.query.count() == 2
delete_service_and_all_associated_db_objects(sample_service)
assert NotificationStatistics.query.count() == 0
assert TemplateStatistics.query.count() == 0
@@ -408,6 +422,7 @@ def test_delete_service_and_associated_objects(notify_db,
assert InvitedUser.query.count() == 0
assert Service.query.count() == 0
assert Service.get_history_model().query.count() == 0
assert ServicePermission.query.count() == 0
def test_add_existing_user_to_another_service_doesnot_change_old_permissions(sample_user):

View File

@@ -5,6 +5,7 @@ from unittest.mock import ANY, call
import pytest
from notifications_utils.recipients import validate_and_format_phone_number
from flask import current_app
import app
from app import mmg_client, firetext_client
@@ -73,7 +74,7 @@ def test_should_send_personalised_template_to_correct_sms_provider_and_persist(
to=validate_and_format_phone_number("+447234123123"),
content="Sample service: Hello Jo\nHere is <em>some HTML</em> & entities",
reference=str(db_notification.id),
sender=None
sender=current_app.config['FROM_NUMBER']
)
stats_mock.assert_called_once_with(db_notification)
@@ -175,7 +176,7 @@ def test_send_sms_should_use_template_version_from_notification_not_latest(
to=validate_and_format_phone_number("+447234123123"),
content="Sample service: This is a template:\nwith a newline",
reference=str(db_notification.id),
sender=None
sender=current_app.config['FROM_NUMBER']
)
persisted_notification = notifications_dao.get_notification_by_id(db_notification.id)
@@ -549,7 +550,7 @@ def test_should_send_sms_to_international_providers(
to="447234123999",
content=ANY,
reference=str(db_notification_uk.id),
sender=None
sender=current_app.config['FROM_NUMBER']
)
send_to_providers.send_sms_to_provider(
@@ -560,7 +561,7 @@ def test_should_send_sms_to_international_providers(
to="447234123111",
content=ANY,
reference=str(db_notification_international.id),
sender=None
sender=current_app.config['FROM_NUMBER']
)
notification_uk = Notification.query.filter_by(id=db_notification_uk.id).one()
@@ -619,3 +620,34 @@ def test_should_set_international_phone_number_to_sent_status(
)
assert notification.status == 'sent'
@pytest.mark.parametrize('sms_sender, expected_sender, expected_content', [
('foo', 'foo', 'bar'),
# if 40604 is actually in DB then treat that as if entered manually
('40604', '40604', 'bar'),
# 'testing' is the FROM_NUMBER during unit tests
(None, 'testing', 'Sample service: bar'),
('testing', 'testing', 'Sample service: bar'),
])
def test_should_handle_sms_sender_and_prefix_message(
sample_service,
mocker,
sms_sender,
expected_sender,
expected_content
):
mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.delivery.send_to_providers.create_initial_notification_statistic_tasks')
sample_service.sms_sender = sms_sender
template = create_template(sample_service, content='bar')
notification = create_notification(template)
send_to_providers.send_sms_to_provider(notification)
mmg_client.send_sms.assert_called_once_with(
content=expected_content,
sender=expected_sender,
to=ANY,
reference=ANY,
)

View File

@@ -531,33 +531,5 @@ def _sample_sns_s3_callback():
"MessageId": "6adbfe0a-d610-509a-9c47-af894e90d32d",
"Subject": "Amazon S3 Notification",
"TopicArn": "sample-topic-arn",
"Message": {
"Records": [{
"eventVersion": "2.0",
"eventSource": "aws:s3",
"awsRegion": "eu-west-1",
"eventTime": "2017-05-03T08:35:12.826Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {"principalId": "some-p-id"},
"requestParameters": {"sourceIPAddress": "8.8.8.8"},
"responseElements": {"x-amz-request-id": "some-req-id", "x-amz-id-2": "some-amz-id"},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "some-config-id",
"bucket": {
"name": "some-bucket",
"ownerIdentity": {"principalId": "some-p-id"},
"arn": "some-bucket-arn"
},
"object": {
"key": "bar.txt",
"size": 200,
"eTag": "some-etag",
"versionId": "some-v-id",
"sequencer": "some-seq"
}
}
}
]
}
"Message": '{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"eu-west-1","eventTime":"2017-05-16T11:38:41.073Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"some-p-id"},"requestParameters":{"sourceIPAddress":"8.8.8.8"},"responseElements":{"x-amz-request-id":"some-r-id","x-amz-id-2":"some-x-am-id"},"s3":{"s3SchemaVersion":"1.0","configurationId":"some-c-id","bucket":{"name":"some-bucket","ownerIdentity":{"principalId":"some-p-id"},"arn":"some-bucket-arn"},"object":{"key":"bar.txt","size":200,"eTag":"some-e-tag","versionId":"some-v-id","sequencer":"some-seq"}}}]}' # noqa
})

View File

@@ -5,7 +5,7 @@ import uuid
from unittest.mock import ANY
import pytest
from flask import url_for
from flask import url_for, current_app
from freezegun import freeze_time
from app.dao.users_dao import save_model_user
@@ -144,6 +144,7 @@ def test_get_service_by_id(client, sample_service):
assert json_resp['data']['organisation'] is None
assert json_resp['data']['branding'] == 'govuk'
assert json_resp['data']['dvla_organisation'] == '001'
assert json_resp['data']['sms_sender'] == current_app.config['FROM_NUMBER']
def test_get_service_by_id_should_404_if_no_service(notify_api, notify_db):
@@ -213,6 +214,7 @@ def test_create_service(client, sample_user):
assert json_resp['data']['email_from'] == 'created.service'
assert not json_resp['data']['research_mode']
assert json_resp['data']['dvla_organisation'] == '001'
assert json_resp['data']['sms_sender'] == current_app.config['FROM_NUMBER']
auth_header_fetch = create_authorization_header()

View File

@@ -106,8 +106,9 @@ def test_send_notification_to_service_users_sends_to_active_users_only(
send_notification_to_service_users(service_id=service.id, template_id=template.id)
notifications = Notification.query.all()
notifications_recipients = [notification.to for notification in notifications]
assert Notification.query.count() == 2
assert notifications[0].to == first_active_user.email_address
assert notifications[1].to == second_active_user.email_address
assert pending_user.email_address not in notifications_recipients
assert first_active_user.email_address in notifications_recipients
assert second_active_user.email_address in notifications_recipients

View File

@@ -1,6 +1,8 @@
import uuid
import pytest
from flask import json
from flask import json, current_app
from app.models import Notification
from app.v2.errors import RateLimitError
from tests import create_authorization_header
@@ -33,8 +35,7 @@ def test_post_sms_notification_returns_201(notify_api, sample_template_with_plac
assert resp_json['id'] == str(notification_id)
assert resp_json['reference'] == reference
assert resp_json['content']['body'] == sample_template_with_placeholders.content.replace("(( Name))", "Jo")
# conftest fixture service does not have a sms sender, use config default
assert resp_json['content']['from_number'] == notify_api.config["FROM_NUMBER"]
assert resp_json['content']['from_number'] == current_app.config['FROM_NUMBER']
assert 'v2/notifications/{}'.format(notification_id) in resp_json['uri']
assert resp_json['template']['id'] == str(sample_template_with_placeholders.id)
assert resp_json['template']['version'] == sample_template_with_placeholders.version