public void CreateResponseForEdmActionReturnCorrectResponses(string actionName, bool isActionImport)
        {
            // Arrange
            IEdmModel    model   = EdmModelHelper.TripServiceModel;
            ODataContext context = new ODataContext(model);

            // Act
            OpenApiResponses responses;

            if (isActionImport)
            {
                IEdmOperationImport operationImport = model.EntityContainer.OperationImports().First(o => o.Name == actionName);
                Assert.NotNull(operationImport); // guard
                responses = context.CreateResponses(operationImport);
            }
            else
            {
                IEdmOperation operation = model.SchemaElements.OfType <IEdmOperation>().First(o => o.Name == actionName);
                Assert.NotNull(operation); // guard
                responses = context.CreateResponses(operation);
            }

            // Assert
            Assert.NotNull(responses);
            Assert.NotEmpty(responses);
            Assert.Equal(2, responses.Count);
            Assert.Equal(new string[] { "204", "default" }, responses.Select(r => r.Key));
        }
        public void CreateResponseForEdmFunctionReturnCorrectResponses(bool isFunctionImport, OpenApiSpecVersion specVersion)
        {
            // Arrange
            string       operationName = "GetPersonWithMostFriends";
            IEdmModel    model         = EdmModelHelper.TripServiceModel;
            ODataContext context       = new ODataContext(model);

            context.Settings.OpenApiSpecVersion = specVersion;

            // Act
            OpenApiResponses responses;

            if (isFunctionImport)
            {
                IEdmOperationImport operationImport = model.EntityContainer.OperationImports().First(o => o.Name == operationName);
                Assert.NotNull(operationImport); // guard
                responses = context.CreateResponses(operationImport);
            }
            else
            {
                IEdmOperation operation = model.SchemaElements.OfType <IEdmOperation>().First(o => o.Name == operationName);
                Assert.NotNull(operation); // guard
                responses = context.CreateResponses(operation);
            }

            // Assert
            Assert.NotNull(responses);
            Assert.NotEmpty(responses);
            Assert.Equal(2, responses.Count);
            Assert.Equal(new string[] { "200", "default" }, responses.Select(r => r.Key));

            OpenApiResponse response = responses["200"];

            Assert.NotNull(response.Content);
            OpenApiMediaType mediaType = response.Content["application/json"];

            // For either version, nullable should be set
            // and the serializer will ignore for v2
            Assert.True(mediaType.Schema.Nullable);

            // openApi version 2 should have not use nullable
            if (specVersion == OpenApiSpecVersion.OpenApi2_0)
            {
                Assert.NotNull(mediaType.Schema);
                Assert.Null(mediaType.Schema.AnyOf);
                Assert.NotNull(mediaType.Schema.Reference);
                Assert.Equal("Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person", mediaType.Schema.Reference.Id);
            }
            else
            {
                Assert.NotNull(mediaType.Schema);
                Assert.Null(mediaType.Schema.Reference);
                Assert.NotNull(mediaType.Schema.AnyOf);
                var anyOf = Assert.Single(mediaType.Schema.AnyOf);
                Assert.Equal("Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person", anyOf.Reference.Id);
            }
        }
        /// <summary>
        /// Create the <see cref="OpenApiResponses"/> for a <see cref="IEdmOperationImport"/>
        /// </summary>
        /// <param name="context">The OData context.</param>
        /// <param name="operationImport">The Edm operation import.</param>
        /// <returns>The created <see cref="OpenApiResponses"/>.</returns>
        public static OpenApiResponses CreateResponses(this ODataContext context, IEdmOperationImport operationImport)
        {
            Utils.CheckArgumentNull(context, nameof(context));
            Utils.CheckArgumentNull(operationImport, nameof(operationImport));

            return(context.CreateResponses(operationImport.Operation));
        }
Exemple #4
0
        public void CanSerializeAsJsonFromTheCreatedResponses()
        {
            // Arrange
            IEdmModel    model   = EdmCoreModel.Instance;
            ODataContext context = new ODataContext(model);

            // Act
            var responses = context.CreateResponses();

            // Assert
            var response = responses["error"];

            Assert.NotNull(response);
            string json = response.SerializeAsJson(OpenApiSpecVersion.OpenApi3_0);

            Assert.Equal(@"{
  ""description"": ""error"",
  ""content"": {
    ""application/json"": {
      ""schema"": {
        ""$ref"": ""#/components/schemas/ODataErrors.ODataError""
      }
    }
  }
}".ChangeLineBreaks(), json);
        }
Exemple #5
0
        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 <IEdmOperation>().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));
            }
        }
        public void CreateResponsesThrowArgumentNullContext()
        {
            // Arrange
            ODataContext context = null;

            // Act & Assert
            Assert.Throws <ArgumentNullException>("context", () => context.CreateResponses());
        }
        public void CreateResponseForOperationThrowArgumentNullOperation()
        {
            // Arrange
            ODataContext context = new ODataContext(EdmCoreModel.Instance);

            // Act & Assert
            Assert.Throws <ArgumentNullException>("operation", () => context.CreateResponses(operation: null));
        }
Exemple #8
0
        public void CreateResponseForOperationThrowArgumentNullContext()
        {
            // Arrange
            ODataContext context = null;

            // Act & Assert
            Assert.Throws <ArgumentNullException>("context", () => context.CreateResponses(operation: null, path: null));
        }
Exemple #9
0
        public void CreateResponseForOperationThrowArgumentNullPath()
        {
            // Arrange
            ODataContext      context        = new ODataContext(EdmCoreModel.Instance);
            EdmFunction       function       = new EdmFunction("NS", "MyFunction", EdmCoreModel.Instance.GetString(false));
            EdmFunctionImport functionImport = new EdmFunctionImport(new EdmEntityContainer("NS", "Default"), "MyFunctionImport", function);

            // Act & Assert
            Assert.Throws <ArgumentNullException>("path", () => context.CreateResponses(operation: function, path: null));
        }
        public void CreateResponsesReturnsCreatedResponses()
        {
            // Arrange
            IEdmModel    model   = EdmCoreModel.Instance;
            ODataContext context = new ODataContext(model);

            // Act
            var responses = context.CreateResponses();

            // Assert
            Assert.NotNull(responses);
            Assert.NotEmpty(responses);
            var response = Assert.Single(responses);

            Assert.Equal("error", response.Key);
            Assert.NotNull(response.Value.Content);
            Assert.Single(response.Value.Content);
            Assert.Equal("application/json", response.Value.Content.First().Key);
        }
        /// <summary>
        /// Create a <see cref="OpenApiComponents"/>.
        /// The value of components is a Components Object.
        /// It holds maps of reusable schemas describing message bodies, operation parameters, and responses.
        /// </summary>
        /// <param name="context">The OData to Open API context.</param>
        /// <returns>The created <see cref="OpenApiComponents"/> object.</returns>
        public static OpenApiComponents CreateComponents(this ODataContext context)
        {
            Utils.CheckArgumentNull(context, nameof(context));

            // "components": {
            //   "schemas": …,
            //   "parameters": …,
            //   "responses": …,
            //   "requestBodies": …
            //  }
            return(new OpenApiComponents
            {
                // The value of schemas is a map of Schema Objects.
                // Each entity type, complex type, enumeration type, and type definition directly
                // or indirectly used in the paths field is represented as a name/value pair of the schemas map.
                Schemas = context.CreateSchemas(),

                // The value of parameters is a map of Parameter Objects.
                // It allows defining query options and headers that can be reused across operations of the service.
                Parameters = context.CreateParameters(),

                // The value of responses is a map of Response Objects.
                // It allows defining responses that can be reused across operations of the service.
                Responses = context.CreateResponses(),

                // The value of requestBodies is a map of RequestBody Objects.
                // It allows refining request bodies that can be reused across operations of the service.
                RequestBodies = context.CreateRequestBodies(),

                Examples = context.CreateExamples(),

                SecuritySchemes = context.CreateSecuritySchemes(),

                // Make others as null.
                Links = null,

                Callbacks = null,

                Extensions = null
            });
        }