diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs index 1159455e..1ee020cd 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiResponseGenerator.cs @@ -208,8 +208,15 @@ public static OpenApiResponses CreateResponses(this ODataContext context, IEdmOp responses.Add(Constants.StatusCode200, response); } - // Both action & function have the default response. - responses.Add(Constants.StatusCodeDefault, Constants.StatusCodeDefault.GetResponse()); + if (context.Settings.ErrorResponsesAsDefault) + { + responses.Add(Constants.StatusCodeDefault, Constants.StatusCodeDefault.GetResponse()); + } + else + { + responses.Add(Constants.StatusCodeClass4XX, Constants.StatusCodeClass4XX.GetResponse()); + responses.Add(Constants.StatusCodeClass5XX, Constants.StatusCodeClass5XX.GetResponse()); + } return responses; } 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 9977ac1b..9794c15e 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -24,6 +24,7 @@ - Adds list of all derived types for discriminator mapping #219 - Fixes reading restriction annotations for entity types defining navigation properties #220 - Enables configuring appending bound operations on derived types #221 +- Add error ranges for OData actions when ErrorResponsesAsDefault is set to false #218 Microsoft.OpenApi.OData.Reader ..\..\tool\Microsoft.OpenApi.OData.snk diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs index ed67c1a7..f4a761a4 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiErrorSchemaGeneraratorTests.cs @@ -9,7 +9,7 @@ using Xunit; namespace Microsoft.OpenApi.OData.Tests; -public class OpenApiErrorSchemaGeneraratorTests +public class OpenApiErrorSchemaGeneratorTests { [Fact] public void AddsEmptyInnerErrorWhenNoComplexTypeIsProvided() diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiResponseGeneratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiResponseGeneratorTests.cs index 5b714504..0b73f15a 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiResponseGeneratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiResponseGeneratorTests.cs @@ -306,5 +306,39 @@ public void CreateResponseForEdmActionReturnCorrectResponses(string actionName, Assert.Equal(2, responses.Count); Assert.Equal(new string[] { responseCode, "default" }, responses.Select(r => r.Key)); } + + [Theory] + [InlineData("assignLicense", false, "200")] + [InlineData("activateService", false, "204")] + [InlineData("verifySignature", true, "200")] + public void CreateResponseForEdmActionWhenErrorResponsesAsDefaultIsSet(string actionName, bool errorAsDefault, string responseCode) + { + // Arrange + IEdmModel model = EdmModelHelper.GraphBetaModel; + var settings = new OpenApiConvertSettings + { + ErrorResponsesAsDefault = errorAsDefault, + }; + ODataContext context = new ODataContext(model, settings); + + // Act + OpenApiResponses responses; + IEdmOperation operation = model.SchemaElements.OfType().First(o => o.Name == actionName); + Assert.NotNull(operation); // guard + ODataPath path = new(new ODataOperationSegment(operation)); + responses = context.CreateResponses(operation, path); + + // Assert + Assert.NotNull(responses); + Assert.NotEmpty(responses); + if (errorAsDefault) + { + Assert.Equal(new string[] { responseCode, "default" }, responses.Select(r => r.Key)); + } + else + { + Assert.Equal(new string[] { responseCode, "4XX", "5XX" }, responses.Select(r => r.Key)); + } + } } }