示例#1
0
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual string GenerateSwagger(IOwinContext context)
        {
            if (_swaggerJson == null)
            {
                lock (_lock)
                {
                    if (_swaggerJson == null)
                    {
                        try
                        {
                            var generator = new WebApiToSwaggerGenerator(_settings, _schemaGenerator);
                            var document = generator.GenerateForControllers(_controllerTypes);

                            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();
                        }
                        catch (Exception exception)
                        {
                            _swaggerJson = exception.ToString();
                        }
                    }
                }
            }

            return _swaggerJson;
        }
            internal string FromWebApiAssembly(string assemblyPath, string controllerClassName, string urlTemplate)
            {
                var assembly = Assembly.LoadFrom(assemblyPath);
                var type = assembly.GetType(controllerClassName);

                var generator = new WebApiToSwaggerGenerator(urlTemplate);
                return generator.Generate(type).ToJson();
            }
            internal string GenerateForSingleController(string controllerClassName, string settingsData)
            {
                var settings = JsonConvert.DeserializeObject<WebApiAssemblyToSwaggerGeneratorSettings>(settingsData);

                var assembly = Assembly.LoadFrom(settings.AssemblyPath);
                var type = assembly.GetType(controllerClassName);

                var generator = new WebApiToSwaggerGenerator(settings);
                return generator.GenerateForController(type).ToJson();
            }
示例#4
0
        public void When_route_is_on_inherited_parent_class_then_it_is_used_for_swagger_generation()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<MyController2>();

            //// Assert
            Assert.AreEqual("/Foo", document.Operations.First().Path);
        }
示例#5
0
文件: TagsTests.cs 项目: NSwag/NSwag
        public void When_operation_has_tags_attributes_then_they_are_processed()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<TagsTest2Controller>();

            //// Assert
            Assert.AreEqual("[\"foo\",\"bar\"]", JsonConvert.SerializeObject(document.Operations.First().Operation.Tags));
        }
        // todo: Fix this
        //[TestMethod]
        public void When_route_attribte_is_on_controller_class_then_it_applies_for_actions()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var service = generator.GenerateForController<MyController>();
            var operation = service.Operations.Single(o => o.Operation.OperationId == "Foo");

            //// Assert
            Assert.AreEqual("myRoot/My/Foo", operation.Path);
        }
示例#7
0
        public void When_generating_type_with_deep_inheritance_then_allOf_has_one_item()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var service = generator.GenerateForController<TestController>();
            var swaggerSpecification = service.ToJson();

            //// Assert
            Assert.AreEqual(2, Regex.Matches(Regex.Escape(swaggerSpecification), "allOf").Count); // must have an allOf in BB and CC, no more (rest are refs)
        }
        public void When_generating_swagger_from_controller_than_all_required_operations_are_available()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator("api/{controller}/{action}/{id}");

            //// Act
            var service = generator.GenerateForController<PersonsController>();
            var swaggerSpecification = service.ToJson();

            //// Assert
            Assert.AreEqual(9, service.Operations.Count());
        }
示例#9
0
        public void When_route_contains_complex_path_parameter_then_it_is_correctly_parsed()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var swagger = swaggerGen.GenerateForController<PersonsController>();
            var json = swagger.ToJson(); 

            //// Assert
            Assert.IsTrue(swagger.Paths.Contains("/api/Persons/RegexPathParameter/{deviceType}/{deviceId}/energyConsumed"));
        }
示例#10
0
        public void When_enum_is_used_as_array_item_then_it_is_generated_only_once()
        {
            // Arrange
            var apiGenerator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = apiGenerator.GenerateForController<MyController>();
            var json = document.ToJson();

            // Assert
            Assert.IsTrue(json.Split(new[] { "x-enumNames" }, StringSplitOptions.None).Length == 2); // enum is defined only once
        }
示例#11
0
        public void When_method_has_overload_then_operation_ids_are_still_unique()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<OperationIdController>();

            //// Assert
            var allIds = document.Operations.Select(o => o.Operation.OperationId).ToArray();
            Assert.AreEqual(4, allIds.Distinct().Count());
        }
示例#12
0
        public void When_SwaggerOperation_attribute_is_available_then_operation_id_is_correct()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<OperationIdController>();

            //// Assert
            Assert.AreEqual("MyFoo", document.Operations.First(o => o.Path == "/Foo").Operation.OperationId);
            Assert.AreEqual("OperationId_Bar", document.Operations.First(o => o.Path == "/Bar").Operation.OperationId);
        }
示例#13
0
        public void When_accept_verbs_attribute_with_put_is_used_then_http_method_is_correct()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<TestController>();
            var operation = document.Operations.First(o => o.Operation.OperationId == "Test_AddPut");

            //// Assert
            Assert.AreEqual(SwaggerOperationMethod.Put, operation.Method);
        }
        public void When_there_is_a_ResultType_attribute_on_an_action_method_then_the_response_is_taken_from_the_given_type()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator("api/{controller}/{action}/{id}");

            //// Act
            var service = generator.GenerateForController<PersonsController>();
            var operation = service.Operations.Single(o => o.Path == "api/Persons/Get/{id}");

            //// Assert
            Assert.AreEqual(2, operation.Operation.Responses.Count);
            Assert.AreEqual("Person", operation.Operation.Responses["200"].Schema.ActualSchema.TypeName);
        }
示例#15
0
        public void When_operation_has_SwaggerResponseAttribute_then_it_is_processed()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<ResponseAttributeTestController>();

            //// Assert
            var barOperation = document.Operations.Single(o => o.Operation.OperationId == "ResponseAttributeTest_Bar");
            Assert.AreEqual("201", barOperation.Operation.Responses.First().Key);
            Assert.AreEqual(JsonObjectType.Integer, barOperation.Operation.Responses.First().Value.Schema.Type);
        }
        public void When_generating_swagger_from_controller_than_all_required_operations_are_available()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            var document = generator.GenerateForController<PersonsController>();
            var swaggerSpecification = document.ToJson();

            //// Assert
            Assert.AreEqual(10, document.Operations.Count());
        }
示例#17
0
文件: TagsTests.cs 项目: NSwag/NSwag
        public void When_operation_has_tag_attribute_with_AddToDocument_then_it_is_added_to_document()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<TagsTest3Controller>();

            //// Assert
            Assert.AreEqual(1, document.Tags.Count);
            Assert.AreEqual("foo", document.Tags[0].Name);

            Assert.AreEqual(1, document.Operations.First().Operation.Tags.Count);
            Assert.AreEqual("foo", document.Operations.First().Operation.Tags[0]);
        }
示例#18
0
        public void When_controller_has_RoutePrefix_then_paths_are_correct()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var swagger = swaggerGen.GenerateForController<PersonsController>();

            //// Assert
            Assert.IsNotNull(swagger.Paths["/api/Persons"][SwaggerOperationMethod.Get]);
            Assert.IsNotNull(swagger.Paths["/api/Persons/{id}"][SwaggerOperationMethod.Get]);
            Assert.IsNotNull(swagger.Paths["/api/Persons"][SwaggerOperationMethod.Post]);
            Assert.IsNotNull(swagger.Paths["/api/Persons/{id}"][SwaggerOperationMethod.Put]);
            Assert.IsNotNull(swagger.Paths["/api/Persons/{id}"][SwaggerOperationMethod.Delete]);
        }
示例#19
0
        public void When_action_has_file_parameter_then_Stream_is_generated_in_CSharp_code()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document = generator.GenerateForController<FileUploadController>();

            //// Act
            var codeGen = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings());
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("FileParameter file"));
            Assert.IsTrue(code.Contains("var content_ = new System.Net.Http.MultipartFormDataContent();"));
            Assert.IsTrue(code.Contains("content_.Add(new System.Net.Http.StreamContent(file.Data), \"file\""));
        }
示例#20
0
        public void When_parameter_is_primitive_and_has_FromBody_then_it_is_a_path_parameter()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            var document = generator.GenerateForController<TestController>();
            var operation = document.Operations.Single(o => o.Operation.OperationId == "Test_WithFromBodyAttribute").Operation;

            //// Assert
            Assert.AreEqual(SwaggerParameterKind.Path, operation.ActualParameters[0].Kind); // TODO: What is correct?
        }
示例#21
0
        public void When_parameter_is_from_uri_and_has_file_then_two_params_and_consumes_is_correct()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController(typeof(FromUriFileParameterController));

            //// Assert
            var operation = document.Paths["/upload"][SwaggerOperationMethod.Post];

            Assert.AreEqual(JsonObjectType.File, operation.ActualParameters.Single(p => p.Name == "formFile").Type);
            Assert.IsTrue(operation.ActualParameters.Any(p => p.Name == "formFile"));
            Assert.IsTrue(operation.ActualParameters.Any(p => p.Name == "CustomLocationToSave"));
            Assert.AreEqual("multipart/form-data", operation.Consumes[0]);
        }
        public void When_there_is_a_ResultType_attribute_on_an_action_method_then_the_response_is_taken_from_the_given_type()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            var document = generator.GenerateForController<PersonsController>();
            var operation = document.Operations.Single(o => o.Path == "/api/Persons/Get/{id}");
            var json = document.ToJson();

            //// Assert
            Assert.AreEqual(2, operation.Operation.Responses.Count);
            Assert.IsTrue(document.Definitions.Any(d => d.Key == "Person"));
        }
示例#23
0
        public async Task When_controller_has_RoutePrefix_with_optional_parameters_then_paths_are_correct()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var swagger = await generator.GenerateForControllerAsync <UsersController>();

            //// Assert
            Assert.IsNotNull(swagger.Paths["/api/users"][SwaggerOperationMethod.Get]);
            Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][SwaggerOperationMethod.Get]);
            Assert.IsNotNull(swagger.Paths["/api/users"][SwaggerOperationMethod.Post]);
            Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][SwaggerOperationMethod.Put]);
            Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][SwaggerOperationMethod.Delete]);
            Assert.IsNotNull(swagger.Paths["/api/users/{userId}/devices"][SwaggerOperationMethod.Get]);
            Assert.IsNotNull(swagger.Paths["/api/users/{userId}/devices/{deviceId}"][SwaggerOperationMethod.Get]);
            Assert.IsTrue(swagger.Paths.Count == 4);
            Assert.IsTrue(swagger.Paths.SelectMany(p => p.Value).Count() == 7);
        }
示例#24
0
        public async Task When_controllerroutenamingstrategy_none_then_route_attribute_name_not_specified()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document   = await swaggerGen.GenerateForControllerAsync <TestController>();

            var settings = new SwaggerToCSharpControllerGeneratorSettings
            {
                RouteNamingStrategy = CSharpControllerRouteNamingStrategy.None
            };

            //// Act
            var codeGen = new SwaggerToCSharpControllerGenerator(document, settings);
            var code    = codeGen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("Route(\"Foo\")"));
            Assert.IsTrue(code.Contains("Route(\"Bar\")"));
        }
        public async Task When_there_is_a_ResultType_attribute_on_an_action_method_then_the_response_is_taken_from_the_given_type()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id?}"
            });

            //// Act
            var document = await generator.GenerateForControllerAsync <PersonsDefaultRouteController>();

            var operation = document.Operations.Single(o => o.Path == "/api/PersonsDefaultRoute/Get/{id}");
            var json      = document.ToJson();

            //// Assert
            Assert.AreEqual(2, operation.Operation.ActualResponses.Count);
            Assert.AreEqual(10, document.Operations.Count());
            Assert.IsTrue(document.Definitions.Any(d => d.Key == "Person"));
        }
示例#26
0
        public async Task When_UseHttpRequestMessageCreationMethod_is_set_then_CreateRequestMessage_is_generated()
        {
            //// Arrange
            var swaggerGenerator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document         = await swaggerGenerator.GenerateForControllerAsync <FooController>();

            var generator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings
            {
                ConfigurationClass = "MyConfig",
                ClientBaseClass    = "MyBaseClass",
                UseHttpRequestMessageCreationMethod = true
            });

            //// Act
            var code = generator.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)"));
        }
示例#27
0
        public async Task When_parameter_is_from_uri_then_two_params_are_generated()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync(typeof(FromUriParameterController));

            //// Assert
            var operation = document.Paths["/upload"][SwaggerOperationMethod.Post];

            Assert.AreEqual(JsonObjectType.String, operation.ActualParameters.Single(p => p.Name == "Foo").Type);
            Assert.AreEqual(JsonObjectType.String, operation.ActualParameters.Single(p => p.Name == "Bar").Type);

            Assert.IsTrue(operation.ActualParameters.Any(p => p.Name == "Foo"));
            Assert.IsTrue(operation.ActualParameters.Any(p => p.Name == "Bar"));

            Assert.IsNull(operation.Consumes);
        }
示例#28
0
        private string GenerateSwagger(IOwinContext context)
        {
            if (_swaggerJson == null)
            {
                lock (_lock)
                {
                    if (_swaggerJson == null)
                    {
                        var generator = new WebApiToSwaggerGenerator(_settings);
                        var service   = generator.GenerateForControllers(_controllerTypes);

                        _settings.SwaggerServiceTransformer?.Transform(service);
                        _swaggerJson = service.ToJson();
                    }
                }
            }

            return(_swaggerJson);
        }
示例#29
0
        public async Task When_controllergenerationformat_abstract_then_partialcontroller_is_generated()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document   = await swaggerGen.GenerateForControllerAsync <TestController>();

            //// Act
            var codeGen = new SwaggerToCSharpControllerGenerator(document, new SwaggerToCSharpControllerGeneratorSettings
            {
                ControllerStyle = CSharpControllerStyle.Partial,
            });
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("partial class TestController"));
            Assert.IsTrue(code.Contains("ITestController"));
            Assert.IsTrue(code.Contains("private ITestController _implementation;"));
            Assert.IsFalse(code.Contains("abstract class TestController"));
        }
        public async Task When_aspnet_actiontype_inuse_with_partial_then_actiontype_is_generated()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document   = await swaggerGen.GenerateForControllerAsync <TestController>();

            //// Act
            var codeGen = new SwaggerToCSharpControllerGenerator(document, new SwaggerToCSharpControllerGeneratorSettings
            {
                ControllerStyle     = CSharpControllerStyle.Partial,
                UseActionResultType = true
            });
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.Contains("System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.ActionResult<string>> FooAsync(string test, bool test2);", code);
            Assert.Contains("public System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.ActionResult<string>> Foo(string test, bool test2)", code);
            Assert.Contains("System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult> BarAsync();", code);
            Assert.Contains("public System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult> Bar()", code);
        }
示例#31
0
        public async Task When_body_parameter_is_Stream_then_consumes_is_octet_()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <StreamBodyParameterController>();

            var json = document.ToJson();

            //// Assert
            var operation = document.Paths["/upload"][SwaggerOperationMethod.Post];
            var parameter = operation.ActualParameters.Single(p => p.Name == "data");

            Assert.AreEqual(JsonObjectType.String, parameter.Schema.Type);
            Assert.AreEqual(JsonFormatStrings.Byte, parameter.Schema.Format);

            Assert.AreEqual(1, operation.ActualConsumes.Count());
            Assert.AreEqual("application/octet-stream", operation.ActualConsumes.First());
        }
示例#32
0
        static void Main(string[] args)
        {
            var swaggerSettings = new WebApiToSwaggerGeneratorSettings
            {
                DefaultPropertyNameHandling = NJsonSchema.PropertyNameHandling.CamelCase,
                DefaultUrlTemplate          = "api/v0.1/{controller}/{id}",
                GenerateKnownTypes          = true,
                TypeNameGenerator           = new DefaultTypeNameGenerator(),
            };
            var swaggerGenerator = new WebApiToSwaggerGenerator(swaggerSettings);

            var document = swaggerGenerator.GenerateForController <Controllers.CountriesController>();

            string json = document.ToJson();

            Console.WriteLine(json);

            System.IO.File.WriteAllText("CFlowSwagger.json", json);

            Console.ReadKey();
        }
        public void When_route_has_path_parameter_which_is_not_an_action_parameter_then_it_is_still_added_as_path_parameter()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate       = "api/{controller}/{action}/{id}",
                AddMissingPathParameters = true
            });

            //// Act
            var document = generator.GenerateForController <RoutePrefixWithPathsController>();

            //// Assert
            var operation = document.Operations.First().Operation;
            var parameter = operation.Parameters.Single(p => p.Name == "companyIdentifier");

            Assert.AreEqual(2, operation.ActualParameters.Count);
            Assert.AreEqual(SwaggerParameterKind.Path, parameter.Kind);
            Assert.AreEqual(JsonObjectType.String, parameter.Type);
            Assert.AreEqual(JsonFormatStrings.Guid, parameter.Format);
        }
示例#34
0
        public async Task When_body_is_xml_then_correct_TypeScript_is_generated()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <MyXmlController>();

            var settings = new SwaggerToTypeScriptClientGeneratorSettings {
                Template = TypeScriptTemplate.JQueryCallbacks
            };

            settings.TypeScriptGeneratorSettings.TypeScriptVersion = 1.8m;

            //// Act
            var gen  = new SwaggerToTypeScriptClientGenerator(document, settings);
            var code = gen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("(xmlDocument: string, "));
            Assert.IsTrue(code.Contains("const content_ = xmlDocument;"));
            Assert.IsTrue(code.Contains("\"Content-Type\": \"application/xml\""));
        }
        public async Task When_parameter_is_array_and_has_FromUri_then_it_is_a_query_parameter()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            var document = await generator.GenerateForControllerAsync <ControllerWithArrayQueryParameter>();

            var json = document.ToJson();

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

            Assert.AreEqual(SwaggerParameterKind.Query, parameter.Kind);
            Assert.AreEqual(JsonObjectType.Array, parameter.Type);
            Assert.AreEqual(SwaggerParameterCollectionFormat.Multi, parameter.CollectionFormat);
        }
        public async Task When_controller_has_operation_with_complextype_then_abstractcontroller_is_generated_with_frombody_attribute()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document   = await swaggerGen.GenerateForControllerAsync <TestController>();

            var settings = new SwaggerToCSharpControllerGeneratorSettings
            {
                ControllerStyle = CSharpControllerStyle.Abstract,
            };

            //// Act
            var codeGen = new SwaggerToCSharpControllerGenerator(document, settings);
            var code    = codeGen.GenerateFile();

            //// Assert
            Assert.Contains("abstract class TestController", code);
            Assert.Contains($"Complex([Microsoft.AspNetCore.Mvc.FromBody] ComplexType complexType)", code);
            Assert.Contains("Foo(string test, bool test2)", code);
            Assert.Contains("Bar()", code);
        }
示例#37
0
        public async Task When_return_value_is_void_then_client_returns_observable_of_void()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document = await generator.GenerateForControllerAsync<DiscussionController>();

            //// Act
            var codeGen = new SwaggerToTypeScriptClientGenerator(document, new SwaggerToTypeScriptClientGeneratorSettings
            {
                Template = TypeScriptTemplate.Angular,
                GenerateClientInterfaces = true, 
                TypeScriptGeneratorSettings =
                {
                    TypeScriptVersion = 2.0m
                }
            });
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("addMessage(message: Foo): Observable<void>"));
        }
示例#38
0
        public async Task When_controller_has_operation_with_complextype_then_partialcontroller_is_generated_with_frombody_attribute()
        {
            //// Arrange
            var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document   = await swaggerGen.GenerateForControllerAsync <TestController>();

            var settings = new SwaggerToCSharpControllerGeneratorSettings
            {
                AspNetNamespace = "MyCustomNameSpace"
            };

            //// Act
            var codeGen = new SwaggerToCSharpControllerGenerator(document, settings);
            var code    = codeGen.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("partial class TestController"));
            Assert.IsTrue(code.Contains($"Complex([{settings.AspNetNamespace}.FromBody] ComplexType complexType)"));
            Assert.IsTrue(code.Contains("Foo(string test, bool test2)"));
            Assert.IsTrue(code.Contains("Bar()"));
        }
示例#39
0
        public async Task When_multple_responses_with_same_status_code_are_defined_then_they_are_merged_and_common_base_type_used_as_response_schema()
        {
            /// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            /// Act
            var document = await generator.GenerateForControllerAsync <TestController>();

            /// Assert
            var operationAbc = document.Operations.Single(o => o.Path.Contains("Abc"));
            var responseAbc  = operationAbc.Operation.Responses.First(r => r.Key == "500").Value;

            Assert.AreEqual(document.Definitions["Animal"].ActualSchema, responseAbc.Schema.ActualSchema);
            Assert.AreEqual(2, responseAbc.ExpectedSchemas.Count);

            var operationDef = document.Operations.Single(o => o.Path.Contains("Abc"));
            var responseDef  = operationDef.Operation.Responses.First(r => r.Key == "500").Value;

            Assert.AreEqual(document.Definitions["Animal"].ActualSchema, responseDef.Schema.ActualSchema);
            Assert.AreEqual(2, responseDef.ExpectedSchemas.Count);
        }
        /// <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;
            }

            if (_schemaJson == null)
            {
                if (_schemaJson == null)
                {
                    try
                    {
                        var serializerSettings = _mvcJsonOptions.Value.SerializerSettings;
                        var settings           = _settings.CreateGeneratorSettings(serializerSettings);
                        var generator          = new WebApiToSwaggerGenerator(settings, _schemaGenerator);
                        var document           = await generator.GenerateForControllersAsync(_controllerTypes);

                        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;
                        _schemaTimestamp = DateTimeOffset.UtcNow;
                    }
                    catch (Exception exception)
                    {
                        _schemaJson      = null;
                        _schemaException = exception;
                        _schemaTimestamp = DateTimeOffset.UtcNow;
                        throw _schemaException;
                    }
                }
            }

            return(_schemaJson);
        }
        public async Task When_response_is_not_nullable_then_nullable_is_false_in_spec()
        {
            /// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());

            /// Act
            var document = await generator.GenerateForControllerAsync <NotNullResponseTestController>();

            /// Assert
            var operationAbc = document.Operations.Single(o => o.Path.Contains("Abc"));
            var responseAbc  = operationAbc.Operation.ActualResponses.First().Value;

            var operationDef = document.Operations.Single(o => o.Path.Contains("Def"));
            var responseDef  = operationDef.Operation.ActualResponses.First().Value;

            var operationGhi = document.Operations.Single(o => o.Path.Contains("Ghi"));
            var responseGhi  = operationGhi.Operation.ActualResponses.First().Value;

            Assert.IsTrue(responseAbc.IsNullable(SchemaType.Swagger2));
            Assert.IsFalse(responseDef.IsNullable(SchemaType.Swagger2));
            Assert.IsFalse(responseGhi.IsNullable(SchemaType.Swagger2));
        }
        public async Task When_IncludedVersions_are_set_then_only_these_are_available_in_document()
        {
            //// Arrange
            var settings = new WebApiToSwaggerGeneratorSettings();

            settings.OperationProcessors.Get <ApiVersionProcessor>().IncludedVersions.Add("1");

            var generator = new WebApiToSwaggerGenerator(settings);

            //// Act
            var document = await generator.GenerateForControllersAsync(new List <Type>
            {
                typeof(VersionedControllerV1),
                typeof(VersionedControllerV2)
            });

            //// Assert
            Assert.AreEqual(2, document.Paths.Count);

            Assert.IsTrue(document.Paths.ContainsKey("/api/v1/foo"));
            Assert.IsTrue(document.Paths.ContainsKey("/api/v1/bar"));
        }
示例#43
0
        public async Task When_setting_is_enabled_then_parameters_are_reordered()
        {
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <TestController>();

            //// Act
            var operation     = document.Operations.First().Operation;
            var lastParameter = operation.Parameters.Last();

            operation.Parameters.Remove(lastParameter);
            operation.Parameters.Insert(0, lastParameter);
            var json = document.ToJson();

            var codeGenerator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings
            {
                GenerateOptionalParameters = true
            });
            var code = codeGenerator.GenerateFile();

            //// Assert
            Assert.IsTrue(code.Contains("TestAsync(string a, string b, string c = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))"));
        }
示例#44
0
        public async Task When_parameter_is_complex_and_has_FromUri_then_complex_object_properties_are_added()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            });

            //// Act
            var document = await generator.GenerateForControllerAsync <TestController>();

            var operation = document.Operations.Single(o => o.Operation.OperationId == "Test_WithFromUriAttribute").Operation;

            //// Assert
            Assert.AreEqual("My comment.", operation.Summary);
            Assert.AreEqual("My remarks.", operation.Description);
            Assert.AreEqual(SwaggerParameterKind.Query, operation.ActualParameters[0].Kind);
            Assert.AreEqual(SwaggerParameterKind.Query, operation.ActualParameters[1].Kind);
            Assert.AreEqual("Foo", operation.ActualParameters[0].Name);
            Assert.AreEqual("bar", operation.ActualParameters[1].Name);
            Assert.AreEqual("My comment.", operation.ActualParameters[1].Description);
        }
        public async Task When_no_IncludedVersions_are_defined_then_all_routes_are_available_and_replaced()
        {
            //// Arrange
            var settings  = new WebApiToSwaggerGeneratorSettings();
            var generator = new WebApiToSwaggerGenerator(settings);

            //// Act
            var document = await generator.GenerateForControllersAsync(new List <Type>
            {
                typeof(VersionedControllerV1),
                typeof(VersionedControllerV2)
            });

            //// Assert
            Assert.AreEqual(4, document.Paths.Count);

            Assert.IsTrue(document.Paths.ContainsKey("/api/v1/foo"));
            Assert.IsTrue(document.Paths.ContainsKey("/api/v1/bar"));

            Assert.IsTrue(document.Paths.ContainsKey("/api/v2/foo"));
            Assert.IsTrue(document.Paths.ContainsKey("/api/v2/bar"));
        }
示例#46
0
        static void Main(string[] args)
        {
            var controllers = Metadata.GetAllControllers();

            var swagDocSettings = new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}"
            };
            var swagDocGenerator = new WebApiToSwaggerGenerator(swagDocSettings);
            var document         = swagDocGenerator.GenerateForControllersAsync(controllers).Result;

            var codeGenSettings = new SwaggerToTypeScriptClientGeneratorSettings
            {
                Template    = TypeScriptTemplate.Fetch,
                PromiseType = PromiseType.Promise,
                GenerateClientInterfaces = true
            };

            var generator = new SwaggerToTypeScriptClientGenerator(document, codeGenSettings);
            var code      = generator.GenerateFile();

            code = code.RemoveStatusCodeHandling();
            code = code.AddReferencedTypes();
            code = code.WithCustomReplacements();

            string outputPath = string.Empty;

            var directory = ConfigurationManager.AppSettings["OutputDirectory"].ToString();

            directory = directory.EndsWith("\\", System.StringComparison.InvariantCultureIgnoreCase) ? directory : directory + "\\";
            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }
            outputPath = directory + "ApiClient.ts";

            File.WriteAllText(outputPath, code);
        }
        public async Task When_parameter_is_nullable_and_ts20_then_it_is_a_union_type_with_undefined()
        {
            //// Arrange
            var swaggerGenerator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document         = await swaggerGenerator.GenerateForControllerAsync <OptionalParameterController>();

            var clientGenerator = new SwaggerToTypeScriptClientGenerator(document, new SwaggerToTypeScriptClientGeneratorSettings
            {
                TypeScriptGeneratorSettings =
                {
                    TypeScriptVersion = 2.0m,
                    NullValue         = TypeScriptNullValue.Undefined
                }
            });

            var json = document.ToJson();

            //// Act
            var code = clientGenerator.GenerateFile();

            //// Assert
            Assert.Contains("test(a: number, b: number | null)", code);
        }
示例#48
0
文件: TagsTests.cs 项目: NSwag/NSwag
        public void When_controller_has_tag_attributes_then_they_are_processed()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = generator.GenerateForController<TagsTest1Controller>();

            //// Assert
            Assert.AreEqual(4, document.Tags.Count);

            Assert.AreEqual("x", document.Tags[0].Name);
            Assert.AreEqual("y", document.Tags[1].Name);

            Assert.AreEqual("a1", document.Tags[2].Name);
            Assert.AreEqual("a2", document.Tags[2].Description);
            Assert.AreEqual(null, document.Tags[2].ExternalDocumentation);

            Assert.AreEqual("b1", document.Tags[3].Name);
            Assert.AreEqual("b2", document.Tags[3].Description);
            Assert.AreEqual("b3", document.Tags[3].ExternalDocumentation.Description);
            Assert.AreEqual("b4", document.Tags[3].ExternalDocumentation.Url);
        }
示例#49
0
        public async Task When_controller_has_tag_attributes_then_they_are_processed()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings());

            //// Act
            var document = await generator.GenerateForControllerAsync <TagsTest1Controller>();

            //// Assert
            Assert.AreEqual(4, document.Tags.Count);

            Assert.AreEqual("x", document.Tags[0].Name);
            Assert.AreEqual("y", document.Tags[1].Name);

            Assert.AreEqual("a1", document.Tags[2].Name);
            Assert.AreEqual("a2", document.Tags[2].Description);
            Assert.AreEqual(null, document.Tags[2].ExternalDocumentation);

            Assert.AreEqual("b1", document.Tags[3].Name);
            Assert.AreEqual("b2", document.Tags[3].Description);
            Assert.AreEqual("b3", document.Tags[3].ExternalDocumentation.Description);
            Assert.AreEqual("b4", document.Tags[3].ExternalDocumentation.Url);
        }
示例#50
0
        public async Task When_complex_parameter_contains_property_with_FromRoute_attribute_then_it_is_generated_as_path_parameter()
        {
            // FromRouteAttribute is only available in ASP.NET Core
            // Issue: https://github.com/NSwag/NSwag/issues/513

            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                IsAspNetCore = true,
                DefaultPropertyNameHandling = PropertyNameHandling.CamelCase
            });

            //// Act
            var document = await generator.GenerateForControllerAsync <ComplexPathParameterController>();

            var operation = document.Operations.First().Operation;
            var json      = document.ToJson();

            //// Assert
            Assert.AreEqual(SwaggerParameterKind.Path, operation.Parameters[0].Kind);
            Assert.AreEqual("title", operation.Parameters[0].Name);
            Assert.AreEqual(SwaggerParameterKind.Query, operation.Parameters[1].Kind);
            Assert.AreEqual("bar", operation.Parameters[1].Name);
        }
示例#51
0
        public async Task When_consumes_is_url_encoded_then_construct_url_encoded_request()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings());
            var document  = await generator.GenerateForControllerAsync <UrlEncodedRequestConsumingController>();

            var json = document.ToJson();

            //// Act
            var codeGen = new SwaggerToTypeScriptClientGenerator(document, new SwaggerToTypeScriptClientGeneratorSettings
            {
                Template = TypeScriptTemplate.Fetch,
                TypeScriptGeneratorSettings =
                {
                    TypeScriptVersion = 2.0m
                }
            });
            var code = codeGen.GenerateFile();

            //// Assert
            Assert.Contains("content_", code);
            Assert.DoesNotContain("FormData", code);
            Assert.Contains("\"Content-Type\": \"application/x-www-form-urlencoded\"", code);
        }
示例#52
0
        /// <summary>Generates the Swagger specification.</summary>
        /// <param name="context">The context.</param>
        /// <returns>The Swagger specification.</returns>
        protected virtual async Task <string> GenerateSwaggerAsync(IOwinContext context)
        {
            if (_swaggerJson == null)
            {
                try
                {
                    var generator = new WebApiToSwaggerGenerator(_settings, _schemaGenerator);
                    var document  = await generator.GenerateForControllersAsync(_controllerTypes);

                    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();
                }
                catch (Exception exception)
                {
                    _swaggerJson = exception.ToString();
                }
            }

            return(_swaggerJson);
        }
            internal string GenerateForAssemblyControllers(string assemblyPath, string urlTemplate, string jsonSchemaGeneratorSettingsData)
            {
                var jsonSchemaGeneratorSettings = JsonConvert.DeserializeObject<JsonSchemaGeneratorSettings>(jsonSchemaGeneratorSettingsData);

                var assembly = Assembly.LoadFrom(assemblyPath);
                var controllers = assembly.ExportedTypes
                    .Where(t => t.InheritsFrom("ApiController")).ToArray();

                var generator = new WebApiToSwaggerGenerator(urlTemplate, jsonSchemaGeneratorSettings);
                return generator.GenerateForControllers(controllers).ToJson();
            }
            internal string GenerateForSingleController(string assemblyPath, string controllerClassName, string urlTemplate, string jsonSchemaGeneratorSettingsData)
            {
                var jsonSchemaGeneratorSettings = JsonConvert.DeserializeObject<JsonSchemaGeneratorSettings>(jsonSchemaGeneratorSettingsData);

                var assembly = Assembly.LoadFrom(assemblyPath);
                var type = assembly.GetType(controllerClassName);

                var generator = new WebApiToSwaggerGenerator(urlTemplate, jsonSchemaGeneratorSettings);
                return generator.GenerateForController(type).ToJson();
            }
            /// <exception cref="InvalidOperationException">No assembly paths have been provided.</exception>
            internal string GenerateForControllers(IEnumerable<string> controllerClassNames, string settingsData)
            {
                var settings = JsonConvert.DeserializeObject<WebApiAssemblyToSwaggerGeneratorSettings>(settingsData);

                RegisterReferencePaths(GetAllReferencePaths(settings));
                IEnumerable<Type> controllers = GetControllerTypes(controllerClassNames, settings);

                var generator = new WebApiToSwaggerGenerator(settings);
                return generator.GenerateForControllers(controllers).ToJson();
            }
示例#56
0
        public void When_route_has_path_parameter_which_is_not_an_action_parameter_then_it_is_still_added_as_path_parameter()
        {
            //// Arrange
            var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings
            {
                DefaultUrlTemplate = "api/{controller}/{action}/{id}", 
                AddMissingPathParameters = true
            });

            //// Act
            var document = generator.GenerateForController<RoutePrefixWithPathsController>();
            
            //// Assert
            var operation = document.Operations.First().Operation;
            var parameter = operation.Parameters.Single(p => p.Name == "companyIdentifier");

            Assert.AreEqual(2, operation.ActualParameters.Count);
            Assert.AreEqual(SwaggerParameterKind.Path, parameter.Kind);
            Assert.AreEqual(JsonObjectType.String, parameter.Type);
            Assert.AreEqual(JsonFormatStrings.Guid, parameter.Format);
        }
示例#57
0
 public HttpResponseMessage Swagger()
 {
     var generator = new WebApiToSwaggerGenerator(Configuration.Routes.First(r => !string.IsNullOrEmpty(r.RouteTemplate)).RouteTemplate);
     var service = generator.Generate(GetType(), "Swagger");
     return new HttpResponseMessage { Content = new StringContent(service.ToJson(), Encoding.UTF8) };
 }
            internal string GenerateForAssemblyControllers(string settingsData)
            {
                var settings = JsonConvert.DeserializeObject<WebApiAssemblyToSwaggerGeneratorSettings>(settingsData);

                var assembly = Assembly.LoadFrom(settings.AssemblyPath);
                var controllers = assembly.ExportedTypes
                    .Where(t => t.InheritsFrom("ApiController") || t.InheritsFrom("Controller")).ToArray(); 

                var generator = new WebApiToSwaggerGenerator(settings);
                return generator.GenerateForControllers(controllers).ToJson();
            }
示例#59
0
 public HttpResponseMessage Swagger()
 {
     var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings
     {
         DefaultUrlTemplate = Configuration.Routes.First(r => !string.IsNullOrEmpty(r.RouteTemplate)).RouteTemplate
     });
     var document = generator.GenerateForController(GetType());
     return new HttpResponseMessage { Content = new StringContent(document.ToJson(), Encoding.UTF8) };
 }