public async Task When_parameter_is_nullable_then_it_is_optional() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings { IsAspNetCore = true }); //// Act var document = await generator.GenerateForControllerAsync <MyTestClass>(); var json = document.ToJson(); //// Assert Assert.IsTrue(document.Operations.First().Operation.Parameters[1].IsRequired); Assert.IsFalse(document.Operations.Last().Operation.Parameters[1].IsRequired); }
public async Task When_FromUri_has_array_property_then_collectionFormat_is_set_to_multi() { //// 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_Filter").Operation; //// Assert Assert.AreEqual(SwaggerParameterCollectionFormat.Multi, operation.ActualParameters[0].CollectionFormat); }
public async Task When_usecancellationtokenparameter_notsetted_then_cancellationtoken_isnot_added() { //// Arrange var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new SwaggerToCSharpWebApiControllerGenerator(document, new SwaggerToCSharpWebApiControllerGeneratorSettings { ControllerStyle = CSharpControllerStyle.Abstract }); var code = codeGen.GenerateFile(); //// Assert Assert.IsFalse(code.Contains("System.Threading.CancellationToken cancellationToken")); }
public async Task 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 = await generator.GenerateForControllerAsync <PersonsController>(); var swaggerSpecification = document.ToJson(); //// Assert Assert.AreEqual(10, document.Operations.Count()); }
public async Task When_FromBody_and_xml_document_then_consumes_is_xml() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <MyXmlController>(); var json = document.ToJson(); //// Assert var operation = document.Operations.First().Operation; Assert.AreEqual("application/xml", operation.Consumes[0]); Assert.IsNull(operation.Parameters.First().Schema); }
public async Task When_action_has_ApiExplorerSettingsAttribute_with_IgnoreApi_then_it_is_ignored() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings { IsAspNetCore = true }); //// Act var document = await generator.GenerateForControllerAsync <TestController>(); var json = document.ToJson(); //// Assert Assert.AreEqual(1, document.Operations.Count()); Assert.AreEqual("Test_Foo", document.Operations.Single().Operation.OperationId); }
public async Task When_parameter_is_primitive_and_has_FromBody_then_it_is_a_body_parameter() { //// 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_WithFromBodyAttribute").Operation; //// Assert Assert.AreEqual(SwaggerParameterKind.Body, operation.ActualParameters[0].Kind); }
public async Task When_code_is_generated_then_by_default_the_system_httpclient_is_used() { //// Arrange var swaggerGenerator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings { InjectHttpClient = false }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("var client_ = new System.Net.Http.HttpClient();", code); }
public async Task When_response_is_file_and_stream_is_not_used_then_byte_array_is_returned() { //// Arrange var swaggerGenerator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FileDownloadController>(); //// Act var codeGen = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings { GenerateClientInterfaces = true }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("System.Threading.Tasks.Task<FileResponse> DownloadFileAsync();", code); Assert.Contains("ReadAsStreamAsync()", code); }
public async Task When_operation_has_tags_attribute_with_AddToDocument_then_it_is_added_to_document() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <TagsTest4Controller>(); //// Assert Assert.AreEqual(2, document.Tags.Count); Assert.AreEqual("foo", document.Tags[0].Name); Assert.AreEqual("bar", document.Tags[1].Name); Assert.AreEqual(2, document.Operations.First().Operation.Tags.Count); Assert.AreEqual("foo", document.Operations.First().Operation.Tags[0]); Assert.AreEqual("bar", document.Operations.First().Operation.Tags[1]); }
public async Task When_setting_is_enabled_with_enum_fromuri_should_make_enum_nullable() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings()); var document = await generator.GenerateForControllerAsync <TestController>(); //// Act var codeGenerator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings { GenerateOptionalParameters = true }); var code = codeGenerator.GenerateFile(); //// Assert Assert.IsFalse(code.Contains("TestWithEnumAsync(MyEnum myEnum = null)")); Assert.IsTrue(code.Contains("TestWithEnumAsync(MyEnum? myEnum = null)")); }
public async Task When_controller_has_RoutePrefix_then_paths_are_correct() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var swagger = await generator.GenerateForControllerAsync <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]); Assert.IsTrue(swagger.Paths.Count == 3); Assert.IsTrue(swagger.Paths.SelectMany(p => p.Value).Count() == 6); }
public async Task When_parameter_is_file_collection_then_type_is_correct_and_collection_format_is_multi() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync(typeof(FileCollectionController)); //// Assert var operation = document.Paths["/upload"][SwaggerOperationMethod.Post]; var parameter = operation.ActualParameters.Single(p => p.Name == "files"); Assert.AreEqual(JsonObjectType.File, parameter.Type); Assert.AreEqual(SwaggerParameterCollectionFormat.Multi, parameter.CollectionFormat); Assert.AreEqual("multipart/form-data", operation.Consumes[0]); }
public async Task When_setting_is_enabled_with_class_fromuri_should_make_enum_nullable() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await generator.GenerateForControllerAsync <TestController>(); //// Act var codeGenerator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings { GenerateOptionalParameters = true }); var code = codeGenerator.GenerateFile(); //// Assert Assert.IsFalse(code.Contains("TestWithClassAsync(string myString = null, MyEnum myEnum = null, int? myInt = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))")); Assert.IsTrue(code.Contains("TestWithClassAsync(string myString = null, MyEnum? myEnum = null, int? myInt = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))")); }
public async Task When_setting_is_enabled_then_optional_parameters_have_null_optional_value() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await generator.GenerateForControllerAsync <TestController>(); //// Act 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))")); Assert.IsFalse(code.Contains("TestAsync(string a, string b, string c)")); }
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>(); //// Act var gen = new SwaggerToTypeScriptClientGenerator(document, new SwaggerToTypeScriptClientGeneratorSettings { Template = TypeScriptTemplate.JQueryCallbacks }); 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; charset=UTF-8\"")); }
public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_and_requesthasparameter_then_cancellationtoken_is_added() { //// Arrange var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new SwaggerToCSharpControllerGenerator(document, new SwaggerToCSharpControllerGeneratorSettings { ControllerStyle = CSharpControllerStyle.Abstract, UseCancellationToken = true }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("System.Threading.Tasks.Task<string> Foo(string test, bool test2, System.Threading.CancellationToken cancellationToken)", code); }
public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_returned_web_api() { //// Arrange var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new SwaggerToCSharpControllerGenerator(document, new SwaggerToCSharpControllerGeneratorSettings { WrapResponses = true }); var code = codeGen.GenerateFile(); //// Assert Assert.IsTrue(code.Contains("Task<SwaggerResponse<string>>")); Assert.IsTrue(code.Contains("Task<SwaggerResponse>")); }
public async Task When_path_parameter_embedded_in_ComplexType_from_uri_then_path_param_is_generated() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync(typeof(FromUriParameterController)); //// Assert var operation = document.Paths["/fetch/{id}"][SwaggerOperationMethod.Get]; var parameter = operation.ActualParameters.Single(p => p.Name == "Id"); Assert.AreEqual(JsonObjectType.String, parameter.Type); Assert.AreEqual(SwaggerParameterKind.Path, parameter.Kind); Assert.IsNull(operation.Consumes); }
public async Task When_custom_http_client_type_is_specified_then_an_instance_of_that_type_is_used() { //// Arrange var swaggerGenerator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new SwaggerToCSharpClientGenerator(document, new SwaggerToCSharpClientGeneratorSettings { HttpClientType = "CustomNamespace.CustomHttpClient" }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("var client_ = new CustomNamespace.CustomHttpClient();", code); }
public async Task When_response_is_file_then_mime_type_is_bytes() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <FileResponseController>(); var json = document.ToJson(); //// Assert var operation = document.Operations.First().Operation; //Assert.AreEqual("application/octet-stream", operation.ActualProduces.First()); Assert.AreEqual(JsonObjectType.File, operation.ActualResponses.First().Value.Schema.Type); // TODO: File response should produce application/octet-stream }
public async Task When_swagger_spec_is_generated_then_no_route_problem_is_detected() { /// Arrange var settings = new WebApiToSwaggerGeneratorSettings { DefaultUrlTemplate = "{controller}/{id}", AddMissingPathParameters = false, }; /// Act var generator = new WebApiToSwaggerGenerator(settings); var document = await generator.GenerateForControllerAsync <ProductsController>(); var swaggerSpecification = document.ToJson(); /// Assert Assert.IsNotNull(swaggerSpecification); }
public async Task When_aspnet_actiontype_inuse_with_abstract_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.Abstract, UseActionResultType = true }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("public abstract System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.ActionResult<string>> Foo(string test, bool test2);", code); Assert.Contains("public abstract System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult> Bar();", code); }
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(); //// Act var codeGen = new SwaggerToCSharpControllerGenerator(document, settings); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("partial 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_route_contains_path_parameter_and_action_method_proper_parameter_then_it_is_generated_as_parameter() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiAssemblyToSwaggerGeneratorSettings { IsAspNetCore = true }); //// Act var document = await generator.GenerateForControllerAsync <FoodsController>(); var json = document.ToJson(); //// Assert var operation = document.Operations.First(); Assert.IsTrue(operation.Path.Contains("{regionId}")); Assert.AreEqual("regionId", operation.Operation.Parameters.First().Name); }
public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasparameter_then_cancellationtoken_is_added() { //// Arrange var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new SwaggerToCSharpWebApiControllerGenerator(document, new SwaggerToCSharpWebApiControllerGeneratorSettings { UseCancellationToken = true }); var code = codeGen.GenerateFile(); //// Assert Assert.IsTrue(code.Contains("System.Threading.Tasks.Task<string> FooAsync(string test, bool test2, System.Threading.CancellationToken cancellationToken)")); Assert.IsTrue(code.Contains("_implementation.FooAsync(test, test2, cancellationToken);")); Assert.IsTrue(code.Contains("public System.Threading.Tasks.Task<string> Foo(string test, bool test2, System.Threading.CancellationToken cancellationToken)")); }
public async Task When_controllergenerationformat_notsetted_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 { }); 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_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasnoparameter_then_cancellationtoken_is_added() { //// Arrange var swaggerGen = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new SwaggerToCSharpControllerGenerator(document, new SwaggerToCSharpControllerGeneratorSettings { UseCancellationToken = true }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("(System.Threading.CancellationToken cancellationToken)", code); Assert.Contains("_implementation.BarAsync(cancellationToken)", code); Assert.Contains("System.Threading.Tasks.Task BarAsync(System.Threading.CancellationToken cancellationToken)", code); }
public async Task When_ConfigurationClass_is_set_then_correct_ctor_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" }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("public FooClient(MyConfig configuration) : base(configuration)", code); }
public async Task When_operation_has_extension_data_attributes_then_they_are_processed() { //// Arrange var generator = new WebApiToSwaggerGenerator(new WebApiToSwaggerGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <TagsTest3Controller>(); //// Assert var extensionData = document.Operations.First().Operation.ExtensionData; Assert.AreEqual(2, extensionData.Count); Assert.AreEqual("b", document.Operations.First().Operation.ExtensionData["a"]); Assert.AreEqual("y", document.Operations.First().Operation.ExtensionData["x"]); Assert.AreEqual("foo", document.Operations.First().Operation.Parameters.First().Name); Assert.AreEqual("d", document.Operations.First().Operation.Parameters.First().ExtensionData["c"]); }