Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
eb374a6
Remove vendored swagger-ui, add swagger-ui-bundle as optional pip ext…
dtkav Jul 10, 2018
c9fdb5d
remove old_style_options from app and api
Jul 11, 2018
980b8f1
remove test for warning which has been removed
Jul 11, 2018
5ec6284
fix up some tests
Jul 11, 2018
b280d31
fix up tests, document changes in readme
Jul 11, 2018
fea2611
isort
Jul 12, 2018
3b9ad6a
Merge branch 'master' into dev-2.0
jmcs Jul 13, 2018
5e7479d
Fix code style issue
jmcs Jul 13, 2018
07c32dd
use general-purpose recursive resolver
Jul 16, 2018
7fab8a7
remove impossible case of reference resolution failing after validation
Jul 19, 2018
b39a861
only rely on jsconschema resolver
Jul 23, 2018
ff0e378
bring back local resolution with deep_get
Jul 23, 2018
d7b71bb
add x-nullable support for body validators
Jul 25, 2018
457d7a8
Merge branch 'master' of https://github.com/zalando/connexion into nu…
Jul 26, 2018
cd9f7b4
remove ref resolution from mock code
Jul 27, 2018
ec9b52a
parameterize tests in prep for OpenAPI3 support
Jul 26, 2018
083c4d4
remove bad test that relies on logging
Jul 26, 2018
95dcefe
Rename Operation to Swagger2Operation
Jul 30, 2018
dbe7061
isort
Aug 1, 2018
231fbb0
add Operation for backwards compatability
Aug 2, 2018
9964cac
increase coverage for utils.py
Jul 26, 2018
93049f4
add pragma: no cover to some __repr__ functions
Jul 30, 2018
ae6bba6
default to Swagger2URIParser
Aug 2, 2018
e56ff62
kick build
Aug 3, 2018
d248434
add check for Iterable
Aug 7, 2018
a17f822
switch from swagger_spec_validator to openapi_spec_validator library
Aug 2, 2018
df0fb0c
update README.md 'new in 2.0' section
Aug 2, 2018
646517f
remove accidental empty file
Aug 7, 2018
deb5104
update README to include information about exceptions
Aug 7, 2018
bce4530
remove logging openapi spec version
Aug 7, 2018
40c1c5a
Wrap OpenAPIValidationError exceptions with InvalidSpecification
Aug 7, 2018
97148ce
use verbose logging from ValidationError
Aug 7, 2018
b2eff6f
rely on ValidationError methods
Aug 7, 2018
b6edbf9
isort
Aug 7, 2018
614c1bc
update some names from swagger to openapi
Aug 8, 2018
fb28646
add options.py changes
Aug 8, 2018
7ce302d
update aio test to compare against raw_spec
Aug 8, 2018
5992012
rename 'swagger_json' option to 'serve_spec', add deprecation warning
Aug 8, 2018
29a5364
add override if UI is enabled
Aug 8, 2018
077a795
disable and remove comment about swagger_json override behavior
Aug 9, 2018
167df58
fix the way cli.py passes options
dtkav Aug 7, 2018
07bcd0e
Merge pull request #656 from dtkav/fix_cli
dtkav Aug 23, 2018
99ac95f
Refactor Operation into AbstractOperation and Swagger2Operation (#639)
dtkav Aug 23, 2018
ca1607a
Merge branch 'master' into dev-2.0
dtkav Aug 24, 2018
18de95e
fix form defaults, and form array handling
dtkav Aug 27, 2018
cd2b8e4
Merge pull request #668 from dtkav/fix_forms
dtkav Aug 27, 2018
86b5059
Merge pull request #669 from dmksnnk/nullable-in-definitions
dtkav Aug 29, 2018
32a9ca5
Merge branch 'master' into dev-2.0
dtkav Sep 3, 2018
98957d5
refactor Operation into AbstractOperation ABC and SwaggerOperation
dtkav Jul 23, 2018
62c4cd5
remove defaults validation from swagger2.py (now handled in validator)
dtkav Aug 8, 2018
602d329
remove unused/uncovered code
dtkav Aug 10, 2018
5feaf3f
use external swagger_ui_bundle package, remove vendored files
dtkav Jul 2, 2018
b15ffce
initial support for oas3
dtkav Jul 2, 2018
d263417
Merge pull request #621 from dtkav/oas3
dtkav Sep 11, 2018
f1f1e9b
Merge branch 'master' into dev-2.0
dtkav Sep 12, 2018
f6ea055
servers is not a requried field in oas3 spec
dtkav Sep 12, 2018
e09f976
move swagger2 examples under swagger2 folder
dtkav Sep 12, 2018
5ca46e2
Merge pull request #676 from dtkav/bugfix_no_oas3_server
dtkav Sep 12, 2018
024edd1
Merge pull request #677 from dtkav/swagger2_examples
dtkav Sep 12, 2018
602924b
add oas3 examples
dtkav Jul 11, 2018
d093225
Merge pull request #622 from dtkav/oas3_examples
dtkav Sep 13, 2018
4ebc580
Codacy fixes (#680)
dtkav Sep 13, 2018
7b01efd
skip codacy warnings about the use of assert in unit tests (#679)
dtkav Sep 13, 2018
35e4e67
rely on openapi-spec-validator to safely load and resolve yaml files …
dtkav Sep 14, 2018
d5f15e5
Change nullable handling, add support for readOnly/writeOnly keyword
cziebuhr Sep 18, 2018
b4abfc3
Set validator_map per api
cziebuhr Sep 14, 2018
8e38cc2
Allow setting validator on ResponseValidator
cziebuhr Sep 14, 2018
3dcba08
Add more tests for validator_map and readOnly/writeOnly
cziebuhr Sep 18, 2018
08fa18f
Merge pull request #684 from cziebuhr/nullable
dtkav Sep 20, 2018
6258264
Merge branch 'master' into dev-2.0
dtkav Sep 20, 2018
28893a0
add support for x-openapi-router-controller
dtkav Sep 20, 2018
039dc62
update README
dtkav Sep 20, 2018
6aafd33
set _router_controller before calling AbstractOperation.__init__(...)
dtkav Sep 20, 2018
96fad89
update tests
dtkav Sep 20, 2018
16e16c3
Merge pull request #688 from dtkav/openapi-router-controller
dtkav Sep 21, 2018
5f85bc3
Merge branch 'master' into dev-2.0
jmcs Sep 27, 2018
e2fefb0
Update docs/examples for validator_map (#700)
cziebuhr Sep 28, 2018
ed6535e
Rework security flow (#686)
cziebuhr Sep 28, 2018
8e00b73
Setting base_path updates served spec (#698)
dtkav Sep 30, 2018
0ac8c42
set jsonschema max version
dtkav Oct 3, 2018
e83bd14
Merge pull request #708 from dtkav/jsonschema_max_version
dtkav Oct 4, 2018
069c59b
bugfix: get securitySchemes in openapi 3 APIs (#712)
dtkav Oct 5, 2018
b6e81ca
Introduce Specification classes
dtkav Oct 8, 2018
769b355
fix aiohttp test
dtkav Oct 8, 2018
577451f
remove some api properties
dtkav Oct 8, 2018
1b757e5
remove assert from testing
dtkav Oct 8, 2018
745a4ac
rename spec from_file to load
dtkav Oct 18, 2018
f2cbed1
Merge pull request #713 from dtkav/spec_class
dtkav Oct 18, 2018
48524ec
Fix new errors from Flake8 update
dtkav Oct 27, 2018
0545ad1
Merge pull request #736 from dtkav/flake8_errors
dtkav Oct 27, 2018
920f13d
Merge remote-tracking branch 'origin/master' into dev-2.0
jmcs Oct 29, 2018
6bcf2b3
Add App(resolver=...) for app-wide default resolver (#735)
dtkav Oct 29, 2018
63138c4
swagger-ui README section passes options instead of kwargs (#743)
dtkav Nov 1, 2018
de853d4
Make readme pass pypi checks
jmcs Nov 5, 2018
e67c646
Update introduction
jmcs Nov 5, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add more tests for validator_map and readOnly/writeOnly
  • Loading branch information
cziebuhr committed Sep 19, 2018
commit 3dcba08cef815cd50b7ff37f7496b320291f4a0c
5 changes: 5 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,11 @@ def default_param_error_spec_dir():
return FIXTURES_FOLDER / 'default_param_error'


@pytest.fixture
def json_validation_spec_dir():
return FIXTURES_FOLDER / 'json_validation'


def build_app_from_fixture(api_spec_folder, spec_file='openapi.yaml', **kwargs):
debug = True
if 'debug' in kwargs:
Expand Down
14 changes: 14 additions & 0 deletions tests/fakeapi/hello.py
Original file line number Diff line number Diff line change
Expand Up @@ -484,3 +484,17 @@ def get_httpstatus_response():

def get_bad_default_response(response_code):
return {}, response_code


def get_user():
return {'user_id': 7, 'name': 'max'}


def get_user_with_password():
return {'user_id': 7, 'name': 'max', 'password': '5678'}


def post_user(body):
body['user_id'] = 8
body.pop('password', None)
return body
77 changes: 77 additions & 0 deletions tests/fixtures/json_validation/openapi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
openapi: "3.0.0"

info:
title: "{{title}}"
version: "1.0"

servers:
- url: /v1.0

components:
schemas:
User:
type: object
required:
- name
- user_id
- password
properties:
user_id:
type: integer
readOnly: true
name:
type: string
password:
type: string
writeOnly: true

paths:
/minlength:
post:
operationId: fakeapi.hello.post
requestBody:
content:
application/json:
schema:
type: object
properties:
foo:
type: string
responses:
200:
description: Success

/user:
get:
operationId: fakeapi.hello.get_user
responses:
200:
description: User object
content:
application/json:
schema:
$ref: '#/components/schemas/User'
post:
operationId: fakeapi.hello.post_user
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/User'
responses:
200:
description: User object
content:
application/json:
schema:
$ref: '#/components/schemas/User'
/user_with_password:
get:
operationId: fakeapi.hello.get_user_with_password
responses:
200:
description: User object
content:
application/json:
schema:
$ref: '#/components/schemas/User'
69 changes: 69 additions & 0 deletions tests/fixtures/json_validation/swagger.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
swagger: "2.0"

info:
title: "{{title}}"
version: "1.0"

basePath: /v1.0

definitions:
User:
type: object
required:
- name
properties:
user_id:
type: integer
readOnly: true
name:
type: string
password:
type: string
x-writeOnly: true

paths:
/minlength:
post:
operationId: fakeapi.hello.post
parameters:
- name: body
in: body
required: true
schema:
type: object
properties:
foo:
type: string
responses:
200:
description: Success

/user:
get:
operationId: fakeapi.hello.get_user
responses:
200:
description: User object
schema:
$ref: '#/definitions/User'
post:
operationId: fakeapi.hello.post_user
parameters:
- name: body
in: body
required: true
schema:
$ref: '#/definitions/User'
responses:
200:
description: User object
schema:
$ref: '#/definitions/User'
/user_with_password:
get:
operationId: fakeapi.hello.get_user_with_password
responses:
200:
description: User object
schema:
$ref: '#/definitions/User'
77 changes: 77 additions & 0 deletions tests/test_json_validation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import json

from jsonschema.validators import _utils, extend

import pytest
from conftest import build_app_from_fixture
from connexion import App
from connexion.decorators.validation import RequestBodyValidator
from connexion.json_schema import Draft4RequestValidator

SPECS = ["swagger.yaml", "openapi.yaml"]

@pytest.mark.parametrize("spec", SPECS)
def test_validator_map(json_validation_spec_dir, spec):
def validate_type(validator, types, instance, schema):
types = _utils.ensure_list(types)
errors = Draft4RequestValidator.VALIDATORS['type'](validator, types, instance, schema)
for e in errors:
yield e

if 'string' in types and 'minLength' not in schema:
errors = Draft4RequestValidator.VALIDATORS['minLength'](validator, 1, instance, schema)
for e in errors:
yield e

MinLengthRequestValidator = extend(Draft4RequestValidator, {'type': validate_type})

class MyRequestBodyValidator(RequestBodyValidator):
def __init__(self, *args, **kwargs):
super(MyRequestBodyValidator, self).__init__(*args, validator=MinLengthRequestValidator, **kwargs)

validator_map = {'body': MyRequestBodyValidator}

app = App(__name__, specification_dir=json_validation_spec_dir)
app.add_api(spec, validate_responses=True, validator_map=validator_map)
app_client = app.app.test_client()

res = app_client.post('/v1.0/minlength', data=json.dumps({'foo': 'bar'}), content_type='application/json') # type: flask.Response
assert res.status_code == 200

res = app_client.post('/v1.0/minlength', data=json.dumps({'foo': ''}), content_type='application/json') # type: flask.Response
assert res.status_code == 400


@pytest.mark.parametrize("spec", SPECS)
def test_readonly(json_validation_spec_dir, spec):
app = build_app_from_fixture(json_validation_spec_dir, spec, validate_responses=True)
app_client = app.app.test_client()

res = app_client.get('/v1.0/user') # type: flask.Response
assert res.status_code == 200
assert json.loads(res.data.decode()).get('user_id') == 7

res = app_client.post('/v1.0/user', data=json.dumps({'name': 'max', 'password': '1234'}), content_type='application/json') # type: flask.Response
assert res.status_code == 200
assert json.loads(res.data.decode()).get('user_id') == 8

res = app_client.post('/v1.0/user', data=json.dumps({'user_id': 9, 'name': 'max'}), content_type='application/json') # type: flask.Response
assert res.status_code == 400


@pytest.mark.parametrize("spec", SPECS)
def test_writeonly(json_validation_spec_dir, spec):
app = build_app_from_fixture(json_validation_spec_dir, spec, validate_responses=True)
app_client = app.app.test_client()

res = app_client.post('/v1.0/user', data=json.dumps({'name': 'max', 'password': '1234'}), content_type='application/json') # type: flask.Response
assert res.status_code == 200
assert 'password' not in json.loads(res.data.decode())

res = app_client.get('/v1.0/user') # type: flask.Response
assert res.status_code == 200
assert 'password' not in json.loads(res.data.decode())

res = app_client.get('/v1.0/user_with_password') # type: flask.Response
assert res.status_code == 500
assert json.loads(res.data.decode())['title'] == 'Response body does not conform to specification'