Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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"]);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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("));
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        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);
        }
Пример #12
0
        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());
        }
Пример #13
0
        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]);
        }
Пример #14
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
        }
Пример #15
0
        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);
        }
Пример #16
0
        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"));
        }
Пример #18
0
        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);
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #24
0
        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());
        }
Пример #25
0
        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\""));
        }
Пример #26
0
        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);
        }
Пример #27
0
        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);
        }
Пример #28
0
        public async Task When_multple_responses_with_same_status_code_are_defined_then_they_are_merged_and_common_base_type_used_as_response_schema()
        {
            /// Arrange
            var generator = new 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);
        }
Пример #29
0
        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);
        }
Пример #30
0
        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);
        }