express-openapi-validator icon indicating copy to clipboard operation
express-openapi-validator copied to clipboard

the same oneOf schema can pass request validation. But cannot pass response validation

Open kennyma-eplus opened this issue 2 years ago • 0 comments

Here is my schema. You can see the request and response is the same

Here is my schema. You can see the request and response is the same
{
    "openapi": "3.0.3",
    "info": {
      "title": "test",
      "version": "1.0.0",
      "description": "test"
    },
    "paths": {
        "/ping": {
            "post": {
                "summary": "test",
                "description": "test",
                "x-eov-operation-handler": "ping",
                "x-eov-operation-id": "ping",
                "requestBody":{
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "properties": {
                                    "test": {
                                        "oneOf": [
                                            {
                                                "type": "object",
                                                "properties": {
                                                    "type": { "type": "string", "enum": ["requiredMessage"] },
                                                    "message": { "type": "string" }
                                                },
                                                "required": ["type", "message"],
                                                "additionalProperties": false
                                            },
                                            {
                                                "type": "object",
                                                "properties": {
                                                    "type": { "type": "string", "enum": ["requiredUrl"] },
                                                    "url": { "type": "string" }
                                                },
                                                "required": ["type", "url"],
                                                "additionalProperties": false
                                            }
                                        ]
                                    }      
                                },
                                "required": ["test"]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "test",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "test": {
                                            "oneOf": [
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "type": { "type": "string", "enum": ["requiredMessage"] },
                                                        "message": { "type": "string" }
                                                    },
                                                    "required": ["type", "message"],
                                                    "additionalProperties": false
                                                },
                                                {
                                                    "type": "object",
                                                    "properties": {
                                                        "type": { "type": "string", "enum": ["requiredUrl"] },
                                                        "url": { "type": "string" }
                                                    },
                                                    "required": ["type", "url"],
                                                    "additionalProperties": false
                                                }
                                            ]
                                        }      
                                    },
                                    "required": ["test"]
                                }
                            }
                        }
                    }
                }
            }
        }
    }
  }

the operation-handler just forward the request to response

const ping = (req, res) => {
    const { body } = req
    res.json(body)
}
module.exports = { ping }

Here is my payload:

{
    "test": {
        "type": "requiredUrl",
        "url": "url"
    }
}

request pass, but response cannot pass

Internal Server Error: /response/test must have required property 'message', /response/test/type must be equal to one of the allowed values: requiredMessage, /response/test must have required property 'url', /response/test must match exactly one schema in oneOf

kennyma-eplus avatar Nov 27 '23 04:11 kennyma-eplus