From 9eb856b86e73a4338ce9de58bf0697ba5b6f82e4 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 20 Jan 2016 15:23:32 +0000 Subject: [PATCH 1/3] Get api_keys for service endpoint --- app/schemas.py | 2 +- app/service/rest.py | 19 +++++++++++++++- tests/app/service/test_api_key_endpoints.py | 25 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/schemas.py b/app/schemas.py index ec98a69f1..29fa812dc 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -30,7 +30,7 @@ class TemplateSchema(ma.ModelSchema): class ApiKeySchema(ma.ModelSchema): class Meta: model = models.ApiKey - exclude = ("service", "secret", "expiry_date") + exclude = ("service", "secret") class JobSchema(ma.ModelSchema): diff --git a/app/service/rest.py b/app/service/rest.py index 1c80f930f..c48595cfa 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -13,7 +13,7 @@ from app.dao.templates_dao import ( from app.dao.api_key_dao import (save_model_api_key, get_model_api_keys, get_unsigned_secret) from app.models import ApiKey from app.schemas import ( - services_schema, service_schema, template_schema) + services_schema, service_schema, template_schema, api_keys_schema) from flask import Blueprint service = Blueprint('service', __name__) @@ -109,6 +109,23 @@ def revoke_api_key(service_id, api_key_id): return jsonify(), 202 +@service.route('//api-key', methods=['GET']) +def get_api_keys(service_id): + try: + service = get_model_services(service_id=service_id) + except DataError: + return jsonify(result="error", message="Invalid service id"), 400 + except NoResultFound: + return jsonify(result="error", message="Service not found"), 404 + + try: + api_keys = get_model_api_keys(service_id=service_id) + except DAOException as e: + return jsonify(result='error', message=str(e)), 400 + + return jsonify(apiKeys=api_keys_schema.dump(api_keys)), 200 + + @service.route('//template', methods=['POST']) def create_template(service_id): try: diff --git a/tests/app/service/test_api_key_endpoints.py b/tests/app/service/test_api_key_endpoints.py index 2c83a60f8..93c6c2045 100644 --- a/tests/app/service/test_api_key_endpoints.py +++ b/tests/app/service/test_api_key_endpoints.py @@ -1,8 +1,10 @@ import json +from datetime import timedelta, datetime from flask import url_for from app.models import ApiKey +from dao.api_key_dao import save_model_api_key from tests import create_authorization_header @@ -82,3 +84,26 @@ def test_api_key_should_create_multiple_new_api_key_for_service(notify_api, noti assert response2.status_code == 201 assert response2.get_data != response.get_data assert ApiKey.query.count() == 2 + + +def test_get_api_keys_should_return_all_keys_for_service(notify_api, notify_db, + notify_db_session, + sample_api_key): + with notify_api.test_request_context(): + with notify_api.test_client() as client: + api_key2 = ApiKey(**{'service_id': sample_api_key.service_id, 'name': 'second_api_key'}) + api_key3 = ApiKey(**{'service_id': sample_api_key.service_id, 'name': 'third_api_key', + 'expiry_date': datetime.utcnow() + timedelta(hours=-1)}) + save_model_api_key(api_key2) + save_model_api_key(api_key3) + assert ApiKey.query.count() == 3 + + auth_header = create_authorization_header(path=url_for('service.get_api_keys', + service_id=sample_api_key.service_id), + method='GET') + response = client.get(url_for('service.get_api_keys', + service_id=sample_api_key.service_id), + headers=[('Content-Type', 'application/json'), auth_header]) + assert response.status_code == 200 + json_resp = json.loads(response.get_data(as_text=True)) + assert len(json_resp['apiKeys']) == 3 From 3e141e05cbb8e071fef90faec870989f256990df Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 20 Jan 2016 15:41:19 +0000 Subject: [PATCH 2/3] Added tests for get api endpoint --- app/service/rest.py | 2 +- tests/app/service/test_api_key_endpoints.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/service/rest.py b/app/service/rest.py index c48595cfa..9e092ae25 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -123,7 +123,7 @@ def get_api_keys(service_id): except DAOException as e: return jsonify(result='error', message=str(e)), 400 - return jsonify(apiKeys=api_keys_schema.dump(api_keys)), 200 + return jsonify(apiKeys=api_keys_schema.dump(api_keys).data), 200 @service.route('//template', methods=['POST']) diff --git a/tests/app/service/test_api_key_endpoints.py b/tests/app/service/test_api_key_endpoints.py index 93c6c2045..1bc0187ac 100644 --- a/tests/app/service/test_api_key_endpoints.py +++ b/tests/app/service/test_api_key_endpoints.py @@ -2,10 +2,12 @@ import json from datetime import timedelta, datetime from flask import url_for - from app.models import ApiKey -from dao.api_key_dao import save_model_api_key +from app.dao.api_key_dao import save_model_api_key from tests import create_authorization_header +from tests.app.conftest import sample_api_key as create_sample_api_key +from tests.app.conftest import sample_service as create_sample_service +from tests.app.conftest import sample_user as create_user def test_api_key_should_create_new_api_key_for_service(notify_api, notify_db, @@ -91,12 +93,16 @@ def test_get_api_keys_should_return_all_keys_for_service(notify_api, notify_db, sample_api_key): with notify_api.test_request_context(): with notify_api.test_client() as client: + another_user = create_user(notify_db, notify_db_session, email='another@it.gov.uk') + another_service = create_sample_service(notify_db, notify_db_session, service_name='another', + user=another_user) + create_sample_api_key(notify_db, notify_db_session, service=another_service) api_key2 = ApiKey(**{'service_id': sample_api_key.service_id, 'name': 'second_api_key'}) api_key3 = ApiKey(**{'service_id': sample_api_key.service_id, 'name': 'third_api_key', 'expiry_date': datetime.utcnow() + timedelta(hours=-1)}) save_model_api_key(api_key2) save_model_api_key(api_key3) - assert ApiKey.query.count() == 3 + assert ApiKey.query.count() == 4 auth_header = create_authorization_header(path=url_for('service.get_api_keys', service_id=sample_api_key.service_id), From dada8bb75e16cfb4ac67ee67d299f12e1a663501 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 20 Jan 2016 16:12:11 +0000 Subject: [PATCH 3/3] Fix test so that the order of the list does not matter --- tests/app/service/test_rest.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 491366f93..f5d00a7e5 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -1,4 +1,6 @@ import json +from collections import Set + from flask import url_for from app.dao.services_dao import save_model_service from app.models import (Service, ApiKey, Template) @@ -229,7 +231,8 @@ def test_put_service_add_user(notify_api, notify_db, notify_db_session, sample_s assert len(json_resp['data']['users']) == 2 assert sample_user.id in json_resp['data']['users'] assert another_user.id in json_resp['data']['users'] - assert updated_service.users == [sample_user, another_user] + assert len(updated_service.users) == 2 + assert set(updated_service.users) == set([sample_user, another_user]) def test_put_service_remove_user(notify_api, notify_db, notify_db_session, sample_service, sample_admin_service_id):