class PostInSchema(Schema): title = String(required=True) content = String(required=True) private = Boolean(default=False) column_ids = List(Integer())
class ImageOutSchema(Schema): id = Integer() filename = String() image_url = URL()
class ColumnInSchema(Schema): name = String() post_ids = List(Integer())
class ColumnOutSchema(Schema): id = Integer() name = String() author = Nested(PublicUserOutSchema) posts = List(Nested(lambda: PostOutSchema(only=("id", "title", "self")))) self = ma.URLFor(".column", values=dict(column_id="<id>"))
class PetOutSchema(Schema): id = Integer() name = String() category = String()
class PetSchema(Schema): name = String(required=True) age = Integer(default=123)
class HTTPErrorSchema(Schema): status_code = String(required=True) message = String(required=True)
class GroupOutSchema(Schema): name = String() members = List(Nested(PublicUserOutSchema)) manager = Nested(PublicUserOutSchema) private = Boolean()
class HeaderSchema(Schema): class Meta: unknown = EXCLUDE foo = String(missing='bar')
class ValidationErrorSchema(Schema): status_code = String(required=True) message = String(required=True)
class BazSchema(Schema): id = Integer(default=123) name = String()
class BarSchema(Schema): class Meta: unknown = EXCLUDE id2 = Integer(default=123) name2 = String(required=True)
def test_input_with_dict_schema(app, client): dict_schema = {'name': String(required=True)} @app.get('/foo') @input(dict_schema, 'query') def foo(query): return query @app.post('/bar') @input(dict_schema, schema_name='MyName') def bar(body): return body @app.post('/baz') @input(dict_schema) def baz(body): return body @app.post('/spam') @input(dict_schema) def spam(body): return body rv = client.get('/foo') assert rv.status_code == 400 assert rv.json == { 'detail': { 'query': { 'name': ['Missing data for required field.'] } }, 'message': 'Validation error', 'status_code': 400 } rv = client.get('/foo?name=grey') assert rv.status_code == 200 assert rv.json == {'name': 'grey'} rv = client.post('/bar') assert rv.status_code == 400 assert rv.json == { 'detail': { 'json': { 'name': ['Missing data for required field.'] } }, 'message': 'Validation error', 'status_code': 400 } rv = client.post('/bar', json={'name': 'grey'}) assert rv.status_code == 200 assert rv.json == {'name': 'grey'} rv = client.get('/openapi.json') assert rv.status_code == 200 validate_spec(rv.json) assert rv.json['paths']['/foo']['get']['parameters'][0] == { 'in': 'query', 'name': 'name', 'required': True, 'schema': { 'type': 'string' } } # TODO check the excess item "'x-scope': ['']" in schema object assert rv.json['paths']['/bar']['post']['requestBody']['content'][ 'application/json']['schema']['$ref'] == '#/components/schemas/MyName' assert rv.json['components']['schemas']['MyName'] == { 'properties': { 'name': { 'type': 'string' } }, 'required': ['name'], 'type': 'object' } # default schema name is "Generated" assert rv.json['paths']['/baz']['post']['requestBody']['content'][ 'application/json']['schema'][ '$ref'] == '#/components/schemas/Generated' assert rv.json['paths']['/spam']['post']['requestBody']['content'][ 'application/json']['schema'][ '$ref'] == '#/components/schemas/Generated1'
class NotificationOutSchema(Schema): id = Integer() message = String() receiver = Nested(PublicUserOutSchema) timestamp = DateTime()
class FooSchema(Schema): class Meta: unknown = EXCLUDE id = Integer(default=123) name = String(required=True)
class GroupInSchema(Schema): name = String(required=True) members = List(Integer()) private = Boolean()
class QuerySchema(Schema): foo = String(required=True) bar = String(required=True)
class IndexSchema(Schema): api_version = String(default="3.0") api_base_url = URL()
class PetInSchema(Schema): name = String(required=True, validate=Length(0, 10)) category = String(required=True, validate=OneOf(['dog', 'cat']))