From 39188e6000828e9f5e5e1260148871bc7ce4395a Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 30 Jun 2016 15:45:20 +0200 Subject: [PATCH] add basic validation support --- api/core.py | 13 +++++++++++-- api/validators.py | 14 ++++++++++++++ api/views/designers.py | 3 +++ tests/test_validators.py | 12 ++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 api/validators.py create mode 100644 tests/test_validators.py diff --git a/api/core.py b/api/core.py index 1e18545..d7995f5 100644 --- a/api/core.py +++ b/api/core.py @@ -2,6 +2,7 @@ from flask import Flask, jsonify, Response, request from flask_sqlalchemy import SQLAlchemy from api.extensions.esales import Esales from api.helpers import check_api_key +from api.validators import ValidationError db = SQLAlchemy() esales = Esales() @@ -15,8 +16,16 @@ def create_app(config_name='config'): # register errors handlers @app.errorhandler(404) - def on_404(e): - return jsonify(dict(error='Not found')), 404 + def on_404(error): + response = jsonify({'status': 404, 'message': 'The requested resource was not found'}) + response.status_code = 404 + return response + + @app.errorhandler(ValidationError) + def on_validation_error(error): + response = jsonify({'status': 400, 'message': error.message}) + response.status_code = 400 + return response # register blueprints from api.views import server, designers, categories diff --git a/api/validators.py b/api/validators.py new file mode 100644 index 0000000..ffcdd2c --- /dev/null +++ b/api/validators.py @@ -0,0 +1,14 @@ +# coding=UTF-8 + +class ValidationError(Exception): + + def __init__(self, message): + Exception.__init__(self) + self.message = message + + +def validate_keys_exists(obj, *keys): + for key in keys: + if not key in obj: + raise ValidationError('No {} is specified'.format(key)) + return True \ No newline at end of file diff --git a/api/views/designers.py b/api/views/designers.py index f0eeafd..c75f714 100644 --- a/api/views/designers.py +++ b/api/views/designers.py @@ -1,6 +1,8 @@ from flask import Blueprint, request, jsonify from api import db, tasks from api.models import Designer +from api.validators import validate_keys_exists + mod = Blueprint('designers', __name__, url_prefix='/designers') @@ -14,6 +16,7 @@ def list(): @mod.route("/", methods=["POST"]) def create(): data = request.json + validate_keys_exists(data, 'username', 'name') designer = Designer(**data) db.session.add(designer) db.session.commit() diff --git a/tests/test_validators.py b/tests/test_validators.py new file mode 100644 index 0000000..50a933f --- /dev/null +++ b/tests/test_validators.py @@ -0,0 +1,12 @@ +import unittest2 +from api.validators import ValidationError, validate_keys_exists + + +class TestValidation(unittest2.TestCase): + + def test_validate_keys_exists(self): + obj = {'a':1, 'b':2} + self.assertRaises(ValidationError, validate_keys_exists, obj, 'c') + self.assertRaises(ValidationError, validate_keys_exists, obj, 'a', 'b', 'c') + self.assertTrue(validate_keys_exists(obj, 'a')) + self.assertTrue(validate_keys_exists(obj, 'a', 'b'))