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()); }
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)); }
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)); }
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)); }
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); }
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)); }
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"]); }
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"); }
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"); }
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); }
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); }
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"]); }