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