From ba54c1accb55dbed685907af0ef565fca8f42eb4 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sat, 7 Nov 2020 23:40:35 -0500 Subject: [PATCH] read required elements in composed models. --- .../parser/util/SwaggerDeserializer.java | 16 +++++++ .../io/swagger/parser/SwaggerParserTest.java | 14 ++++++ .../test/resources/allOf-example/allOf.yaml | 44 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 modules/swagger-parser/src/test/resources/allOf-example/allOf.yaml diff --git a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java index ec5a66e60f..eafc04cf75 100644 --- a/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java +++ b/modules/swagger-parser/src/main/java/io/swagger/parser/util/SwaggerDeserializer.java @@ -1022,6 +1022,22 @@ public Model allOfModel(ObjectNode node, String location, ParseResult result) { addProperties(location, node, result, model); + // need to set properties first + ArrayNode required = getArray("required", node, false, location, result); + if (required != null) { + List requiredProperties = new ArrayList(); + for (JsonNode n : required) { + if (n.getNodeType().equals(JsonNodeType.STRING)) { + requiredProperties.add(((TextNode) n).textValue()); + } else { + result.invalidType(location, "required", "string", n); + } + } + if (requiredProperties.size() > 0) { + model.setRequired(requiredProperties); + } + } + return model; } return null; diff --git a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java index d2610154b1..0398e42355 100644 --- a/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java +++ b/modules/swagger-parser/src/test/java/io/swagger/parser/SwaggerParserTest.java @@ -1658,4 +1658,18 @@ public void testIssuei432() { } + + @Test + public void testRequiredItemsInComposedModel() { + SwaggerDeserializationResult result = new SwaggerParser().readWithInfo("src/test/resources/allOf-example/allOf.yaml", null, true); + assertNotNull(result); + final Swagger swagger = result.getSwagger(); + final Model model = swagger.getDefinitions().get("UserRegister"); + final ComposedModel composedModel = (ComposedModel) model; + + assertNotNull(composedModel.getRequired()); + assertFalse(composedModel.getRequired().isEmpty()); + + assertEquals("password", composedModel.getRequired().get(0)); + } } diff --git a/modules/swagger-parser/src/test/resources/allOf-example/allOf.yaml b/modules/swagger-parser/src/test/resources/allOf-example/allOf.yaml new file mode 100644 index 0000000000..8443b1cee8 --- /dev/null +++ b/modules/swagger-parser/src/test/resources/allOf-example/allOf.yaml @@ -0,0 +1,44 @@ +swagger: '2.0' +info: + description: This is a simple API + version: 1.0.0 + title: Simple User API +host: localhost +basePath: /v1 +schemes: + - https + +paths: + /user: + post: + consumes: + - application/json + produces: + - application/jsonÅÅÅ + parameters: + - in: body + name: checkUser + description: Check user + schema: + $ref: '#/definitions/User' + responses: + 201: + description: item created + +definitions: + User: + type: object + required: + - email + properties: + email: + type: string + UserRegister: + allOf: + - $ref: '#/definitions/User' + type: object + required: + - password + properties: + password: + type: string