diff --git a/app/dao/services_dao.py b/app/dao/services_dao.py index fafe68c8f..54fb5dd01 100644 --- a/app/dao/services_dao.py +++ b/app/dao/services_dao.py @@ -30,6 +30,11 @@ def save_model_service(service, update_dict=None): db.session.commit() +def delete_model_service(service): + db.session.delete(service) + db.session.commit() + + def get_model_services(service_id=None, user_id=None): # TODO need better mapping from function params to sql query. if user_id and service_id: diff --git a/app/dao/users_dao.py b/app/dao/users_dao.py index ca4264cca..5b389e6b7 100644 --- a/app/dao/users_dao.py +++ b/app/dao/users_dao.py @@ -15,6 +15,11 @@ def save_model_user(usr, update_dict={}): db.session.commit() +def delete_model_user(user): + db.session.delete(user) + db.session.commit() + + def get_model_users(user_id=None): if user_id: return User.query.filter_by(id=user_id).one() diff --git a/app/service/views/rest.py b/app/service/views/rest.py index 4f5567f56..c31d7146c 100644 --- a/app/service/views/rest.py +++ b/app/service/views/rest.py @@ -1,7 +1,8 @@ from flask import (jsonify, request) from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound -from app.dao.services_dao import (save_model_service, get_model_services) +from app.dao.services_dao import ( + save_model_service, get_model_services, delete_model_service) from app.dao.users_dao import get_model_users from app.dao import DAOException from .. import service @@ -26,7 +27,7 @@ def create_service(): # TODO auth to be added -@service.route('/', methods=['PUT']) +@service.route('/', methods=['PUT', 'DELETE']) def update_service(service_id): try: service = get_model_services(service_id=service_id) @@ -34,19 +35,24 @@ def update_service(service_id): return jsonify(result="error", message="Invalid service id"), 400 except NoResultFound: return jsonify(result="error", message="Service not found"), 404 - # TODO there has got to be a better way to do the next three lines - upd_serv, errors = service_schema.load(request.get_json()) - if errors: - return jsonify(result="error", message=errors), 400 - update_dict, errors = service_schema.dump(upd_serv) - # TODO FIX ME - # Remove update_service model which is added to db.session - db.session.rollback() - try: - save_model_service(service, update_dict=update_dict) - except DAOException as e: - return jsonify(result="error", message=str(e)), 400 - return jsonify(data=service_schema.dump(service).data) + if request.method == 'DELETE': + status_code = 202 + delete_model_service(service) + else: + status_code = 200 + # TODO there has got to be a better way to do the next three lines + upd_serv, errors = service_schema.load(request.get_json()) + if errors: + return jsonify(result="error", message=errors), 400 + update_dict, errors = service_schema.dump(upd_serv) + # TODO FIX ME + # Remove update_service model which is added to db.session + db.session.rollback() + try: + save_model_service(service, update_dict=update_dict) + except DAOException as e: + return jsonify(result="error", message=str(e)), 400 + return jsonify(data=service_schema.dump(service).data), status_code # TODO auth to be added. diff --git a/app/user/views/rest.py b/app/user/views/rest.py index c0eb533ab..a2633d9f7 100644 --- a/app/user/views/rest.py +++ b/app/user/views/rest.py @@ -2,7 +2,8 @@ from flask import (jsonify, request) from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound from app.dao.services_dao import get_model_services -from app.dao.users_dao import (get_model_users, save_model_user) +from app.dao.users_dao import ( + get_model_users, save_model_user, delete_model_user) from app.schemas import ( user_schema, users_schema, service_schema, services_schema) from .. import user @@ -20,7 +21,7 @@ def create_user(): # TODO auth to be added -@user.route('/', methods=['PUT']) +@user.route('/', methods=['PUT', 'DELETE']) def update_user(user_id): try: user = get_model_users(user_id=user_id) @@ -28,16 +29,21 @@ def update_user(user_id): return jsonify(result="error", message="Invalid user id"), 400 except NoResultFound: return jsonify(result="error", message="User not found"), 404 - # TODO there has got to be a better way to do the next three lines - update_user, errors = user_schema.load(request.get_json()) - if errors: - return jsonify(result="error", message=errors), 400 - update_dict, errors = user_schema.dump(update_user) - # TODO FIX ME - # Remove update_service model which is added to db.session - db.session.rollback() - save_model_user(user, update_dict=update_dict) - return jsonify(data=user_schema.dump(user).data) + if request.method == 'DELETE': + status_code = 202 + delete_model_user(user) + else: + status_code = 200 + # TODO there has got to be a better way to do the next three lines + update_user, errors = user_schema.load(request.get_json()) + if errors: + return jsonify(result="error", message=errors), 400 + update_dict, errors = user_schema.dump(update_user) + # TODO FIX ME + # Remove update_service model which is added to db.session + db.session.rollback() + save_model_user(user, update_dict=update_dict) + return jsonify(data=user_schema.dump(user).data), status_code # TODO auth to be added. diff --git a/tests/app/dao/test_services_dao.py b/tests/app/dao/test_services_dao.py index a6b4abe68..66c377e4d 100644 --- a/tests/app/dao/test_services_dao.py +++ b/tests/app/dao/test_services_dao.py @@ -1,6 +1,6 @@ import pytest from app.dao.services_dao import ( - save_model_service, get_model_services, DAOException) + save_model_service, get_model_services, DAOException, delete_model_service) from tests.app.conftest import sample_service as create_sample_service from app.models import Service @@ -62,3 +62,9 @@ def test_missing_user_attribute(notify_api, notify_db, notify_db_session): pytest.fail("DAOException not thrown") except DAOException as e: assert "Missing data for required attribute" in str(e) + + +def test_delete_service(notify_api, notify_db, notify_db_session, sample_service): + assert Service.query.count() == 1 + delete_model_service(sample_service) + assert Service.query.count() == 0 diff --git a/tests/app/dao/test_users_dao.py b/tests/app/dao/test_users_dao.py index 443a1cf22..6190ab20b 100644 --- a/tests/app/dao/test_users_dao.py +++ b/tests/app/dao/test_users_dao.py @@ -1,6 +1,7 @@ from sqlalchemy.exc import DataError from sqlalchemy.orm.exc import NoResultFound -from app.dao.users_dao import (save_model_user, get_model_users) +from app.dao.users_dao import ( + save_model_user, get_model_users, delete_model_user) from tests.app.conftest import sample_user as create_sample_user from app.models import User @@ -47,3 +48,9 @@ def test_get_user_invalid_id(notify_api, notify_db, notify_db_session): pytest.fail("DataError exception not thrown.") except DataError: pass + + +def test_delete_users(notify_api, notify_db, notify_db_session, sample_user): + assert User.query.count() == 1 + delete_model_user(sample_user) + assert User.query.count() == 0 diff --git a/tests/app/service/views/test_rest.py b/tests/app/service/views/test_rest.py index 2e0cd3e8a..450b7979a 100644 --- a/tests/app/service/views/test_rest.py +++ b/tests/app/service/views/test_rest.py @@ -209,3 +209,15 @@ def test_put_service_remove_user(notify_api, notify_db, notify_db_session, sampl assert len(json_resp['data']['users']) == 1 assert sample_user.id not in json_resp['data']['users'] assert another_user.id in json_resp['data']['users'] + + +def test_delete_user(notify_api, notify_db, notify_db_session, sample_service): + with notify_api.test_request_context(): + with notify_api.test_client() as client: + service = Service.query.first() + resp = client.delete( + url_for('service.update_service', service_id=service.id), + headers=[('Content-Type', 'application/json')]) + assert resp.status_code == 202 + json_resp = json.loads(resp.get_data(as_text=True)) + assert Service.query.count() == 0 diff --git a/tests/app/user/views/test_rest.py b/tests/app/user/views/test_rest.py index 9b6e7ac6f..f59804c96 100644 --- a/tests/app/user/views/test_rest.py +++ b/tests/app/user/views/test_rest.py @@ -195,3 +195,15 @@ def test_get_user_service_service_not_exists(notify_api, notify_db, notify_db_se assert resp.status_code == 404 json_resp = json.loads(resp.get_data(as_text=True)) assert "Service not found" in json_resp['message'] + + +def test_delete_user(notify_api, notify_db, notify_db_session, sample_user): + with notify_api.test_request_context(): + with notify_api.test_client() as client: + user = User.query.first() + resp = client.delete( + url_for('user.update_user', user_id=user.id), + headers=[('Content-Type', 'application/json')]) + assert resp.status_code == 202 + json_resp = json.loads(resp.get_data(as_text=True)) + assert User.query.count() == 0