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)); }
/// <summary> /// Initialize SwaggerGenerator configuration. /// Add OperationSecurityProcessors and SecurityDefinitionAppenders to the settings. /// </summary> static SwaggerConfiguration() { var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings(); SwaggerGeneratorSettings = settings; settings.Title = "Azure Functions Swagger example"; settings.Description = "This is an example generated Swagger JSON using NSwag.SwaggerGeneration.AzureFunctionsV2 and AzureFunctionsV2.HttpExtensions to " + "generate Swagger output directly from the assembly. <br/><br/>Credentials for testing:<br/><br/><b>OAuth2:</b> " + "\"[email protected]\" : \"foobar123---\", use client_id: \"XLjNBiBCx3_CZUAK3gagLSC_PPQjBDzB\"" + "<br/><b>Basic auth:</b> \"user\" : \"pass\" <br/> " + "<b>ApiKey:</b> \"key\"."; settings.OperationProcessors.Add(new OperationSecurityProcessor("Basic", SwaggerSecuritySchemeType.Basic)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Basic", new SwaggerSecurityScheme() { Type = SwaggerSecuritySchemeType.Basic, Scheme = "Basic", Description = "Basic auth" })); settings.OperationProcessors.Add(new OperationSecurityProcessor("ApiKey", SwaggerSecuritySchemeType.ApiKey, SwaggerSecurityApiKeyLocation.Header)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("ApiKey", new SwaggerSecurityScheme() { Type = SwaggerSecuritySchemeType.ApiKey, Name = "x-apikey", In = SwaggerSecurityApiKeyLocation.Header })); settings.OperationProcessors.Add(new OperationSecurityProcessor("Bearer", SwaggerSecuritySchemeType.OpenIdConnect)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Bearer", new SwaggerSecurityScheme() { Type = SwaggerSecuritySchemeType.OAuth2, Flow = SwaggerOAuth2Flow.Implicit, Flows = new OpenApiOAuthFlows() { Implicit = new OpenApiOAuthFlow() { AuthorizationUrl = "https://jusas-tests.eu.auth0.com/authorize", Scopes = new Dictionary <string, string>() { { "openid", "openid" }, { "profile", "profile" }, { "name", "name" } }, TokenUrl = "https://jusas-tests.eu.auth0.com/oauth/token" } }, Description = "Token" })); }
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 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_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_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_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_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_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_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_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_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_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_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_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"]); }
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 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); }
/// <summary> /// Initialize SwaggerGenerator configuration. /// Add OperationSecurityProcessors and SecurityDefinitionAppenders to the settings. /// </summary> static SwaggerConfiguration() { var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings(); SwaggerGeneratorSettings = settings; settings.Title = "Azure Functions Swagger example"; settings.Description = "This is an example generated Swagger JSON using NSwag.SwaggerGeneration.AzureFunctionsV2 and AzureFunctionsV2.HttpExtensions to " + "generate Swagger output directly from the assembly. <br/>Mostly the methods do nothing.<br/><br/>Credentials for testing:<br/><br/><b>OAuth2:</b> " + "\"[email protected]\" : \"foobar123---\", use client_id: \"XLjNBiBCx3_CZUAK3gagLSC_PPQjBDzB\"" + "<br/><b>Basic auth:</b> \"user\" : \"pass\" <br/> " + "<b>ApiKey:</b> \"key\"."; //settings.RoutePrefix = ""; settings.OperationProcessors.Add(new OperationSecurityProcessor("Bearer", OpenApiSecuritySchemeType.OpenIdConnect)); var scopes = new List <string>() { "openid", "profile", "name" }; settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Bearer", scopes, new OpenApiSecurityScheme() { Type = OpenApiSecuritySchemeType.OAuth2, Flow = OpenApiOAuth2Flow.Implicit, AuthorizationUrl = "https://jusas-tests.eu.auth0.com/authorize", Scopes = scopes.ToDictionary(x => x, x => x), TokenUrl = "https://jusas-tests.eu.auth0.com/oauth/token", Description = "Token" })); // The SecurityDefinitionAppender constructor is not actually obsolete, see // https://github.com/RicoSuter/NSwag/pull/2305 settings.OperationProcessors.Add(new OperationSecurityProcessor("Basic", OpenApiSecuritySchemeType.Basic)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Basic", new OpenApiSecurityScheme() { Type = OpenApiSecuritySchemeType.Basic, Scheme = "Basic", Description = "Basic auth" })); settings.OperationProcessors.Add(new OperationSecurityProcessor("HApiKey", OpenApiSecuritySchemeType.ApiKey, OpenApiSecurityApiKeyLocation.Header)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("HApiKey", new OpenApiSecurityScheme() { Type = OpenApiSecuritySchemeType.ApiKey, Name = "x-apikey", In = OpenApiSecurityApiKeyLocation.Header })); settings.OperationProcessors.Add(new OperationSecurityProcessor("QApiKey", OpenApiSecuritySchemeType.ApiKey, OpenApiSecurityApiKeyLocation.Query)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("QApiKey", new OpenApiSecurityScheme() { Type = OpenApiSecuritySchemeType.ApiKey, Name = "apikey", In = OpenApiSecurityApiKeyLocation.Query })); }
public OperationResponseProcessor(AzureFunctionsV2ToSwaggerGeneratorSettings settings) : base(settings) { }
public OperationParameterProcessor(AzureFunctionsV2ToSwaggerGeneratorSettings settings) { _settings = settings; }
/// <summary> /// Initialize SwaggerGenerator configuration. /// Add OperationSecurityProcessors and SecurityDefinitionAppenders to the settings. /// </summary> static SwaggerConfiguration() { var settings = new AzureFunctionsV2ToSwaggerGeneratorSettings(); SwaggerGeneratorSettings = settings; settings.SerializerSettings = new JsonSerializerSettings() { ContractResolver = new CamelCasePropertyNamesContractResolver() }; //settings.SchemaType = SchemaType.OpenApi3; // Consumes multipart/form-data does not work with this settings.Title = "SD2 Replays API"; settings.Description = "SD2 Replays API"; //settings.OperationProcessors.Add(new OperationSecurityProcessor("Bearer", // SwaggerSecuritySchemeType.OpenIdConnect)); //settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Bearer", new SwaggerSecurityScheme() //{ // Type = SwaggerSecuritySchemeType.OAuth2, // Flow = SwaggerOAuth2Flow.Implicit, // Flows = new OpenApiOAuthFlows() // { // Implicit = new OpenApiOAuthFlow() // { // AuthorizationUrl = "https://jusas-tests.eu.auth0.com/authorize", // Scopes = new Dictionary<string, string>() // {{"openid", "openid"}, {"profile", "profile"}, {"name", "name"}}, // TokenUrl = "https://jusas-tests.eu.auth0.com/oauth/token" // } // }, // Description = "Token" //})); settings.OperationProcessors.Add(new OperationSecurityProcessor("Basic", SwaggerSecuritySchemeType.Basic)); settings.DocumentProcessors.Add(new SecurityDefinitionAppender("Basic", new SwaggerSecurityScheme() { Type = SwaggerSecuritySchemeType.Basic, Scheme = "Basic", Description = "Basic auth" })); //settings.OperationProcessors.Add(new OperationSecurityProcessor("HApiKey", // SwaggerSecuritySchemeType.ApiKey, SwaggerSecurityApiKeyLocation.Header)); //settings.DocumentProcessors.Add(new SecurityDefinitionAppender("HApiKey", new SwaggerSecurityScheme() //{ // Type = SwaggerSecuritySchemeType.ApiKey, // Name = "x-apikey", // In = SwaggerSecurityApiKeyLocation.Header //})); //settings.OperationProcessors.Add(new OperationSecurityProcessor("QApiKey", // SwaggerSecuritySchemeType.ApiKey, SwaggerSecurityApiKeyLocation.Query)); //settings.DocumentProcessors.Add(new SecurityDefinitionAppender("QApiKey", new SwaggerSecurityScheme() //{ // Type = SwaggerSecuritySchemeType.ApiKey, // Name = "apikey", // In = SwaggerSecurityApiKeyLocation.Query //})); }