private static async Task <CSharpClientGenerator> GenerateCode(bool allowNullableBodyParameters) { var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { AllowNullableBodyParameters = allowNullableBodyParameters }); var document = await swaggerGenerator.GenerateForControllerAsync <TestController>(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { InjectHttpClient = false, ConfigurationClass = "MyConfig", ClientBaseClass = "MyBaseClass" }); return(generator); }
public async Task When_success_responses_are_wrapped_then_SwaggerResponse_is_returned_web_api() { // Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); // Act var codeGen = new CSharpControllerGenerator(document, new CSharpControllerGeneratorSettings { WrapResponses = true }); var code = codeGen.GenerateFile(); // Assert Assert.Contains("Task<SwaggerResponse<string>>", code); Assert.Contains("Task<SwaggerResponse>", code); }
public async Task When_operation_has_extension_data_attributes_then_they_are_processed() { // Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); // 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"]); }
public async Task When_controllerstyleisabstract_and_usecancellationtokenistrue_and_requesthasnoparameter_then_cancellationtoken_is_added() { // Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); // Act var codeGen = new CSharpControllerGenerator(document, new CSharpControllerGeneratorSettings { ControllerStyle = CSharpControllerStyle.Abstract, UseCancellationToken = true }); var code = codeGen.GenerateFile(); // Assert Assert.Contains("abstract System.Threading.Tasks.Task Bar(" + "System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", code); }
public async Task When_client_base_interface_is_specified_then_client_interface_extends_it() { // Arrange var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { GenerateClientInterfaces = true, ClientBaseInterface = "IClientBase" }); // Act var code = generator.GenerateFile(); // Assert Assert.Contains("public partial interface IFooClient : IClientBase", code); }
public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasparameter_then_cancellationtoken_is_added() { //// Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new CSharpControllerGenerator(document, new CSharpControllerGeneratorSettings { UseCancellationToken = true }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("System.Threading.Tasks.Task<string> FooAsync(string test, bool test2, System.Threading.CancellationToken cancellationToken)", code); Assert.Contains("_implementation.FooAsync(test, test2, cancellationToken);", code); Assert.Contains("public System.Threading.Tasks.Task<string> Foo([Microsoft.AspNetCore.Mvc.FromQuery] string test, [Microsoft.AspNetCore.Mvc.FromQuery] bool test2, System.Threading.CancellationToken cancellationToken)", code); }
public async Task When_two_methods_have_same_name_then_generated_id_is_still_different() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await generator.GenerateForControllerAsync <PointController>(); var codeGenerator = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { OperationNameGenerator = new MultipleClientsFromOperationIdOperationNameGenerator() }); //// Act var code = codeGenerator.GenerateFile(); //// Assert Assert.IsTrue(code.Contains(" get(")); Assert.IsTrue(code.Contains(" getAll(")); }
public async Task When_swagger_spec_is_generated_then_no_route_problem_is_detected() { // Arrange var settings = new WebApiOpenApiDocumentGeneratorSettings { DefaultUrlTemplate = "{controller}/{id}", AddMissingPathParameters = false, }; // Act var generator = new WebApiOpenApiDocumentGenerator(settings); var document = await generator.GenerateForControllerAsync <ProductsController>(); var swaggerSpecification = document.ToJson(); // Assert Assert.IsNotNull(swaggerSpecification); }
public async Task When_route_contains_path_parameter_and_action_method_proper_parameter_then_it_is_generated_as_parameter() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { 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_custom_http_client_type_is_specified_then_an_instance_of_that_type_is_used() { //// Arrange var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { HttpClientType = "CustomNamespace.CustomHttpClient", InjectHttpClient = false }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("var client_ = new CustomNamespace.CustomHttpClient();", code); }
public async Task When_controllerstyleispartial_and_usecancellationtokenistrue_and_requesthasnoparameter_then_cancellationtoken_is_added() { //// Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new CSharpControllerGenerator(document, new CSharpControllerGeneratorSettings { 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_parameter_is_file_collection_then_type_is_correct_and_collection_format_is_multi() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync(typeof(FileCollectionController)); //// Assert var operation = document.Paths["/upload"][OpenApiOperationMethod.Post]; var parameter = operation.ActualParameters.Single(p => p.Name == "files"); Assert.AreEqual(JsonObjectType.File, parameter.Type); Assert.AreEqual(OpenApiParameterCollectionFormat.Multi, parameter.CollectionFormat); Assert.AreEqual(1, operation.ActualConsumes.Count()); Assert.AreEqual("multipart/form-data", operation.ActualConsumes.First()); }
public async Task When_parameter_is_from_uri_and_has_file_then_two_params_and_consumes_is_correct() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync(typeof(FromUriFileParameterController)); var json = document.ToJson(); //// Assert var operation = document.Paths["/upload"][OpenApiOperationMethod.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 async Task When_response_is_file_then_mime_type_is_bytes() { // Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); // 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_parameter_is_complex_and_has_CustomBinding_with_no_WillReadBody_then_it_is_a_body_parameter() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { DefaultUrlTemplate = "api/{controller}/{action}/{id}" }); //// Act var document = await generator.GenerateForControllerAsync <TestController>(); var operation = document.Operations.Single(o => o.Operation.OperationId == "Test_WithCustomFromBody2ParameterBinder").Operation; var json = document.ToJson(); //// Assert Assert.AreEqual(OpenApiParameterKind.Body, operation.ActualParameters[0].Kind); Assert.AreEqual("data", operation.ActualParameters[0].Name); }
public async Task When_controller_has_RoutePrefix_with_optional_parameters_then_paths_are_correct() { // Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); // Act var swagger = await generator.GenerateForControllerAsync <UsersController>(); // Assert Assert.IsNotNull(swagger.Paths["/api/users"][OpenApiOperationMethod.Get]); Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][OpenApiOperationMethod.Get]); Assert.IsNotNull(swagger.Paths["/api/users"][OpenApiOperationMethod.Post]); Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][OpenApiOperationMethod.Put]); Assert.IsNotNull(swagger.Paths["/api/users/{userId}"][OpenApiOperationMethod.Delete]); Assert.IsNotNull(swagger.Paths["/api/users/{userId}/devices"][OpenApiOperationMethod.Get]); Assert.IsNotNull(swagger.Paths["/api/users/{userId}/devices/{deviceId}"][OpenApiOperationMethod.Get]); Assert.IsTrue(swagger.Paths.Count == 4); Assert.IsTrue(swagger.Paths.SelectMany(p => p.Value).Count() == 7); }
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 WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { 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_success_responses_are_wrapped_then_SwaggerResponse_is_returned_web_api_aspnetcore() { //// Arrange var swaggerGen = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { IsAspNetCore = true }); var document = await swaggerGen.GenerateForControllerAsync <TestController>(); //// Act var codeGen = new CSharpControllerGenerator(document, new CSharpControllerGeneratorSettings { WrapResponses = true, }); var code = codeGen.GenerateFile(); //// Assert Assert.Contains("System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>", code); }
public async Task When_parameter_is_from_uri_then_two_params_are_generated() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync(typeof(FromUriParameterController)); //// Assert var operation = document.Paths["/upload"][OpenApiOperationMethod.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); }
public async Task When_parameters_are_from_uri_then_query_params_are_generated() { // Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); // Act var document = await generator.GenerateForControllerAsync(typeof(FromUriParameterController)); // Assert var operation = document.Paths["/fetch-all"][OpenApiOperationMethod.Get]; Assert.AreEqual(JsonObjectType.String, operation.ActualParameters.Single(p => p.Name == "Foo").Type); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters.Single(p => p.Name == "Foo").Kind); Assert.AreEqual(JsonObjectType.String, operation.ActualParameters.Single(p => p.Name == "Bar").Type); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters.Single(p => p.Name == "Bar").Kind); Assert.IsNull(operation.Consumes); }
public async Task When_UseHttpRequestMessageCreationMethod_is_set_then_CreateRequestMessage_is_generated() { //// Arrange var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { ConfigurationClass = "MyConfig", ClientBaseClass = "MyBaseClass", UseHttpRequestMessageCreationMethod = true }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)", code); }
public async Task When_ConfigurationClass_is_set_then_correct_ctor_is_generated() { //// Arrange var swaggerGenerator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await swaggerGenerator.GenerateForControllerAsync <FooController>(); var generator = new CSharpClientGenerator(document, new CSharpClientGeneratorSettings { InjectHttpClient = false, ConfigurationClass = "MyConfig", ClientBaseClass = "MyBaseClass" }); //// Act var code = generator.GenerateFile(); //// Assert Assert.Contains("public FooClient(MyConfig configuration) : base(configuration)", code); }
public async Task When_model_binder_is_used_in_get_its_defined_as_query_param() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <ModelBinderQueryParametersController>(); var operation = document.Operations.First(o => o.Path == "/temptypes").Operation; //// Assert Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[0].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[1].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[2].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[3].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[4].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[5].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[6].Kind); Assert.AreEqual(OpenApiParameterKind.Query, operation.ActualParameters[7].Kind); }
public async Task When_body_parameter_is_Stream_then_consumes_is_octet_() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); //// Act var document = await generator.GenerateForControllerAsync <StreamBodyParameterController>(); var json = document.ToJson(); //// Assert var operation = document.Paths["/upload"][OpenApiOperationMethod.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()); }
public async Task When_body_is_xml_then_correct_TypeScript_is_generated() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await generator.GenerateForControllerAsync <MyXmlController>(); var settings = new TypeScriptClientGeneratorSettings { Template = TypeScriptTemplate.JQueryCallbacks }; settings.TypeScriptGeneratorSettings.TypeScriptVersion = 1.8m; //// Act var gen = new TypeScriptClientGenerator(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 WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { 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(OpenApiParameterKind.Query, parameter.Kind); Assert.AreEqual(JsonObjectType.Array, parameter.Type); Assert.AreEqual(OpenApiParameterCollectionFormat.Multi, parameter.CollectionFormat); }
public async Task When_route_has_path_parameter_which_is_not_an_action_parameter_then_it_is_still_added_as_path_parameter() { //// Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings { DefaultUrlTemplate = "api/{controller}/{action}/{id}", AddMissingPathParameters = true }); //// Act var document = await generator.GenerateForControllerAsync <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(OpenApiParameterKind.Path, parameter.Kind); Assert.AreEqual(JsonObjectType.String, parameter.Type); Assert.AreEqual(JsonFormatStrings.Guid, parameter.Format); }
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 WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); /// Act var document = await generator.GenerateForControllerAsync <TestController>(); /// Assert var operationAbc = document.Operations.Single(o => o.Path.Contains("Abc")); var responseAbc = operationAbc.Operation.ActualResponses.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.ActualResponses.First(r => r.Key == "500").Value; Assert.AreEqual(document.Definitions["Animal"].ActualSchema, responseDef.Schema.ActualSchema); Assert.AreEqual(2, responseDef.ExpectedSchemas.Count); }
public async Task Add_cancel_token_to_every_call() { // Arrange var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); var document = await generator.GenerateForControllerAsync <UrlEncodedRequestConsumingController>(); var json = document.ToJson(); // Act var codeGen = new TypeScriptClientGenerator(document, new TypeScriptClientGeneratorSettings { Template = TypeScriptTemplate.Axios, TypeScriptGeneratorSettings = { TypeScriptVersion = 2.0m } }); var code = codeGen.GenerateFile(); // Assert Assert.Contains("cancelToken?: CancelToken | undefined", code); }
public async Task When_setting_is_enabled_then_parameters_are_reordered() { var generator = new WebApiOpenApiDocumentGenerator(new WebApiOpenApiDocumentGeneratorSettings()); 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 CSharpClientGenerator(document, new CSharpClientGeneratorSettings { GenerateOptionalParameters = true }); var code = codeGenerator.GenerateFile(); //// Assert Assert.Contains("TestAsync(string a, string b, string c = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken))", code); }