public async Task SwaggerOperationMethods_AreParsed()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(HttpMethodsController));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            Assert.Collection(
                document.Operations.OrderBy(o => o.Method.ToString()),
                operation =>
            {
                Assert.Equal(SwaggerOperationMethod.Delete, operation.Method);
                Assert.Equal("HttpMethods_HttpDelete", operation.Operation.OperationId);
            },
                operation =>
            {
                Assert.Equal(SwaggerOperationMethod.Head, operation.Method);
                Assert.Equal("HttpMethods_HttpHead", operation.Operation.OperationId);
            },
                operation =>
            {
                Assert.Equal(SwaggerOperationMethod.Options, operation.Method);
                Assert.Equal("HttpMethods_HttpOptions", operation.Operation.OperationId);
            },
                operation =>
            {
                Assert.Equal(SwaggerOperationMethod.Patch, operation.Method);
                Assert.Equal("HttpMethods_HttpPatch", operation.Operation.OperationId);
            });
        }
        public async Task ComplexQueryParametersAreProcessed()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operation = Assert.Single(document.Operations, o => o.Path == "/" + nameof(ControllerWithParameters.ComplexFromQueryParameter)).Operation;

            Assert.Collection(
                operation.Parameters.OrderBy(p => p.Name),
                parameter =>
            {
                Assert.Equal(nameof(ComplexModel.Header), parameter.Name);
                Assert.Equal(SwaggerParameterKind.Query, parameter.Kind);
            },
                parameter =>
            {
                Assert.Equal(nameof(ComplexModel.Id), parameter.Name);
                Assert.Equal(SwaggerParameterKind.Query, parameter.Kind);
            },
                parameter =>
            {
                Assert.Equal(nameof(ComplexModel.QueryValues), parameter.Name);
                Assert.Equal(SwaggerParameterKind.Query, parameter.Kind);
            });
        }
        public async Task When_generating_swagger_all_apidescriptions_are_discovered()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(TestController));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operationDescription = Assert.Single(document.Operations);

            Assert.Equal("/test", operationDescription.Path);
            Assert.Equal(SwaggerOperationMethod.Get, operationDescription.Method);

            var operation = operationDescription.Operation;

            Assert.Equal("Test_FindModel", operation.OperationId);

            var parameter = Assert.Single(operation.Parameters);

            Assert.Equal("id", parameter.Name);
            Assert.Equal(SwaggerParameterKind.Path, parameter.Kind);
            Assert.True(parameter.IsRequired);
            Assert.Equal(NJsonSchema.JsonObjectType.Integer, parameter.Type);

            Assert.Single(operation.Responses);
            var response   = operation.Responses["200"];
            var definition = document.Definitions.First(f => f.Value == response.GetActualResponseSchema(operation));

            Assert.Equal(nameof(TestModel), definition.Key);
        }
Beispiel #4
0
        protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader)
        {
            Settings.DocumentTemplate = await GetDocumentTemplateAsync();

            InitializeCustomTypes(assemblyLoader);

            var previousWorkingDirectory = ChangeWorkingDirectory();

            using (var testServer = await CreateTestServerAsync(assemblyLoader))
            {
                // See https://github.com/aspnet/Mvc/issues/5690

                var type = typeof(IApiDescriptionGroupCollectionProvider);
                var apiDescriptionProvider = (IApiDescriptionGroupCollectionProvider)testServer.Host.Services.GetRequiredService(type);

                var settings = await CreateSettingsAsync(assemblyLoader, testServer.Host);

                var generator = new AspNetCoreToSwaggerGenerator(settings);
                var document  = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false);

                var json = PostprocessDocument(document);
                Directory.SetCurrentDirectory(previousWorkingDirectory);
                return(json);
            }
        }
        private AspNetCoreOperationProcessorContext GetContext(ApiDescription apiDescription)
        {
            var operationDescription = new SwaggerOperationDescription {
                Operation = new SwaggerOperation()
            };
            var swaggerSettings         = new AspNetCoreToSwaggerGeneratorSettings();
            var document                = new SwaggerDocument();
            var generator               = new AspNetCoreToSwaggerGenerator(swaggerSettings);
            var schemaGeneratorSettings = new JsonSchemaGeneratorSettings();
            var schemaGenerator         = new JsonSchemaGenerator(schemaGeneratorSettings);
            var schemaResolver          = new SwaggerSchemaResolver(document, schemaGeneratorSettings);
            var context = new AspNetCoreOperationProcessorContext(
                document,
                operationDescription,
                GetType(),
                GetType().GetMethod(nameof(SomeAction), BindingFlags.NonPublic | BindingFlags.Instance),
                new SwaggerGenerator(schemaGenerator, schemaGeneratorSettings, schemaResolver),
                schemaGenerator,
                schemaResolver,
                swaggerSettings,
                new List <SwaggerOperationDescription>())
            {
                ApiDescription = apiDescription,
            };

            return(context);
        }
        protected override async Task <string> RunIsolatedAsync(AssemblyLoader.AssemblyLoader assemblyLoader)
        {
            Settings.DocumentTemplate = await GetDocumentTemplateAsync();

            InitializeCustomTypes(assemblyLoader);

            var previousWorkingDirectory = ChangeWorkingDirectory();
            var assemblies = await LoadAssembliesAsync(AssemblyPaths, assemblyLoader).ConfigureAwait(false);

            var startupType = assemblies.First().ExportedTypes.First(t => t.Name == "Startup"); // TODO: Use .NET Core startup lookup or provide setting

            using (var testServer = new TestServer(new WebHostBuilder().UseStartup(startupType)))
            {
                // See https://github.com/aspnet/Mvc/issues/5690

                var type = typeof(IApiDescriptionGroupCollectionProvider);
                var apiDescriptionProvider = (IApiDescriptionGroupCollectionProvider)testServer.Host.Services.GetRequiredService(type);

                var generator = new AspNetCoreToSwaggerGenerator(Settings);
                var document  = await generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).ConfigureAwait(false);

                var json = PostprocessDocument(document);
                Directory.SetCurrentDirectory(previousWorkingDirectory);
                return(json);
            }
        }
        public async Task BoundPropertiesAreProcessed()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithBoundProperties));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

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

            Assert.Collection(
                operation.Parameters.OrderBy(p => p.Name),
                parameter =>
            {
                Assert.Equal(nameof(ControllerWithBoundProperties.HeaderValue), parameter.Name);
                Assert.Equal(SwaggerParameterKind.Header, parameter.Kind);
            },
                parameter =>
            {
                Assert.Equal(nameof(ControllerWithBoundProperties.Id), parameter.Name);
                Assert.Equal(SwaggerParameterKind.Path, parameter.Kind);
            },
                parameter =>
            {
                Assert.Equal("model", parameter.Name);
                Assert.Equal(SwaggerParameterKind.Body, parameter.Kind);
            });
        }
        /// <summary>Occurs after the action method is invoked.</summary>
        /// <param name="context">The action executed context.</param>
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.Exception != null && (_exceptionTypes.Count == 0 || _exceptionTypes.Exists(t => t.IsInstanceOfType(context.Exception))))
            {
                var settings = AspNetCoreToSwaggerGenerator.GetJsonSerializerSettings(context.HttpContext?.RequestServices);
                settings = settings != null?CopySettings(settings) : new JsonSerializerSettings();

                settings.Converters.Add(new JsonExceptionConverter(_hideStackTrace, _searchedNamespaces));

                var json = JsonConvert.SerializeObject(context.Exception, settings);
                context.Result = new ContentResult
                {
                    StatusCode  = GetStatusCode(context.Exception, context),
                    Content     = json,
                    ContentType = "application/json"
                };

                // Required otherwise the framework exception handlers ignores the
                // Result and redirects to a error page or displays in dev mode the stack trace.
                context.ExceptionHandled = true;
            }
            else
            {
                base.OnActionExecuted(context);
            }
        }
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GenerateSwaggerAsync(HttpContext context)
        {
            var apiDescriptionGroups = _apiDescriptionGroupCollectionProvider.ApiDescriptionGroups;

            if (apiDescriptionGroups.Version == Volatile.Read(ref _version) && _swaggerJson != null)
            {
                return(_swaggerJson);
            }

            try
            {
                var generator = new AspNetCoreToSwaggerGenerator(_settings, _schemaGenerator);
                var document  = await generator.GenerateAsync(apiDescriptionGroups);

                document.Host = context.Request.Host.Value ?? "";
                document.Schemes.Add(context.Request.Scheme == "http" ? SwaggerSchema.Http : SwaggerSchema.Https);
                document.BasePath = context.Request.PathBase.Value?.Substring(0, context.Request.PathBase.Value.Length - (_settings.MiddlewareBasePath?.Length ?? 0)) ?? "";

                _settings.PostProcess?.Invoke(document);
                _swaggerJson = document.ToJson();
                _version     = apiDescriptionGroups.Version;
            }
            catch (Exception exception)
            {
                _swaggerJson = exception.ToString();
            }

            return(_swaggerJson);
        }
        public async Task QueryParametersAreDiscovered()
        {
            //// Arrange
            var generator = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings {
                RequireParametersWithoutDefault = true
            });
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operation         = Assert.Single(document.Operations, o => o.Path == "/" + nameof(ControllerWithParameters.QueryParameter)).Operation;
            var requiredParameter = operation.Parameters.First();
            var optionalParameter = operation.Parameters.Last();

            Assert.Equal(SwaggerParameterKind.Query, requiredParameter.Kind);
            Assert.Equal(SwaggerParameterKind.Query, optionalParameter.Kind);

            Assert.Equal("queryParameter1", requiredParameter.Name);
            Assert.Equal("queryParameter2", optionalParameter.Name);

            Assert.True(requiredParameter.IsRequired);
            Assert.False(optionalParameter.IsRequired);
        }
Beispiel #11
0
        protected async Task <SwaggerDocument> GenerateDocumentAsync(AspNetCoreToSwaggerGeneratorSettings settings)
        {
            var generator = new AspNetCoreToSwaggerGenerator(settings);
            var provider  = TestServer.Host.Services.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            var document = await generator.GenerateAsync(provider.ApiDescriptionGroups);

            return(document);
        }
        /// <summary>Adds a document to the registry.</summary>
        /// <param name="registry">The registry.</param>
        /// <param name="configure">The configure action.</param>
        /// <returns>The registry.</returns>
        public static ISwaggerDocumentBuilder AddSwaggerDocument(this ISwaggerDocumentBuilder registry, Action <SwaggerDocumentSettings> configure = null)
        {
            var settings = new SwaggerDocumentSettings();

            settings.SchemaType = SchemaType.Swagger2;

            configure?.Invoke(settings);

            var generator = new AspNetCoreToSwaggerGenerator(settings, settings.SchemaGenerator ?? new SwaggerJsonSchemaGenerator(settings));

            return(((SwaggerDocumentRegistry)registry).AddDocument(settings.DocumentName, generator));
        }
        public async Task SwaggerOperationProcessorAttributesOnActions_AreDiscoveredAndExecuted()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerOperationProcessor));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            Assert.Equal("Hello from action", document.Info.Title);
        }
        public async Task ControllersWithSwaggerIgnoreAttribute_AreIgnored()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithSwaggerIgnoreAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            Assert.Empty(document.Operations);
        }
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GenerateSwaggerAsync(HttpContext context)
        {
            if (_schemaException != null && _schemaTimestamp + _settings.ExceptionCacheTime > DateTimeOffset.UtcNow)
            {
                throw _schemaException;
            }

            var apiDescriptionGroups = _apiDescriptionGroupCollectionProvider.ApiDescriptionGroups;

            if (apiDescriptionGroups.Version == Volatile.Read(ref _version) && _schemaJson != null)
            {
                return(_schemaJson);
            }

            try
            {
                // TODO: Move to NJS (same in other generator)
                var isSerializerSettingsSpecified =
                    _settings.GeneratorSettings.DefaultPropertyNameHandling != PropertyNameHandling.Default ||
                    _settings.GeneratorSettings.DefaultEnumHandling != EnumHandling.Integer ||
                    _settings.GeneratorSettings.ContractResolver != null |
                    _settings.GeneratorSettings.SerializerSettings != null;

                if (!isSerializerSettingsSpecified)
                {
                    _settings.GeneratorSettings.SerializerSettings = _mvcJsonOptions.Value.SerializerSettings;
                }

                var generator = new AspNetCoreToSwaggerGenerator(_settings.GeneratorSettings, _schemaGenerator);
                var document  = await generator.GenerateAsync(apiDescriptionGroups);

                document.Host = context.Request.Host.Value ?? "";
                document.Schemes.Add(context.Request.Scheme == "http" ? SwaggerSchema.Http : SwaggerSchema.Https);
                document.BasePath = context.Request.PathBase.Value?.Substring(0, context.Request.PathBase.Value.Length - (_settings.MiddlewareBasePath?.Length ?? 0)) ?? "";

                _settings.PostProcess?.Invoke(document);
                _schemaJson      = document.ToJson();
                _schemaException = null;
                _version         = apiDescriptionGroups.Version;
                _schemaTimestamp = DateTimeOffset.UtcNow;
            }
            catch (Exception exception)
            {
                _schemaJson      = null;
                _schemaException = exception;
                _schemaTimestamp = DateTimeOffset.UtcNow;
                throw _schemaException;
            }

            return(_schemaJson);
        }
Beispiel #16
0
        protected async Task <SwaggerDocument> GenerateDocumentAsync(AspNetCoreToSwaggerGeneratorSettings settings, params Type[] controllerTypes)
        {
            var generator = new AspNetCoreToSwaggerGenerator(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);
        }
        public async Task SwaggerOperationAttribute_AreUsedToCalculateOperationId_IfPresent()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerOperationAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

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

            Assert.Equal("CustomOperationId", operation.Operation.OperationId);
        }
        public static void Process(string commandContent, string outputFile, string applicationName)
        {
            var serviceProvider        = GetServiceProvider(applicationName);
            var apiDescriptionProvider = serviceProvider.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            var settings         = CreateSettings(commandContent);
            var swaggerGenerator = new AspNetCoreToSwaggerGenerator(settings);
            var swaggerDocument  = swaggerGenerator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult();

            var outputPathDirectory = Path.GetDirectoryName(outputFile);

            Directory.CreateDirectory(outputPathDirectory);
            File.WriteAllText(outputFile, swaggerDocument.ToJson());
        }
        public async Task ActionsWithSwaggerIgnoreAttribute_AreIgnored()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerIgnoreAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operationDescription = Assert.Single(document.Operations);

            Assert.Equal("/test1", operationDescription.Path);
            Assert.Equal(SwaggerOperationMethod.Get, operationDescription.Method);
        }
        public async Task FormFileParametersAreDiscovered()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operation = Assert.Single(document.Operations, o => o.Path == "/" + nameof(ControllerWithParameters.FileParameter)).Operation;
            var parameter = Assert.Single(operation.Parameters);

            Assert.Equal(SwaggerParameterKind.FormData, parameter.Kind);
            Assert.Equal("multipart/form-data", Assert.Single(operation.Consumes));
        }
        /// <summary>Adds services required for Swagger 2.0 generation (change document settings to generate OpenAPI 3.0).</summary>
        /// <param name="serviceCollection">The <see cref="IServiceCollection"/>.</param>
        /// <param name="configure">Configure the document.</param>
        public static IServiceCollection AddSwaggerDocument(this IServiceCollection serviceCollection, Action <SwaggerDocumentSettings, IServiceProvider> configure = null)
        {
            serviceCollection.AddSingleton(services =>
            {
                var settings        = new SwaggerDocumentSettings();
                settings.SchemaType = SchemaType.Swagger2;

                configure?.Invoke(settings, services);

                if (settings.PostProcess != null)
                {
                    var processor = new ActionDocumentProcessor(context => settings.PostProcess(context.Document));
                    settings.DocumentProcessors.Add(processor);
                }

                foreach (var documentProcessor in services.GetRequiredService <IEnumerable <IDocumentProcessor> >())
                {
                    settings.DocumentProcessors.Add(documentProcessor);
                }

                foreach (var operationProcessor in services.GetRequiredService <IEnumerable <IOperationProcessor> >())
                {
                    settings.OperationProcessors.Add(operationProcessor);
                }

                var schemaGenerator = settings.SchemaGenerator ?? new SwaggerJsonSchemaGenerator(settings);
                var generator       = new AspNetCoreToSwaggerGenerator(settings, schemaGenerator);

                return(new SwaggerDocumentRegistration(settings.DocumentName, generator));
            });

            var descriptor = serviceCollection.SingleOrDefault(d => d.ServiceType == typeof(SwaggerDocumentProvider));

            if (descriptor == null)
            {
                serviceCollection.AddSingleton <SwaggerDocumentProvider>();
                serviceCollection.AddSingleton <IConfigureOptions <MvcOptions>, SwaggerConfigureMvcOptions>();

                // Used by UseDocumentProvider CLI setting
                serviceCollection.AddSingleton <ISwaggerDocumentProvider>(s => s.GetRequiredService <SwaggerDocumentProvider>());

                // Used by the Microsoft.Extensions.ApiDescription tool
                serviceCollection.AddSingleton <ApiDescription.IDocumentProvider>(s => s.GetRequiredService <SwaggerDocumentProvider>());
            }

            return(serviceCollection);
        }
        public async Task When_no_IncludedVersions_are_defined_then_all_routes_are_available_and_replaced()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithReCodeAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

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

            Assert.True(operation.ExtensionData.ContainsKey("x-code-samples"));
            var extenstionData = (IList <ReDocCodeSampleAttribute.ReDocCodeSample>)operation.ExtensionData["x-code-samples"];

            Assert.Equal(2, extenstionData.Count);
        }
        public async Task FromBodyParametersAreDiscovered()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ControllerWithParameters));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operation = Assert.Single(document.Operations, o => o.Path == "/" + nameof(ControllerWithParameters.FromBodyParameter)).Operation;
            var parameter = Assert.Single(operation.Parameters);

            Assert.Equal(SwaggerParameterKind.Body, parameter.Kind);
            Assert.Equal("model", parameter.Name);
            Assert.True(parameter.IsRequired);
        }
        public async Task SwaggerResponseAttributesOnActionsAreDiscovered()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ActionWithSwaggerResponseAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

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

            Assert.Single(operation.Operation.Responses);
            var response   = operation.Operation.Responses["201"];
            var definition = document.Definitions.First(f => f.Value == response.GetActualResponseSchema(operation.Operation));

            Assert.Equal(nameof(TestModel), definition.Key);
        }
Beispiel #25
0
        public async Task When_generating_v2_then_only_v2_operations_are_included()
        {
            // Arrange
            var settings = new AspNetCoreToSwaggerGeneratorSettings();

            settings.OperationProcessors.TryGet <ApiVersionProcessor>().IncludedVersions = new[] { "2" };

            var generator = new AspNetCoreToSwaggerGenerator(settings);
            var provider  = _testServer.Host.Services.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            // Act
            var document = await generator.GenerateAsync(provider.ApiDescriptionGroups);

            var json = document.ToJson();

            // Assert
            Assert.Equal(2, document.Operations.Count());
            Assert.True(document.Operations.All(o => o.Path.Contains("/v2/")));
        }
        public async Task ParametersWithSwaggerIgnoreAttribute_AreIgnored()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = GetApiDescriptionGroups(typeof(ParameterWithSwaggerIgnoreAttribute));

            //// Act
            var document = await generator.GenerateAsync(apiDescriptions);

            //// Assert
            var operationDescription = Assert.Single(document.Operations);

            Assert.Equal("/{id}", operationDescription.Path);
            Assert.Equal(SwaggerOperationMethod.Post, operationDescription.Method);

            var parameter = Assert.Single(operationDescription.Operation.Parameters);

            Assert.Equal("id", parameter.Name);
            Assert.Equal(SwaggerParameterKind.Path, parameter.Kind);
        }
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GenerateSwaggerAsync(HttpContext context)
        {
            if (_schemaException != null && _schemaTimestamp + _settings.ExceptionCacheTime > DateTimeOffset.UtcNow)
            {
                throw _schemaException;
            }

            var apiDescriptionGroups = _apiDescriptionGroupCollectionProvider.ApiDescriptionGroups;

            if (apiDescriptionGroups.Version == Volatile.Read(ref _version) && _schemaJson != null)
            {
                return(_schemaJson);
            }

            try
            {
                var serializerSettings = _mvcJsonOptions.Value.SerializerSettings;
                var settings           = _settings.CreateGeneratorSettings(serializerSettings);
                var generator          = new AspNetCoreToSwaggerGenerator(settings, _schemaGenerator);
                var document           = await generator.GenerateAsync(apiDescriptionGroups);

                document.Host = context.Request.Host.Value ?? "";
                document.Schemes.Add(context.Request.Scheme == "http" ? SwaggerSchema.Http : SwaggerSchema.Https);
                document.BasePath = context.Request.PathBase.Value?.Substring(0, context.Request.PathBase.Value.Length - (_settings.MiddlewareBasePath?.Length ?? 0)) ?? "";

                _settings.PostProcess?.Invoke(document);
                _schemaJson      = document.ToJson();
                _schemaException = null;
                _version         = apiDescriptionGroups.Version;
                _schemaTimestamp = DateTimeOffset.UtcNow;
            }
            catch (Exception exception)
            {
                _schemaJson      = null;
                _schemaException = exception;
                _schemaTimestamp = DateTimeOffset.UtcNow;
                throw _schemaException;
            }

            return(_schemaJson);
        }
        public static void Process(string commandContent, string outputFile, string applicationName)
        {
            var serviceProvider        = GetServiceProvider(applicationName);
            var apiDescriptionProvider = serviceProvider.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            var assemblyLoader = new AssemblyLoader.AssemblyLoader();

            var command = JsonConvert.DeserializeObject <AspNetCoreToSwaggerCommand>(commandContent);

            command.InitializeCustomTypes(assemblyLoader);

            var generator = new AspNetCoreToSwaggerGenerator(command.Settings);
            var document  = generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult();

            command.PostprocessDocument(document);

            var outputPathDirectory = Path.GetDirectoryName(outputFile);

            Directory.CreateDirectory(outputPathDirectory);
            File.WriteAllText(outputFile, document.ToJson());
        }
Beispiel #29
0
        public static void Process(string commandContent, string outputFile, string applicationName)
        {
            var command = JsonConvert.DeserializeObject <AspNetCoreToSwaggerCommand>(commandContent);

            var previousWorkingDirectory = command.ChangeWorkingDirectory();
            var webHost = GetWebHost(applicationName);
            var apiDescriptionProvider = webHost.Services.GetRequiredService <IApiDescriptionGroupCollectionProvider>();

            var assemblyLoader = new AssemblyLoader.AssemblyLoader();
            var settings       = Task.Run(async() => await command.CreateSettingsAsync(assemblyLoader, webHost)).GetAwaiter().GetResult();
            var generator      = new AspNetCoreToSwaggerGenerator(settings);
            var document       = generator.GenerateAsync(apiDescriptionProvider.ApiDescriptionGroups).GetAwaiter().GetResult();

            var json = command.PostprocessDocument(document);

            Directory.SetCurrentDirectory(previousWorkingDirectory);

            var outputPathDirectory = Path.GetDirectoryName(outputFile);

            Directory.CreateDirectory(outputPathDirectory);
            File.WriteAllText(outputFile, json);
        }
        public async Task SwaggerDocumentIsGeneratedForCustomCreatedApiDescriptions()
        {
            //// Arrange
            var generator       = new AspNetCoreToSwaggerGenerator(new AspNetCoreToSwaggerGeneratorSettings());
            var apiDescriptions = new[]
            {
                new ApiDescription
                {
                    ActionDescriptor = new ActionDescriptor(),
                },
                new ApiDescription
                {
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerTypeInfo = typeof(CustomController).GetTypeInfo(),
                        MethodInfo         = typeof(CustomController).GetMethod(nameof(CustomController.FindModel)),
                        AttributeRouteInfo = new AttributeRouteInfo
                        {
                            Template = "api/test/{id}",
                        },
                        ControllerName = "Test",
                        ActionName     = "Find",
                    },
                    HttpMethod            = "Get",
                    RelativePath          = "api/test/{id}",
                    ParameterDescriptions =
                    {
                        new ApiParameterDescription
                        {
                            Name   = "id",
                            Source = BindingSource.Path,
                            Type   = typeof(int),
                        },
                    },
                    SupportedResponseTypes =
                    {
                        new ApiResponseType
                        {
                            Type       = typeof(TestModel),
                            StatusCode = 200,
                        }
                    },
                },
                new ApiDescription
                {
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerTypeInfo = typeof(CustomController).GetTypeInfo(),
                        MethodInfo         = typeof(CustomController).GetMethod(nameof(CustomController.Delete)),
                        ControllerName     = "Test",
                        ActionName         = "DeleteModel",
                    },
                    HttpMethod            = "Delete",
                    RelativePath          = "api/test",
                    ParameterDescriptions =
                    {
                        new ApiParameterDescription
                        {
                            Name   = "id",
                            Source = BindingSource.Query,
                            Type   = typeof(int),
                        },
                    },
                    SupportedResponseTypes =
                    {
                        new ApiResponseType
                        {
                            Type       = typeof(StatusCodeResult),
                            StatusCode = 201,
                        }
                    },
                },
                new ApiDescription
                {
                    ActionDescriptor = new ControllerActionDescriptor
                    {
                        ControllerTypeInfo = typeof(CustomController).GetTypeInfo(),
                        MethodInfo         = typeof(CustomController).GetMethod(nameof(CustomController.Update)),
                        AttributeRouteInfo = new AttributeRouteInfo
                        {
                            Template = "api/test/{id}",
                        },
                        ControllerName = "Test",
                        ActionName     = "Update",
                    },
                    HttpMethod            = "Put",
                    RelativePath          = "api/test/{id}",
                    ParameterDescriptions =
                    {
                        new ApiParameterDescription
                        {
                            Type   = typeof(int),
                            Name   = "id",
                            Source = BindingSource.Path,
                        },
                        new ApiParameterDescription
                        {
                            Type   = typeof(TestModel),
                            Name   = "model",
                            Source = BindingSource.Body,
                        },
                    },
                    SupportedResponseTypes =
                    {
                        new ApiResponseType
                        {
                            Type       = typeof(Task <TestModel>),
                            StatusCode = 200,
                        }
                    },
                },
            };
            var apiDescriptionGroupCollection = new ApiDescriptionGroupCollection(
                new[] { new ApiDescriptionGroup(string.Empty, apiDescriptions) },
                version: 1);

            //// Act
            var document = await generator.GenerateAsync(apiDescriptionGroupCollection);

            //// Assert
            Assert.Collection(
                document.Operations.OrderBy(o => o.Method.ToString()),
                operation =>
            {
                Assert.Equal("/api/test", operation.Path);
                Assert.Equal(SwaggerOperationMethod.Delete, operation.Method);
            },
                operation =>
            {
                Assert.Equal("/api/test/{id}", operation.Path);
                Assert.Equal(SwaggerOperationMethod.Get, operation.Method);

                Assert.Single(operation.Operation.Responses);
                var response   = operation.Operation.Responses["200"];
                var definition = document.Definitions.First(f => f.Value == response.GetActualResponseSchema(operation.Operation));
                Assert.Equal(nameof(TestModel), definition.Key);
            },
                operation =>
            {
                Assert.Equal("/api/test/{id}", operation.Path);
                Assert.Equal(SwaggerOperationMethod.Put, operation.Method);
            });
        }