diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs index 04418da5..a079631d 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs @@ -66,15 +66,17 @@ public static OpenApiRequestBody CreateRequestBody(this ODataContext context, IE Properties = new Dictionary() }; + bool allParamsNullable = true; foreach (var parameter in action.Parameters.Skip(skip)) { + allParamsNullable &= parameter.Type.IsNullable; parametersSchema.Properties.Add(parameter.Name, context.CreateEdmTypeSchema(parameter.Type)); } - OpenApiRequestBody requestBody = new OpenApiRequestBody + OpenApiRequestBody requestBody = new() { Description = "Action parameters", - Required = true, + Required = !allParamsNullable, Content = new Dictionary() }; diff --git a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj index e61a7d0f..ab383bf1 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -28,6 +28,7 @@ - Adds nullable to double schema conversions #581 - Updates tag names for actions/functions operations #585 - Creates unique operation ids for paths with composable overloaded functions #580 + - Sets request body required property to false when all action parameters are optional #582 Microsoft.OpenApi.OData.Reader ..\..\tool\Microsoft.OpenApi.OData.snk diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs index 6abc39ee..c1ca1a7d 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs @@ -36,6 +36,8 @@ public OpenApiRequestBodyGeneratorTest() var edmAction = new EdmAction("NS", "Checkout", boolType, true, actionEntitySetPath); edmAction.AddParameter(new EdmOperationParameter(edmAction, "bindingParameter", new EdmEntityTypeReference(customer, true))); edmAction.AddParameter("param", EdmCoreModel.Instance.GetString(true)); + edmAction.AddParameter("param2", EdmCoreModel.Instance.GetString(false)); + model.AddElement(edmAction); var actionImportEntitySetPath = new EdmPathExpression("Param1/Nav2"); @@ -89,9 +91,17 @@ public void CreateRequestBodyForActionImportReturnCorrectRequestBody() var schema = content.Value.Schema; Assert.Equal("object", schema.Type); Assert.NotNull(schema.Properties); - var parameter = Assert.Single(schema.Properties); - Assert.Equal("param", parameter.Key); - Assert.Equal("string", parameter.Value.Type); + + var parameters = schema.Properties; + Assert.Equal(2, parameters.Count); + + var parameter1 = parameters.First(p => p.Key == "param"); + Assert.Equal("param", parameter1.Key); + Assert.Equal("string", parameter1.Value.Type); + + var parameter2 = parameters.First(p => p.Key == "param2"); + Assert.Equal("param2", parameter2.Key); + Assert.Equal("string", parameter2.Value.Type); } [Fact] @@ -116,6 +126,9 @@ public void CanSerializeAsJsonFromTheCreatedRequestBody() ""param"": { ""type"": ""string"", ""nullable"": true + }, + ""param2"": { + ""type"": ""string"" } } } @@ -146,9 +159,17 @@ public void CreateRequestBodyForActionReturnCorrectRequestBody() var schema = content.Value.Schema; Assert.Equal("object", schema.Type); Assert.NotNull(schema.Properties); - var parameter = Assert.Single(schema.Properties); - Assert.Equal("param", parameter.Key); - Assert.Equal("string", parameter.Value.Type); + + var parameters = schema.Properties; + Assert.Equal(2, parameters.Count); + + var parameter1 = parameters.First(p => p.Key == "param"); + Assert.Equal("param", parameter1.Key); + Assert.Equal("string", parameter1.Value.Type); + + var parameter2 = parameters.First(p => p.Key == "param2"); + Assert.Equal("param2", parameter2.Key); + Assert.Equal("string", parameter2.Value.Type); } [Fact] diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json index dd93b464..436fa8a5 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json @@ -10943,7 +10943,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { @@ -15768,7 +15767,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { @@ -28333,7 +28331,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml index d36ed3de..2fae115d 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml @@ -7362,7 +7362,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: @@ -10613,7 +10612,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: @@ -19205,7 +19203,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json index 1e3f588e..60e8e250 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json @@ -12080,8 +12080,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { @@ -17516,8 +17515,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { @@ -31640,8 +31638,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml index 4d17cc15..42c1086a 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml @@ -8095,7 +8095,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success @@ -11734,7 +11733,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success @@ -21275,7 +21273,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success