OpenAPIValidators icon indicating copy to clipboard operation
OpenAPIValidators copied to clipboard

Nullable ignored on property values

Open Foorack opened this issue 4 years ago • 5 comments

OpenAPI version 3.0

Is your feature request related to a problem? Please describe.

Current validation does not respect nullable on propertiy fields.

User.yaml:

title: User
type: object
properties:
  accountDeletionDate:
    type: string
    format: date
    nullable: true

Response is accountDeletionDate is null. Error message: res did not satisfy it because: accountDeletionDate should be string

Describe the solution you'd like For the validation to pass.

Are you going to resolve the issue? I can make a PR if that will be fastest.

Foorack avatar Aug 09 '21 13:08 Foorack

Hi @Foorack, thanks for raising this 🙂 It seems nullable has been removed between OpenAPI 3.0.3 and 3.1.0, so I've asked the official maintainers to clarify how you should define nullable properties.

In any case, I think validation is done by one of our dependencies, openapi-response-validator, perhaps on this line. That code seems to support nullable as you're using it, so I'm not sure why you case doesn't work. If you need any to changes to validation, I think we'll need to submit a pull request to their repo.

To pinpoint this bug would you mind recreating it using this template?

rwalle61 avatar Aug 15 '21 13:08 rwalle61

Fyi the OpenAPI maintainers got back to me on how to define nullable properties in OpenAPI, let me know if it works!

rwalle61 avatar Aug 22 '21 10:08 rwalle61

Thank you @rwalle61! We will try that and get back to you.

Foorack avatar Aug 22 '21 11:08 Foorack

I'm having trouble testing this, as we are generating code with openapi-generator, and it's going crazy over that syntax. It doesn't expect type being anything other than a string...

Foorack avatar Aug 22 '21 11:08 Foorack

hmm the dependency we use to validate OpenAPI files does not seem to like the type being an array.

If I change our bugRecreationTemplate/openapi.yml to have type: 'null':

openapi: 3.0.0
info:
  title: Example OpenApi 3 spec
  description: Use to recreate a bug
  version: 0.1.0
paths:
  /recreate/bug:
    get:
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: 'null'

then this res passes the test:

 const res = {
    status: 200,
    req: {
      method: 'GET',
      path: '/recreate/bug',
    },
    body: null,
  };

However if I use an array in the openapi.yml:

        '200':
          description: OK
          content:
            application/json:
              schema:
                type: ['null']

Then our validator dependency outputs this validation error:

 Error: Invalid OpenAPI spec: [
  {
    instancePath: '/paths/~1recreate~1bug/get/responses/200/content/application~1json/schema/type',
    schemaPath: '#/properties/type/type',
    keyword: 'type',
    params: { type: 'string' },
    message: 'must be string'
  },
... etc

However, JSON schema specifically recommends type: [string, 'null'] for nullable strings.

Our validator dependency is openapi-response-validator. They use AJV, so perhaps the issue is in there. However if openapi-generator does not accept type as an array either, then I suspect we need to investigate further and clarify the relation between OpenAPI, JSON schema, AJV and openapi-response-validator.

Unfortunately, I don't have time to do this at the moment, but would appreciate if anyone else does!

rwalle61 avatar Aug 30 '21 14:08 rwalle61