Fixed up the get_notitication endpoint

- returns a notification
This commit is contained in:
Martyn Inglis
2016-02-16 11:22:44 +00:00
parent 223cb8c2dd
commit 655beddba6
8 changed files with 58 additions and 41 deletions

View File

@@ -30,9 +30,9 @@ def create_app(config_name, config_overrides=None):
application.config['NOTIFY_API_ENVIRONMENT'] = config_name application.config['NOTIFY_API_ENVIRONMENT'] = config_name
application.config.from_object(configs[config_name]) application.config.from_object(configs[config_name])
init_app(application, config_overrides)
db.init_app(application) db.init_app(application)
ma.init_app(application) ma.init_app(application)
init_app(application, config_overrides)
logging.init_app(application) logging.init_app(application)
twilio_client.init_app(application) twilio_client.init_app(application)
celery.init_app(application) celery.init_app(application)

View File

@@ -22,8 +22,6 @@ class TwilioClient(SmsClient):
config.config.get('TWILIO_ACCOUNT_SID'), config.config.get('TWILIO_ACCOUNT_SID'),
config.config.get('TWILIO_AUTH_TOKEN')) config.config.get('TWILIO_AUTH_TOKEN'))
self.from_number = config.config.get('TWILIO_NUMBER') self.from_number = config.config.get('TWILIO_NUMBER')
print(config.config)
def send_sms(self, notification, content): def send_sms(self, notification, content):
try: try:

View File

@@ -14,9 +14,13 @@ def save_notification(notification, update_dict={}):
db.session.commit() db.session.commit()
def get_notification(service_id, job_id, notification_id): def get_notification_for_job(service_id, job_id, notification_id):
return Notification.query.filter_by(service_id=service_id, job_id=job_id, id=notification_id).one() return Notification.query.filter_by(service_id=service_id, job_id=job_id, id=notification_id).one()
def get_notifications(service_id, job_id): def get_notifications_for_job(service_id, job_id):
return Notification.query.filter_by(service_id=service_id, job_id=job_id).all() return Notification.query.filter_by(service_id=service_id, job_id=job_id).all()
def get_notification(service_id, notification_id):
return Notification.query.filter_by(service_id=service_id, id=notification_id).one()

View File

@@ -17,11 +17,7 @@ from app.dao.jobs_dao import (
get_jobs_by_service get_jobs_by_service
) )
from app.dao.notifications_dao import ( from app.dao import notifications_dao
save_notification,
get_notification,
get_notifications
)
from app.schemas import ( from app.schemas import (
job_schema, job_schema,
@@ -89,7 +85,7 @@ def create_notification_for_job(service_id, job_id):
if errors: if errors:
return jsonify(result="error", message=errors), 400 return jsonify(result="error", message=errors), 400
try: try:
save_notification(notification) notifications_dao.save_notification(notification)
except Exception as e: except Exception as e:
return jsonify(result="error", message=str(e)), 500 return jsonify(result="error", message=str(e)), 500
return jsonify(data=notification_status_schema.dump(notification).data), 201 return jsonify(data=notification_status_schema.dump(notification).data), 201
@@ -100,7 +96,7 @@ def create_notification_for_job(service_id, job_id):
def get_notification_for_job(service_id, job_id, notification_id=None): def get_notification_for_job(service_id, job_id, notification_id=None):
if notification_id: if notification_id:
try: try:
notification = get_notification(service_id, job_id, notification_id) notification = notifications_dao.get_notification_for_job(service_id, job_id, notification_id)
data, errors = notification_status_schema.dump(notification) data, errors = notification_status_schema.dump(notification)
return jsonify(data=data) return jsonify(data=data)
except DataError: except DataError:
@@ -108,7 +104,7 @@ def get_notification_for_job(service_id, job_id, notification_id=None):
except NoResultFound: except NoResultFound:
return jsonify(result="error", message="Notification not found"), 404 return jsonify(result="error", message="Notification not found"), 404
else: else:
notifications = get_notifications(service_id, job_id) notifications = notifications_dao.get_notifications_for_job(service_id, job_id)
data, errors = notifications_status_schema.dump(notifications) data, errors = notifications_status_schema.dump(notifications)
return jsonify(data=data) return jsonify(data=data)
@@ -116,13 +112,13 @@ def get_notification_for_job(service_id, job_id, notification_id=None):
@job.route('/<job_id>/notification/<notification_id>', methods=['PUT']) @job.route('/<job_id>/notification/<notification_id>', methods=['PUT'])
def update_notification_for_job(service_id, job_id, notification_id): def update_notification_for_job(service_id, job_id, notification_id):
notification = get_notification(service_id, job_id, notification_id) notification = notifications_dao.get_notification_for_job(service_id, job_id, notification_id)
update_dict, errors = notification_status_schema_load_json.load(request.get_json()) update_dict, errors = notification_status_schema_load_json.load(request.get_json())
if errors: if errors:
return jsonify(result="error", message=errors), 400 return jsonify(result="error", message=errors), 400
try: try:
save_notification(notification, update_dict=update_dict) notifications_dao.save_notification(notification, update_dict=update_dict)
except Exception as e: except Exception as e:
return jsonify(result="error", message=str(e)), 400 return jsonify(result="error", message=str(e)), 400

View File

@@ -4,16 +4,20 @@ from flask import (
Blueprint, Blueprint,
jsonify, jsonify,
request, request,
current_app) current_app
from itsdangerous import URLSafeSerializer )
from itsdangerous import URLSafeSerializer
from app import api_user from app import api_user
from app.aws_sqs import add_notification_to_queue from app.aws_sqs import add_notification_to_queue
from app.dao import (templates_dao) from app.dao import (templates_dao, notifications_dao)
from app.schemas import ( from app.schemas import (
email_notification_schema, sms_template_notification_schema) email_notification_schema,
sms_template_notification_schema,
notification_status_schema
)
from app.celery.tasks import send_sms from app.celery.tasks import send_sms
from sqlalchemy.orm.exc import NoResultFound
notifications = Blueprint('notifications', __name__) notifications = Blueprint('notifications', __name__)
@@ -22,10 +26,13 @@ def create_notification_id():
return str(uuid.uuid4()) return str(uuid.uuid4())
@notifications.route('/<notification_id>', methods=['GET']) @notifications.route('/<string:notification_id>', methods=['GET'])
def get_notifications(notification_id): def get_notifications(notification_id):
# TODO return notification id details try:
return jsonify({'id': notification_id}), 200 notification = notifications_dao.get_notification(api_user['client'], notification_id)
return jsonify({'notification': notification_status_schema.dump(notification).data}), 200
except NoResultFound:
return jsonify(result="error", message="not found"), 404
@notifications.route('/sms', methods=['POST']) @notifications.route('/sms', methods=['POST'])

View File

@@ -141,7 +141,7 @@ class EmailNotificationSchema(NotificationSchema):
class NotificationStatusSchema(BaseSchema): class NotificationStatusSchema(BaseSchema):
class Meta: class Meta:
model = models.Notification model = models.Noti~fication
user_schema = UserSchema() user_schema = UserSchema()

View File

@@ -3,7 +3,8 @@ from app.models import Notification
from app.dao.notifications_dao import ( from app.dao.notifications_dao import (
save_notification, save_notification,
get_notification, get_notification,
get_notifications get_notification_for_job,
get_notifications_for_job
) )
@@ -31,6 +32,13 @@ def test_save_notification(notify_db, notify_db_session, sample_template, sample
assert 'sent' == notification_from_db.status assert 'sent' == notification_from_db.status
def test_get_notification(notify_db, notify_db_session, sample_notification):
notifcation_from_db = get_notification(
sample_notification.service.id,
sample_notification.id)
assert sample_notification == notifcation_from_db
def test_save_notification_no_job_id(notify_db, notify_db_session, sample_template): def test_save_notification_no_job_id(notify_db, notify_db_session, sample_template):
assert Notification.query.count() == 0 assert Notification.query.count() == 0
@@ -54,7 +62,8 @@ def test_save_notification_no_job_id(notify_db, notify_db_session, sample_templa
def test_get_notification_for_job(notify_db, notify_db_session, sample_notification): def test_get_notification_for_job(notify_db, notify_db_session, sample_notification):
notifcation_from_db = get_notification(sample_notification.service.id, notifcation_from_db = get_notification_for_job(
sample_notification.service.id,
sample_notification.job_id, sample_notification.job_id,
sample_notification.id) sample_notification.id)
assert sample_notification == notifcation_from_db assert sample_notification == notifcation_from_db
@@ -70,7 +79,7 @@ def test_get_all_notifications_for_job(notify_db, notify_db_session, sample_job)
template=sample_job.template, template=sample_job.template,
job=sample_job) job=sample_job)
notifcations_from_db = get_notifications(sample_job.service.id, sample_job.id) notifcations_from_db = get_notifications_for_job(sample_job.service.id, sample_job.id)
assert len(notifcations_from_db) == 5 assert len(notifcations_from_db) == 5

View File

@@ -4,46 +4,49 @@ import uuid
from tests import create_authorization_header from tests import create_authorization_header
from flask import url_for, json from flask import url_for, json
from app.models import Service from app.models import Service
from tests.app.conftest import sample_service as create_sample_service
from tests.app.conftest import sample_template as create_sample_template
def test_get_notifications( def test_get_notifications(
notify_api, notify_db, notify_db_session, sample_api_key, mocker): notify_api, notify_db, notify_db_session, sample_api_key, sample_notification):
""" """
Tests GET endpoint '/' to retrieve entire service list. Tests GET endpoint '/' to retrieve entire service list.
""" """
with notify_api.test_request_context(): with notify_api.test_request_context():
with notify_api.test_client() as client: with notify_api.test_client() as client:
auth_header = create_authorization_header( auth_header = create_authorization_header(
service_id=sample_api_key.service_id, service_id=sample_notification.service_id,
path=url_for('notifications.get_notifications', notification_id=123), path='/notifications/{}'.format(sample_notification.id),
method='GET') method='GET')
response = client.get( response = client.get(
url_for('notifications.get_notifications', notification_id=123), '/notifications/{}'.format(sample_notification.id),
headers=[auth_header]) headers=[auth_header])
notification = json.loads(response.get_data(as_text=True))['notification']
assert notification['status'] == 'sent'
assert notification['template'] == sample_notification.template.id
assert notification['to'] == '+44709123456'
assert notification['service'] == str(sample_notification.service_id)
assert response.status_code == 200 assert response.status_code == 200
def test_get_notifications_empty_result( def test_get_notifications_empty_result(
notify_api, notify_db, notify_db_session, sample_api_key, mocker): 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_request_context():
with notify_api.test_client() as client: with notify_api.test_client() as client:
id = uuid.uuid4()
auth_header = create_authorization_header( auth_header = create_authorization_header(
service_id=sample_api_key.service_id, service_id=sample_api_key.service_id,
path=url_for('notifications.get_notifications', notification_id=123), path=url_for('notifications.get_notifications', notification_id=id),
method='GET') method='GET')
response = client.get( response = client.get(
url_for('notifications.get_notifications', notification_id=123), url_for('notifications.get_notifications', notification_id=id),
headers=[auth_header]) headers=[auth_header])
assert response.status_code == 200 assert response.status_code == 404
def test_create_sms_should_reject_if_no_phone_numbers( def test_create_sms_should_reject_if_no_phone_numbers(