import boto3 import moto from tests import create_authorization_header from flask import url_for, json from app import notify_alpha_client from app.models import Service def test_get_notifications( notify_api, notify_db, notify_db_session, sample_api_key, mocker): """ Tests GET endpoint '/' to retrieve entire service list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: mocker.patch( 'app.notify_alpha_client.fetch_notification_by_id', return_value={ 'notifications': [ { 'id': 'my_id', 'notification': 'some notify' } ] } ) auth_header = create_authorization_header( service_id=sample_api_key.service_id, path=url_for('notifications.get_notifications', notification_id=123), method='GET') response = client.get( url_for('notifications.get_notifications', notification_id=123), headers=[auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert len(json_resp['notifications']) == 1 assert json_resp['notifications'][0]['id'] == 'my_id' assert json_resp['notifications'][0]['notification'] == 'some notify' notify_alpha_client.fetch_notification_by_id.assert_called_with("123") def test_get_notifications_empty_result( notify_api, notify_db, notify_db_session, sample_api_key, mocker): """ Tests GET endpoint '/' to retrieve entire service list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: mocker.patch( 'app.notify_alpha_client.fetch_notification_by_id', return_value={ 'notifications': [ ] } ) auth_header = create_authorization_header( service_id=sample_api_key.service_id, path=url_for('notifications.get_notifications', notification_id=123), method='GET') response = client.get( url_for('notifications.get_notifications', notification_id=123), headers=[auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert len(json_resp['notifications']) == 0 notify_alpha_client.fetch_notification_by_id.assert_called_with("123") def test_create_sms_should_reject_if_no_phone_numbers( notify_api, notify_db, notify_db_session, sample_api_key, mocker): """ Tests GET endpoint '/' to retrieve entire service list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: mocker.patch( 'app.notify_alpha_client.send_sms', return_value='success' ) data = { 'notification': { 'template': "my message" } } auth_header = create_authorization_header( service_id=sample_api_key.service_id, request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_resp['result'] == 'error' assert 'Required data missing' in json_resp['message']['to'][0] assert not notify_alpha_client.send_sms.called def test_should_reject_bad_phone_numbers( notify_api, notify_db, notify_db_session, mocker): """ Tests GET endpoint '/' to retrieve entire service list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: mocker.patch( 'app.notify_alpha_client.send_sms', return_value='success' ) data = { 'notification': { 'to': 'invalid', 'template': "my message" } } auth_header = create_authorization_header( request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_resp['result'] == 'error' assert 'invalid phone number, must be of format +441234123123' in json_resp['message']['to'] assert not notify_alpha_client.send_sms.called def test_should_reject_missing_content( notify_api, notify_db, notify_db_session, mocker): """ Tests GET endpoint '/' to retrieve entire service list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: mocker.patch( 'app.notify_alpha_client.send_sms', return_value='success' ) data = { 'notification': { 'to': '+441234123123' } } auth_header = create_authorization_header( request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert json_resp['result'] == 'error' assert 'Required content' in json_resp['message']['content'] assert not notify_alpha_client.send_sms.called @moto.mock_sqs def test_send_template_content(notify_api, notify_db, notify_db_session, mocker): """ Test POST endpoint '/sms' with service notification. """ with notify_api.test_request_context(): with notify_api.test_client() as client: set_up_mock_queue() mobile = '+447719087678' msg = 'Message content' mocker.patch( 'app.notify_alpha_client.send_sms', return_value={ "notification": { "createdAt": "2015-11-03T09:37:27.414363Z", "id": 100, "jobId": 65, "message": msg, "method": "sms", "status": "created", "to": mobile } } ) data = { 'notification': { 'to': mobile, 'template': msg } } auth_header = create_authorization_header( request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_resp['notification']['id'] == 100 notify_alpha_client.send_sms.assert_called_with( mobile_number=mobile, message=msg) def test_send_notification_restrict_mobile(notify_api, notify_db, notify_db_session, sample_api_key, sample_template, sample_user, mocker): """ Test POST endpoint '/sms' with service notification with mobile number not in restricted list. """ with notify_api.test_request_context(): with notify_api.test_client() as client: Service.query.filter_by( id=sample_template.service.id).update({'restricted': True}) invalid_mob = '+449999999999' mocker.patch( 'app.notify_alpha_client.send_sms', return_value={} ) data = { 'notification': { 'to': invalid_mob, 'template': sample_template.id } } assert invalid_mob != sample_user.mobile_number auth_header = create_authorization_header( service_id=sample_template.service.id, request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 400 assert 'Invalid phone number for restricted service' in json_resp['message']['restricted'] assert not notify_alpha_client.send_sms.called @moto.mock_sqs def test_should_allow_valid_message(notify_api, notify_db, notify_db_session, mocker): """ Tests POST endpoint '/sms' with notifications-admin notification. """ with notify_api.test_request_context(): with notify_api.test_client() as client: set_up_mock_queue() mocker.patch( 'app.notify_alpha_client.send_sms', return_value={ "notification": { "createdAt": "2015-11-03T09:37:27.414363Z", "id": 100, "jobId": 65, "message": "valid", "method": "sms", "status": "created", "to": "+449999999999" } } ) data = { 'notification': { 'to': '+441234123123', 'template': 'valid' } } auth_header = create_authorization_header( request_body=json.dumps(data), path=url_for('notifications.create_sms_notification'), method='POST') response = client.post( url_for('notifications.create_sms_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_resp['notification']['id'] == 100 notify_alpha_client.send_sms.assert_called_with(mobile_number='+441234123123', message="valid") def test_send_email_valid_data(notify_api, notify_db, notify_db_session, sample_service, sample_admin_service_id, mocker): with notify_api.test_request_context(): with notify_api.test_client() as client: to_address = "to@notify.com" from_address = "from@notify.com" subject = "This is the subject" message = "This is the message" mocker.patch( 'app.notify_alpha_client.send_email', return_value={ "notification": { "createdAt": "2015-11-03T09:37:27.414363Z", "id": 100, "jobId": 65, "subject": subject, "message": message, "method": "email", "status": "created", "to": to_address, "from": from_address } } ) data = { 'notification': { 'to': to_address, 'from': from_address, 'subject': subject, 'message': message } } auth_header = create_authorization_header( request_body=json.dumps(data), path=url_for('notifications.create_email_notification'), method='POST') response = client.post( url_for('notifications.create_email_notification'), data=json.dumps(data), headers=[('Content-Type', 'application/json'), auth_header]) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_resp['notification']['id'] == 100 notify_alpha_client.send_email.assert_called_with( to_address, message, from_address, subject) def set_up_mock_queue(): # set up mock queue boto3.setup_default_session(region_name='eu-west-1') conn = boto3.resource('sqs')