private static void InitializeOpenApiDocumentOptions(AspNetCoreOpenApiDocumentGeneratorSettings options, string version)
        {
            options.DocumentName  = version;
            options.Title         = $"Elastic demo API {version}";
            options.ApiGroupNames = new[] { version };

            options.Description = "Elastic demo API";
            options.IgnoreObsoleteProperties = true;
        }
        /// <summary>Configure SwaggerDocument.</summary>
        /// <param name="settings"><see cref="AspNetCoreOpenApiDocumentGeneratorSettings"/></param>
        /// <param name="services"><see cref="IServiceProvider"/></param>
        protected virtual void ConfigureOpenApiDocument(AspNetCoreOpenApiDocumentGeneratorSettings settings, IServiceProvider services)
        {
            var informationalVersion = _assembly.GetCustomAttribute <AssemblyInformationalVersionAttribute>()
                                       .InformationalVersion;

            settings.Version     = informationalVersion;
            settings.Description = ApiInfo.Description;
            settings.Title       = ApiInfo.DisplayName;
            settings.PostProcess = PostProcess;
            settings.SchemaType  = SchemaType.OpenApi3;
        }
Example #3
0
        public override void Apply(AspNetCoreOpenApiDocumentGeneratorSettings document)
        {
            var _in = EnumEx.Parse <OpenApiSecurityApiKeyLocation>(this?.Location.ToString());

            document.AddSecurity(this?.SecurityName ?? SwaggerNSwagExtensions.DefaultSecurityName /*, new[] { "skoruba_identity_admin_api" }*/, new NSwag.OpenApiSecurityScheme
            {
                Description = this?.Description,
                Name        = this?.Name,
                Type        = NSwag.OpenApiSecuritySchemeType.Basic
            });
        }
Example #4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="configure"></param>
        internal static void AddJWTSecurity(this AspNetCoreOpenApiDocumentGeneratorSettings configure)
        {
            configure.AddSecurity("JWT", Enumerable.Empty <string>(), new OpenApiSecurityScheme
            {
                Type        = OpenApiSecuritySchemeType.ApiKey,
                Name        = "Authorization",
                In          = OpenApiSecurityApiKeyLocation.Header,
                Description = "Type into the textbox: Bearer {your JWT token}."
            });

            configure.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("JWT"));
        }
Example #5
0
        public async Task When_complex_body_parameter_has_default_value_then_it_is_optional()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController));

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredComplexWithDefault").Operation;

            Assert.True(operation.ActualParameters.First().IsRequired);
        }
 /// <summary>
 /// Установить параметры swagger
 /// </summary>
 public static void ConfigSwagger(AspNetCoreOpenApiDocumentGeneratorSettings config) =>
 config.PostProcess = document =>
 {
     document.Info.Version     = "v1";
     document.Info.Title       = "Boutique API";
     document.Info.Description = "Clothes Web Api for VeraBoutique store";
     document.Info.Contact     = new NSwag.OpenApiContact
     {
         Name  = "Ivan Rubilnik",
         Email = "*****@*****.**",
         Url   = "https://github.com/rubilnik4/VeraBoutique"
     };
 };
Example #7
0
        public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_required()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(ActualController));

            var json = document.ToJson();

            // Assert
            Assert.True(document.Operations.Any());
        }
Example #8
0
        protected async Task <OpenApiDocument> GenerateDocumentAsync(AspNetCoreOpenApiDocumentGeneratorSettings settings, params Type[] controllerTypes)
        {
            var generator = new AspNetCoreOpenApiDocumentGenerator(settings);
            var provider  = TestServer.Host.Services.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            var controllerTypeNames = controllerTypes.Select(t => t.FullName);
            var groups = new ApiDescriptionGroupCollection(provider.ApiDescriptionGroups.Items
                                                           .Select(i => new ApiDescriptionGroup(i.GroupName, i.Items.Where(u => controllerTypeNames.Contains(((ControllerActionDescriptor)u.ActionDescriptor).ControllerTypeInfo.FullName)).ToList())).ToList(),
                                                           provider.ApiDescriptionGroups.Version);

            var document = await generator.GenerateAsync(groups);

            return(document);
        }
Example #9
0
        public async Task When_operation_has_SwaggerResponseAttribute_with_description_it_is_in_the_spec()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(XmlDocsController));

            var json = document.ToJson();

            // Assert
            Assert.Contains("My response.", json);
            Assert.Contains("My property.", json);
        }
Example #10
0
        public async Task When_controller_has_extension_data_attributes_then_they_are_processed()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(SwaggerExtensionDataController));

            // Assert
            Assert.Equal(2, document.ExtensionData.Count);

            Assert.Equal("b", document.ExtensionData["a"]);
            Assert.Equal("y", document.ExtensionData["x"]);
        }
Example #11
0
        public async Task When_route_is_empty_then_path_is_slash()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(EmptyPathController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "EmptyPath_Get");

            Assert.Equal("/", operation.Path);
        }
Example #12
0
        public async Task When_operation_has_SwaggerResponseAttribute_with_description_it_is_in_the_spec()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(ResponsesController));

            var json = document.ToJson();

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

            Assert.Equal("Foo.", operation.ActualResponses.First().Value.Description);
        }
Example #13
0
        public async Task When_route_is_not_empty_then_path_starts_with_slash()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredPrimitive");

            Assert.StartsWith("/", operation.Path);
        }
Example #14
0
        public async Task When_model_binder_parameter_is_used_on_path_parameter_then_parameter_kind_is_path()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                RequireParametersWithoutDefault = true
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(PathParameterWithModelBinderController));

            // Assert
            var kind = document.Operations.First().Operation.Parameters.First().Kind;

            Assert.Equal(OpenApiParameterKind.Path, kind);
        }
Example #15
0
        public async Task When_parameter_is_overwritten_then_original_name_is_set()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                RequireParametersWithoutDefault = false
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(RenamedQueryParameterController));

            // Assert
            var parameter = document.Operations.First().Operation.ActualParameters.First();

            Assert.Equal("month", parameter.Name);
            Assert.Equal("months", parameter.OriginalName);
        }
Example #16
0
        public async Task When_consumes_is_defined_on_all_operations_then_it_is_added_to_the_document()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(ConsumesController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "Consumes_ConsumesOnOperation").Operation;

            Assert.Contains("text/html", document.Consumes);
            Assert.Contains("text/html", operation.ActualConsumes);
        }
Example #17
0
        public async Task WhenOperationHasFormDataFile_ThenItIsInRequestBody()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                SchemaType = SchemaType.OpenApi3
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(FileUploadController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "FileUpload_UploadFile").Operation;
            var schema    = operation.RequestBody.Content["multipart/form-data"].Schema;

            Assert.Equal("binary", schema.Properties["file"].Format);
            Assert.Equal(JsonObjectType.String, schema.Properties["file"].Type);
            Assert.Equal(JsonObjectType.String, schema.Properties["test"].Type);

            Assert.Contains(@"    ""/api/FileUpload/UploadFiles"": {
      ""post"": {
        ""tags"": [
          ""FileUpload""
        ],
        ""operationId"": ""FileUpload_UploadFiles"",
        ""requestBody"": {
          ""content"": {
            ""multipart/form-data"": {
              ""schema"": {
                ""properties"": {
                  ""files"": {
                    ""type"": ""array"",
                    ""items"": {
                      ""type"": ""string"",
                      ""format"": ""binary""
                    }
                  },
                  ""test"": {
                    ""type"": ""string""
                  }
                }
              }
            }
          }
        },", json);
        }
Example #18
0
        public async Task When_handling_is_Null_then_response_is_nullable()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings
            {
                SchemaType = SchemaType.OpenApi3,
                DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.Null
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(ResponsesController));

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

            Assert.True(operation.ActualResponses.First().Value.Schema.IsNullable(SchemaType.OpenApi3));
        }
Example #19
0
        public async Task When_complex_query_parameters_are_nullable_and_set_to_null_they_are_optional_in_spec()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                RequireParametersWithoutDefault = true
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(HeaderParametersController));

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

            Assert.Equal(2, operation.ActualParameters.Count);
            Assert.True(operation.ActualParameters.First().IsRequired);
            Assert.False(operation.ActualParameters.Last().IsRequired);
        }
Example #20
0
        public async Task When_api_version_parameter_should_be_ignored_then_it_is_ignored()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            settings.ApiGroupNames = new[] { "1" };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(VersionedValuesController), typeof(VersionedV3ValuesController));

            var json = document.ToJson();

            // Assert
            var operations = document.Operations;

            Assert.True(operations.All(o => o.Operation.ActualParameters.All(p => p.Name != "api-version")));
        }
Example #21
0
        public async Task When_nullable_xml_docs_is_not_set_then_default_setting_NotNull_is_used()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings
            {
                SchemaType = SchemaType.OpenApi3,
                DefaultResponseReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(NullableResponseController));

            // Assert
            var operation = document.Operations.First(o => o.Path.Contains(nameof(NullableResponseController.OperationWithNoXmlDocs))).Operation;

            Assert.False(operation.ActualResponses.First().Value.Schema.IsNullable(SchemaType.OpenApi3));
        }
Example #22
0
        public async Task When_operation_has_extension_data_attributes_then_they_are_processed()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(SwaggerExtensionDataController));

            // Assert
            var extensionData = document.Operations.First().Operation.ExtensionData;

            Assert.Equal(2, extensionData.Count);

            Assert.Equal("b", document.Operations.First().Operation.ExtensionData["a"]);
            Assert.Equal("y", document.Operations.First().Operation.ExtensionData["x"]);
            Assert.Equal("foo", document.Operations.First().Operation.Parameters.First().Name);
            Assert.Equal("d", document.Operations.First().Operation.Parameters.First().ExtensionData["c"]);
        }
Example #23
0
        public async Task When_simple_query_parameter_has_BindRequiredAttribute_then_it_is_required()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                RequireParametersWithoutDefault = false
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(SimpleQueryParametersController));

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

            Assert.Equal(3, operation.ActualParameters.Count);
            Assert.False(operation.ActualParameters.Skip(0).First().IsRequired);
            Assert.False(operation.ActualParameters.Skip(1).First().IsRequired);
            Assert.True(operation.ActualParameters.Skip(2).First().IsRequired);
        }
Example #24
0
 private void ConfigureOpenApiDocument(IConfiguration configuration, AspNetCoreOpenApiDocumentGeneratorSettings settings)
 {
     settings.DocumentName = "v1";
     settings.Version      = "v1";
     settings.Title        = this.GetType().Namespace;
     settings.AddSecurity(
         "bearer",
         Enumerable.Empty <string>(),
         new OpenApiSecurityScheme
     {
         Type        = OpenApiSecuritySchemeType.OAuth2,
         Flow        = OpenApiOAuth2Flow.Implicit,
         Description = "Oidc Authentication",
         Flows       = new OpenApiOAuthFlows
         {
             Implicit = new OpenApiOAuthFlow
             {
                 AuthorizationUrl = $"{configuration["Oidc:Authority"]}/protocol/openid-connect/auth",
                 TokenUrl         = $"{configuration["Oidc:Authority"]}/protocol/openid-connect/token",
                 Scopes           = new Dictionary <string, string>
                 {
                     //{"openid", "openid"},
                 }
             }
         },
     });
     settings.OperationProcessors.Add(new ApiVersionProcessor());
     settings.OperationProcessors.Add(new AspNetCoreOperationSecurityScopeProcessor("bearer"));
     settings.OperationProcessors.Add(new AuthorizationOperationProcessor("bearer"));
     settings.PostProcess = document =>
     {
         document.Info.Version        = "v1";
         document.Info.Title          = this.GetType().Namespace;
         document.Info.Description    = "Weather API";
         document.Info.TermsOfService = "http://www.weather.com";
         document.Info.Contact        = new OpenApiContact
         {
             Name  = "John Doe",
             Email = "*****@*****.**",
             Url   = "http://www.weather.com"
         };
     };
 }
Example #25
0
        public async Task When_generating_versioned_controllers_then_version_path_parameter_is_not_present()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
            };

            settings.ApiGroupNames = new[] { "3" };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(VersionedValuesController), typeof(VersionedV3ValuesController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First();

            // check that implict unused path parameter is not in the spec
            Assert.DoesNotContain(operation.Operation.ActualParameters, p => p.Name == "version");
        }
Example #26
0
        public async Task When_parameter_has_default_and_schema_type_is_OpenApi3_then_schema_default_is_set()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings
            {
                SchemaType = SchemaType.OpenApi3,
                RequireParametersWithoutDefault = true
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(DefaultParametersController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Path.Contains(nameof(DefaultParametersController.WithDefault))).Operation;

            Assert.Equal(5, operation.Parameters.First().Schema.Default);
        }
Example #27
0
        public async Task When_generating_v3_then_only_v3_operations_are_included()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings();

            settings.ApiGroupNames = new[] { "3" };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(VersionedValuesController), typeof(VersionedV3ValuesController));

            // Assert
            var operations = document.Operations;

            Assert.Equal(5, operations.Count());
            Assert.True(operations.All(o => o.Path.Contains("/v3/")));

            // VersionedIgnoredValues tag should not be in json document
            Assert.Equal(1, document.Tags.Count);
        }
 private static void InitAspNetCoreOpenApiDocumentGeneratorSettings(AspNetCoreOpenApiDocumentGeneratorSettings config, string documentName, IList <string> apiGroupNames, string documentVersion)
 {
     config.DocumentName  = documentName;
     config.ApiGroupNames = apiGroupNames.ToArray();
     config.PostProcess   = document =>
     {
         InitDocumentInfo(document, documentVersion);
     };
     config.OperationProcessors.Add(new OperationSecurityScopeProcessor("JWT"));
     config.DocumentProcessors.Add(
         new SecurityDefinitionAppender("JWT", new OpenApiSecurityScheme
     {
         Type        = OpenApiSecuritySchemeType.ApiKey,
         Name        = "Authorization",
         Description = "Bearer [Token]",
         In          = OpenApiSecurityApiKeyLocation.Header
     })
         );
 }
Example #29
0
        public async Task When_OpenApiBodyParameter_is_applied_with_JSON_then_request_body_is_any_type()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                SchemaType = SchemaType.OpenApi3
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(PostBodyController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "PostBody_JsonPostBodyOperation").Operation;
            var parameter = operation.Parameters.Single(p => p.Kind == OpenApiParameterKind.Body);

            Assert.Equal(1, operation.Parameters.Count);
            Assert.True(operation.RequestBody.Content["application/json"].Schema.IsAnyType);
        }
Example #30
0
        public async Task When_OpenApiBodyParameter_is_applied_with_text_then_request_body_is_file()
        {
            // Arrange
            var settings = new AspNetCoreOpenApiDocumentGeneratorSettings {
                SchemaType = SchemaType.OpenApi3
            };

            // Act
            var document = await GenerateDocumentAsync(settings, typeof(PostBodyController));

            var json = document.ToJson();

            // Assert
            var operation = document.Operations.First(o => o.Operation.OperationId == "PostBody_FilePostBodyOperation").Operation;
            var parameter = operation.Parameters.Single(p => p.Kind == OpenApiParameterKind.Body);

            Assert.Equal(1, operation.Parameters.Count);
            Assert.Equal(JsonObjectType.String, operation.RequestBody.Content["text/plain"].Schema.Type);
            Assert.Equal("binary", operation.RequestBody.Content["text/plain"].Schema.Format);
        }