diff --git a/app/__init__.py b/app/__init__.py index dd94cce51..54c069bc8 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -5,7 +5,7 @@ import uuid from flask import Flask, _request_ctx_stack from flask import request, g, jsonify -from flask.ext.sqlalchemy import SQLAlchemy +from flask_sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow from monotonic import monotonic from notifications_utils.clients.statsd.statsd_client import StatsdClient diff --git a/app/commands.py b/app/commands.py index 9918b054f..b1d1f3a81 100644 --- a/app/commands.py +++ b/app/commands.py @@ -1,7 +1,7 @@ import uuid from datetime import datetime from decimal import Decimal -from flask.ext.script import Command, Manager, Option +from flask_script import Command, Manager, Option from app import db from app.dao.monthly_billing_dao import ( diff --git a/app/encryption.py b/app/encryption.py index 2b4755803..34577c0d6 100644 --- a/app/encryption.py +++ b/app/encryption.py @@ -1,4 +1,4 @@ -from flask.ext.bcrypt import generate_password_hash, check_password_hash +from flask_bcrypt import generate_password_hash, check_password_hash from itsdangerous import URLSafeSerializer diff --git a/application.py b/application.py index 5ff7dd1e4..0cb5377d8 100644 --- a/application.py +++ b/application.py @@ -2,8 +2,8 @@ from __future__ import print_function import os -from flask.ext.script import Manager, Server -from flask.ext.migrate import Migrate, MigrateCommand +from flask_script import Manager, Server +from flask_migrate import Migrate, MigrateCommand from app import (create_app, db, commands) application = create_app() diff --git a/db.py b/db.py index bc558cbd2..7be1aa052 100644 --- a/db.py +++ b/db.py @@ -1,4 +1,4 @@ -from flask.ext.script import Manager, Server +from flask_script import Manager, Server from flask_migrate import Migrate, MigrateCommand from app import create_app, db diff --git a/requirements.txt b/requirements.txt index 131d9c523..49bff4d46 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,25 +1,24 @@ apispec==0.25.0 -Flask==0.10.1 -Flask-Script==2.0.5 -Flask-Migrate==2.1.0 -Flask-SQLAlchemy==2.0 -psycopg2==2.7.3 -SQLAlchemy==1.0.15 -SQLAlchemy-Utils==0.32.14 -PyJWT==1.5.2 -marshmallow==2.4.2 -marshmallow-sqlalchemy==0.13.1 -flask-marshmallow==0.6.2 -Flask-Bcrypt==0.6.2 -boto3==1.4.4 -monotonic==1.3 -statsd==3.2.1 -jsonschema==2.6.0 -gunicorn==19.7.1 -docopt==0.6.2 -six==1.10.0 -iso8601==0.1.12 +boto3==1.4.6 celery==3.1.25 # pyup: <4 +docopt==0.6.2 +Flask-Bcrypt==0.6.2 +Flask-Migrate==2.1.0 +Flask-Script==2.0.5 +Flask-SQLAlchemy==2.2 +Flask==0.12.2 +gunicorn==19.7.1 +iso8601==0.1.12 +jsonschema==2.6.0 +marshmallow-sqlalchemy==0.13.1 +marshmallow==2.13.6 +monotonic==1.3 +psycopg2==2.7.3 +PyJWT==1.5.2 +six==1.10.0 +SQLAlchemy-Utils==0.32.14 +SQLAlchemy==1.1.13 +statsd==3.2.1 notifications-python-client==4.3.1 diff --git a/server_commands.py b/server_commands.py index af071db47..9f0ce8a60 100644 --- a/server_commands.py +++ b/server_commands.py @@ -1,4 +1,4 @@ -from flask.ext.script import Manager, Server +from flask_script import Manager, Server from flask_migrate import Migrate, MigrateCommand from app import (create_app, db, commands) import os diff --git a/tests/app/celery/test_tasks.py b/tests/app/celery/test_tasks.py index c6b09e333..102da6298 100644 --- a/tests/app/celery/test_tasks.py +++ b/tests/app/celery/test_tasks.py @@ -1186,7 +1186,7 @@ def test_send_inbound_sms_to_service_retries_if_request_returns_500(notify_api, mocked.assert_called_with( exc='Unable to send_inbound_sms_to_service for service_id: {} ' - 'and url: {}. \n500 Server Error: None'.format(sample_service.id, inbound_api.url), + 'and url: {url}. \n500 Server Error: None for url: {url}'.format(sample_service.id, url=inbound_api.url), queue="retry-tasks") diff --git a/tests/app/notifications/test_receive_notification.py b/tests/app/notifications/test_receive_notification.py index 36392689f..3d2bb5e05 100644 --- a/tests/app/notifications/test_receive_notification.py +++ b/tests/app/notifications/test_receive_notification.py @@ -41,56 +41,65 @@ def test_receive_notification_returns_received_to_mmg(client, mocker, sample_ser [str(inbound_sms_id), str(sample_service_full_permissions.id)], queue="notify-internal-tasks") -@pytest.mark.parametrize('provider,headers,data,expected_response', [ - ( - 'mmg', - [('Content-Type', 'application/json')], - json.dumps({ - "ID": "1234", - "MSISDN": "447700900855", - "Message": "Some message to notify", - "Trigger": "Trigger?", - "Number": "testing", - "Channel": "SMS", - "DateRecieved": "2012-06-27 12:33:00" - }), - 'RECEIVED' - ), - ( - 'firetext', - None, - { - "Message": "Some message to notify", - "source": "Source", - "time": "2012-06-27 12:33:00", - "destination": "447700900855" - }, - '{\n "status": "ok"\n}' - ), -]) @pytest.mark.parametrize('permissions', [ - ([SMS_TYPE]), - ([INBOUND_SMS_TYPE]), + [SMS_TYPE], + [INBOUND_SMS_TYPE], ]) -def test_receive_notification_without_permissions_does_not_create_inbound( - client, mocker, notify_db, notify_db_session, permissions, provider, headers, data, expected_response): - service = sample_service(notify_db, notify_db_session, permissions=permissions) - mocker.patch("app.notifications.receive_notifications.dao_fetch_services_by_sms_sender", - return_value=[service]) - mocked_send_inbound_sms = mocker.patch( - "app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async") - mocked_has_permissions = mocker.patch( - "app.notifications.receive_notifications.has_inbound_sms_permissions", return_value=False) - - response = client.post(path='/notifications/sms/receive/{}'.format(provider), - data=data, - headers=headers) +def test_receive_notification_from_mmg_without_permissions_does_not_persist( + client, + mocker, + notify_db_session, + permissions +): + mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async") + service = create_service(sms_sender='07111111111', service_permissions=permissions) + data = { + "ID": "1234", + "MSISDN": "07111111111", + "Message": "Some message to notify", + "Trigger": "Trigger?", + "Number": "testing", + "Channel": "SMS", + "DateRecieved": "2012-06-27 12:33:00" + } + response = client.post( + path='/notifications/sms/receive/mmg', + data=json.dumps(data), + headers=[('Content-Type', 'application/json')] + ) assert response.status_code == 200 - assert response.get_data(as_text=True) == expected_response - assert len(InboundSms.query.all()) == 0 - assert mocked_has_permissions.called - mocked_send_inbound_sms.assert_not_called() + assert response.get_data(as_text=True) == 'RECEIVED' + assert InboundSms.query.count() == 0 + assert mocked.called is False + + +@pytest.mark.parametrize('permissions', [ + [SMS_TYPE], + [INBOUND_SMS_TYPE], +]) +def test_receive_notification_from_firetext_without_permissions_does_not_persist( + client, + mocker, + notify_db_session, + permissions +): + service = create_service(sms_sender='07111111111', service_permissions=permissions) + mocked = mocker.patch("app.notifications.receive_notifications.tasks.send_inbound_sms_to_service.apply_async") + + data = "source=07999999999&destination=07111111111&message=this is a message&time=2017-01-01 12:00:00" + response = client.post( + path='/notifications/sms/receive/firetext', + data=data, + headers=[('Content-Type', 'application/x-www-form-urlencoded')] + ) + + assert response.status_code == 200 + result = json.loads(response.get_data(as_text=True)) + + assert result['status'] == 'ok' + assert InboundSms.query.count() == 0 + assert mocked.called is False @pytest.mark.parametrize('permissions,expected_response', [ diff --git a/tests/conftest.py b/tests/conftest.py index 31de496db..191fa5e56 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,8 +5,8 @@ import boto3 import pytest from alembic.command import upgrade from alembic.config import Config -from flask.ext.migrate import Migrate, MigrateCommand -from flask.ext.script import Manager +from flask_migrate import Migrate, MigrateCommand +from flask_script import Manager from app import create_app, db @@ -18,16 +18,16 @@ def notify_api(): # deattach server-error error handlers - error_handler_spec looks like: # {'blueprint_name': { # status_code: [error_handlers], - # None: [ tuples of (exception, )] + # None: { ExceptionClass: error_handler } # }} for error_handlers in app.error_handler_spec.values(): error_handlers.pop(500, None) if None in error_handlers: - error_handlers[None] = [ - exception_handler - for exception_handler in error_handlers[None] - if exception_handler[0] != Exception - ] + error_handlers[None] = { + exc_class: error_handler + for exc_class, error_handler in error_handlers[None].items() + if exc_class != Exception + } if error_handlers[None] == []: error_handlers.pop(None)