Пример #1
0
        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);
        }
Пример #2
0
        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"));
        }
Пример #4
0
        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());
        }
Пример #5
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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]);
        }
Пример #11
0
        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)"));
        }
Пример #12
0
        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);
        }
Пример #13
0
        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]);
        }
Пример #14
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))"));
        }
Пример #15
0
        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)"));
        }
Пример #16
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>();

            //// 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\""));
        }
Пример #17
0
        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);
        }
Пример #18
0
        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>"));
        }
Пример #19
0
        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);
        }
Пример #21
0
        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
        }
Пример #22
0
        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);
        }
Пример #25
0
        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)"));
        }
Пример #27
0
        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"));
        }
Пример #28
0
        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);
        }
Пример #30
0
        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"]);
        }