Skip to content

[Bug]: No casting applied if type is object #800

Description

@jonathanberthias

Actual Behavior

When validating a request, I get a different validation error depending on the structure of the schema.

If I have the following schema:

Pet:
type: object # <-- this causes the differenceproperties:
id:
type: integerPet2:
allOf:
- properties:
id:
type: integer

and send a request with body {"id": "hello"},

with the first schema I get:

openapi_core.casting.schemas.exceptions.CastError: Failed to cast value to integer type: hello

whereas in the second one I get:

openapi_core.validation.schemas.exceptions.InvalidSchemaValue: Value {'id': 'hello'} not valid for schema of type any: (<ValidationError: "'hello' is not of type 'integer'">,)

Expected Behavior

These schemas are equivalent, and as such I expected to get the same error. Specifically, I expected the validation error in both cases rather than the casting error as I asked for request validation.
Also, removing the type: object in the first schema seems to bypass casting entirely and leads to the same validation error as the second schema.

Steps to Reproduce

schema.yaml
openapi: "3.0.0"info:
title: "Sample API"version: "1.0.0"servers:
- url: /paths:
/pets:
post:
summary: Create a petoperationId: createPetrequestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/Pet"responses:
'201':
description: Createdcontent:
application/json:
schema:
$ref: "#/components/schemas/Pet"/pets2:
post:
summary: Create a petoperationId: createPet2requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/Pet2"responses:
'201':
description: Createdcontent:
application/json:
schema:
$ref: "#/components/schemas/Pet"components:
schemas:
Pet:
type: object # <-- this causes the differenceproperties:
id:
type: integerPet2:
allOf:
- properties:
id:
type: integer
importjsonimporttracebackimportopenapi_corefromopenapi_core.contrib.starletteimportStarletteOpenAPIRequestfromstarlette.requestsimportRequestdefstarlette_request(path: str):
returnRequest({
"type": "http",
"method": "POST",
"path": path,
"headers": [(b"content-type", b"application/json")],
"query_string": "",
})
body=json.dumps({"id": "hello"})
openapi=openapi_core.OpenAPI.from_file_path("schema.yaml")
try:
openapi.validate_request(
StarletteOpenAPIRequest(starlette_request("/pets"), body=body)
)
exceptopenapi_core.exceptions.OpenAPIError:
traceback.print_exc()
try:
openapi.validate_request(
StarletteOpenAPIRequest(starlette_request("/pets2"), body=body)
)
exceptopenapi_core.exceptions.OpenAPIError:
traceback.print_exc()

OpenAPI Core Version

0.19.0

OpenAPI Core Integration

starlette

Affected Area(s)

casting, validation

References

No response

Anything else we need to know?

No response

Would you like to implement a fix?

None

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugIndicates an issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions