public async Task <string> GenerateSwagger()
        {
            var generator = new AzureFunctionsV2ToSwaggerGenerator(new AzureFunctionsV2ToSwaggerGeneratorSettings
            {
                Title = "H3 API",
            });

            var publicApis = AppDomain.CurrentDomain.GetAssemblies()
                             .SelectMany(assembly => assembly.GetTypes())
                             .Where(type => type.GetCustomAttributes(typeof(PublicApiAttribute), inherit: true).Length > 0);

            var document = await generator.GenerateForAzureFunctionClassesAsync(publicApis, functionNames : null);

            var swagger = JObject.Parse(document.ToJson());
            var paths   = (JObject)swagger["paths"];

            foreach (var property in paths.Properties().ToArray())
            {
                if (property.Name.StartsWith(AutoGeneratedPrefix))
                {
                    paths.Remove(property.Name);
                    paths.Add(property.Name.Substring(AutoGeneratedPrefix.Length), property.Value);
                }
            }

            return(swagger.ToString());
        }
示例#2
0
        public static async Task <IActionResult> Swagger(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
            HttpRequest req,
            ILogger log)
        {
            // swaggerUIの設定
            var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings();

            settings.Title = "TestNSwag";
            var generator = new AzureFunctionsV2ToSwaggerGenerator(settings);

            // UIに表示したいクラスを記載する
            var funcClasses = new[]
            {
                typeof(TestNSwag),
            };
            var document = await generator.GenerateForAzureFunctionClassesAsync(funcClasses, null);

            // Workaround for NSwag global security bug, see https://github.com/RicoSuter/NSwag/pull/2305
            document.Security.Clear();

            var json = document.ToJson();

            return(new OkObjectResult(json));
        }
示例#3
0
        public async Task Should_find_nonstatic_function_classes()
        {
            // Arrange

            // Act
            var azureFuncClasses = AzureFunctionsV2ToSwaggerGenerator.GetAzureFunctionClasses(typeof(NonStaticFunctionClass).Assembly);

            // Assert
            azureFuncClasses.Should().Contain(x => x.Name == nameof(NonStaticFunctionClass));
        }
示例#4
0
        public static async Task <IActionResult> Swagger(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger")]
            HttpRequest req,
            ILogger log)
        {
            var generator  = new AzureFunctionsV2ToSwaggerGenerator(SwaggerConfiguration.SwaggerGeneratorSettings);
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAsync(typeof(HttpExtensionFunctions));

            var json = swaggerDoc.ToJson();

            return(new OkObjectResult(json));
        }
示例#5
0
        public async Task Should_include_nonstatic_function_classes_and_methods()
        {
            // Arrange
            var settings  = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator = new AzureFunctionsV2ToSwaggerGenerator(settings);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassesAsync(
                new[] { typeof(NonStaticFunctionClass), typeof(IgnoredNonStaticFunctionClass) }, null);

            // Assert
            swaggerDoc.Operations.Count().Should().Be(1);
        }
示例#6
0
文件: Swagger.cs 项目: Jusas/sd2
        public static async Task <SwaggerDocument> GenerateSwaggerDocument()
        {
            var generator   = new AzureFunctionsV2ToSwaggerGenerator(SwaggerConfiguration.SwaggerGeneratorSettings);
            var funcClasses = new[]
            {
                typeof(Replays),
                typeof(Maps),
                typeof(Players)
            };
            var document = await generator.GenerateForAzureFunctionClassesAsync(funcClasses, null);

            return(document);
        }
        public async Task Should_not_limit_to_HttpRequest_class_in_discovery()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerFunctionWithNonHttpRequestParam);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            swaggerDoc.Operations.Count().Should().Be(1);
        }
        public async Task Should_ignore_OpenApiIgnore_attributed_function()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerIgnoredFunction2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            swaggerDoc.Operations.Count().Should().Be(0);
        }
        public async Task Should_have_body_type_automatically_discovered_from_custom_post_request_body_type()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerFunctionWithNonHttpRequestParam);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            swaggerDoc.Operations.Count().Should().Be(1);
            swaggerDoc.Operations.First().Operation.RequestBody.Name.Should().Be("req");
        }
        public async Task Should_include_security_spec_in_SwaggerDocument_from_authorize_attribute_with_defaults()
        {
            // Arrange
            var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings();

            settings.OperationProcessors.Add(new OperationSecurityProcessor("Basic", OpenApiSecuritySchemeType.Basic));
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerAuthorizeAttribute1);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            Assert.Equal(1, swaggerDoc.Operations.First().Operation.ActualSecurity.Count);
        }
        public static async Task <IActionResult> Swagger(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger")]
            HttpRequest req,
            ILogger log)
        {
            var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings()
            {
                Title       = "My Function App Swagger",
                Description = "Here be dragons!",
                Version     = "1.0"
            };
            var generator  = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAsync(typeof(ExampleFunctions));

            var json = swaggerDoc.ToJson();

            return(new OkObjectResult(json));
        }
示例#12
0
        public async Task Should_include_form_field_of_type_Dog_that_is_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionTests.HttpExtensionsForm2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].IsRequired.Should().Be(true);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.FormData);
            operation.ActualParameters[0].ActualSchema.Should().Be(swaggerDoc.Definitions["Dog"]);
        }
示例#13
0
        public async Task Should_include_body_of_type_XmlDocument_and_consume_xml()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionTests.HttpExtensionsBody4);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Body);
            operation.ActualParameters[0].Schema.Type.Should().Be(JsonObjectType.String);
            operation.ActualConsumes.Should().Contain("application/xml");
        }
示例#14
0
        public async Task Should_include_body_of_type_string_that_is_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionTests.HttpExtensionsBody2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].IsRequired.Should().Be(true);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Body);
            operation.ActualParameters[0].Schema.Type.Should().Be(JsonObjectType.String);
        }
        public async Task Should_include_security_spec_in_SwaggerDocument_from_authorize_attribute_with_scheme_apikey_in_query()
        {
            // Arrange
            var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings();

            settings.OperationProcessors.Add(new OperationSecurityProcessor("QApiKey", OpenApiSecuritySchemeType.ApiKey, OpenApiSecurityApiKeyLocation.Query));
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerAuthorizeAttribute3);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            Assert.Equal(1, operation.ActualSecurity.Count);
            operation.ActualSecurity.First().Should().ContainKey("QApiKey");
        }
示例#16
0
        public async Task Should_create_authorized_operation_from_HttpAuthorizeAttribute_inheriting_attributed_function()
        {
            // Arrange
            var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings();

            settings.OperationProcessors.Add(new OperationSecurityProcessor("Bearer", OpenApiSecuritySchemeType.OAuth2));
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionTests.HttpExtensionsJwtAuth2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(0); // HttpUser is not a HttpParam
            operation.Security.Count.Should().Be(1);
            operation.Security.First().Keys.Count.Should().Be(1);
        }
        public async Task Should_include_required_formdata_field_with_type_string()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerFormDataAttribute1);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Description.Should().Be("description");
            operation.ActualParameters[0].Name.Should().Be("formField1");
            operation.ActualParameters[0].IsRequired.Should().Be(true);
            operation.ActualParameters[0].Type.Should().Be(NJsonSchema.JsonObjectType.String);
        }
示例#18
0
        public async Task Should_include_queryparam_of_type_Dog_that_is_not_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionTests.HttpExtensionsQueryParams3);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Name.Should().Be("queryParam");
            operation.ActualParameters[0].IsRequired.Should().Be(false);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Query);
            operation.ActualParameters[0].Type.Should().Be(JsonObjectType.Object);
            operation.ActualParameters[0].ActualSchema.Should().Be(swaggerDoc.Definitions["Dog"]);
        }
        public async Task Should_include_header_of_type_string_that_is_not_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerRequestHeaderAttribute1);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Description.Should().Be("description");
            operation.ActualParameters[0].Name.Should().Be("x-header");
            operation.ActualParameters[0].IsRequired.Should().Be(false);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Header);
            operation.ActualParameters[0].Type.Should().Be(JsonObjectType.String);
        }
        public async Task Should_include_query_param_with_int_Type_not_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerQueryParamAttribute2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Description.Should().Be("Yet another description");
            operation.ActualParameters[0].Name.Should().Be("queryParam");
            operation.ActualParameters[0].IsRequired.Should().Be(false);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Query);
            operation.ActualParameters[0].Type.Should().Be(NJsonSchema.JsonObjectType.Integer);
        }
        public async Task Should_include_two_route_params_from_function_signature()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(HttpExtensionsTestApp.RouteParamTests.RouteParamTest);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(HttpExtensionsTestApp.RouteParamTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(2);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Path);
            operation.ActualParameters[1].Kind.Should().Be(OpenApiParameterKind.Path);
            operation.ActualParameters[0].IsRequired.Should().Be(true);
            operation.ActualParameters[1].IsRequired.Should().Be(true);
            operation.ActualParameters[0].Type.Should().Be(JsonObjectType.Integer);
            operation.ActualParameters[1].Type.Should().Be(JsonObjectType.String);
        }
示例#22
0
        public static async Task <IActionResult> Swagger(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)]
            HttpRequest req,
            ILogger log)
        {
            var generator   = new AzureFunctionsV2ToSwaggerGenerator(SwaggerConfiguration.SwaggerGeneratorSettings);
            var funcClasses = new[]
            {
                typeof(SwaggerEndpoints),
                typeof(GenerationAnnotationTests),
                typeof(HttpExtensionTests),
                typeof(RouteParamTests)
            };
            var document = await generator.GenerateForAzureFunctionClassesAsync(funcClasses, null);

            // Workaround for NSwag global security bug, see https://github.com/RicoSuter/NSwag/pull/2305
            document.Security.Clear();

            var json = document.ToJson();

            return(new OkObjectResult(json));
        }
        public async Task Should_include_formdatafile_field_with_multifile()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerFormDataFileAttribute2);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Description.Should().Be("description");
            operation.ActualParameters[0].Name.Should().Be("files");
            operation.ActualParameters[0].IsRequired.Should().Be(false);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.FormData);
            operation.ActualParameters[0].Type.Should().Be(NJsonSchema.JsonObjectType.File);
            operation.ActualParameters[0].CollectionFormat.Should().Be(OpenApiParameterCollectionFormat.Multi);
        }
        public async Task Should_include_body_of_type_Person_that_is_required()
        {
            // Arrange
            var settings     = new AzureFunctionsV2ToSwaggerGeneratorSettings();
            var generator    = new AzureFunctionsV2ToSwaggerGenerator(settings);
            var functionName = nameof(GenerationAnnotationTests.SwaggerRequestBodyTypeAttribute1);

            // Act
            var swaggerDoc = await generator.GenerateForAzureFunctionClassAndSpecificMethodsAsync(
                typeof(GenerationAnnotationTests), new List <string>() { functionName });

            // Assert
            var operation = swaggerDoc.Operations.First().Operation;

            operation.ActualParameters.Count.Should().Be(1);
            operation.ActualParameters[0].Description.Should().Be("description");
            operation.ActualParameters[0].Name.Should().Be("Body");
            operation.ActualParameters[0].IsRequired.Should().Be(true);
            operation.ActualParameters[0].Kind.Should().Be(OpenApiParameterKind.Body);
            operation.ActualParameters[0].ActualSchema.Type.Should().Be(JsonObjectType.Object);
            operation.ActualParameters[0].ActualSchema.Should().Be(swaggerDoc.Definitions["Person"]);
        }