public static void Generate(
        ILogger logger,
        HostProjectOptions hostProjectOptions,
        EndpointMethodMetadata endpointMethodMetadata)
    {
        ArgumentNullException.ThrowIfNull(logger);
        ArgumentNullException.ThrowIfNull(hostProjectOptions);
        ArgumentNullException.ThrowIfNull(endpointMethodMetadata);

        var sb = new StringBuilder();

        AppendUsingStatements(sb, hostProjectOptions, endpointMethodMetadata);
        sb.AppendLine();
        GenerateCodeHelper.AppendGeneratedCodeWarningComment(sb, hostProjectOptions.ToolNameAndVersion);
        AppendNamespaceAndClassStart(sb, hostProjectOptions, endpointMethodMetadata);
        AppendConstructor(sb, endpointMethodMetadata);
        AppendTestMethod(sb, endpointMethodMetadata);

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormData())
        {
            AppendGetMultipartFormDataContentRequestMethod(sb, endpointMethodMetadata, endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormDataAndHasInlineSchemaFile());
        }
        else if (endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartOctetStreamData())
        {
            AppendGetSingleFormDataContentRequestMethod(sb, endpointMethodMetadata);
        }

        AppendNamespaceAndClassEnd(sb);
        SaveFile(logger, sb, hostProjectOptions, endpointMethodMetadata);
    }
    private static void AppendTextContent(
        StringBuilder sb,
        EndpointMethodMetadata endpointMethodMetadata,
        HttpStatusCode testExpectedHttpStatusCode,
        ResponseTypeNameAndItemSchema contractReturnTypeName)
    {
        sb.AppendLine(8, "{");
        if (endpointMethodMetadata.HasContractParameterAnyParametersOrRequestBody())
        {
            sb.AppendLine(12, "// Arrange");
            var headerParameters = endpointMethodMetadata.GetHeaderParameters();
            if (headerParameters.Count > 0)
            {
                foreach (var headerParameter in headerParameters)
                {
                    var propertyValueGenerated = PropertyValueGenerator(headerParameter, endpointMethodMetadata.ComponentsSchemas, useForBadRequest: false, customValue: null);
                    sb.AppendLine(
                        12,
                        $"HttpClient.DefaultRequestHeaders.Add(\"{headerParameter.Name}\", \"{propertyValueGenerated}\");");
                }

                sb.AppendLine();
            }

            var isContractParameterRequestBodyUsedAsMultipartOctetStreamData = endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartOctetStreamData();
            if (isContractParameterRequestBodyUsedAsMultipartOctetStreamData)
            {
                sb.AppendLine(12, "var data = GetTestFile();");
            }
            else
            {
                var isModelCreated = AppendNewRequestModel(12, sb, endpointMethodMetadata, contractReturnTypeName.StatusCode);
                if (!isModelCreated &&
                    endpointMethodMetadata.HttpOperation.IsRequestBodySupported())
                {
                    sb.AppendLine(12, "var data = \"{ }\";");
                }
            }

            sb.AppendLine();

            if (endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormData())
            {
                AppendActHttpClientOperationForMultipartFormData(
                    12,
                    sb,
                    endpointMethodMetadata.HttpOperation,
                    endpointMethodMetadata.GetRequestBodyModelName() !);
            }
            else if (isContractParameterRequestBodyUsedAsMultipartOctetStreamData)
            {
                AppendActHttpClientOperationForMultipartFormData(
                    12,
                    sb,
                    endpointMethodMetadata.HttpOperation,
                    $"{endpointMethodMetadata.MethodName}{NameConstants.Request}");
            }
            else
            {
                AppendActHttpClientOperation(12, sb, endpointMethodMetadata.HttpOperation, useData: true);
            }
        }
        else
        {
            AppendActHttpClientOperation(12, sb, endpointMethodMetadata.HttpOperation);
        }

        sb.AppendLine();
        sb.AppendLine(12, "// Assert");
        sb.AppendLine(12, "response.Should().NotBeNull();");
        sb.AppendLine(12, $"response.StatusCode.Should().Be(HttpStatusCode.{testExpectedHttpStatusCode});");

        if (testExpectedHttpStatusCode == HttpStatusCode.OK &&
            !string.IsNullOrEmpty(contractReturnTypeName.FullModelName) &&
            contractReturnTypeName.Schema is not null &&
            !contractReturnTypeName.Schema.IsSimpleDataType() &&
            !(endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartOctetStreamData() || endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormData()))
        {
            var modelName = OpenApiDocumentSchemaModelNameHelper.EnsureModelNameWithNamespaceIfNeeded(endpointMethodMetadata, contractReturnTypeName.FullModelName);

            sb.AppendLine();
            sb.AppendLine(12, $"var responseData = await response.DeserializeAsync<{modelName}>(JsonSerializerOptions);");
            sb.AppendLine(12, "responseData.Should().NotBeNull();");
        }

        sb.AppendLine(8, "}");
    }
    private static void AppendTest400BadRequestInBody(
        StringBuilder sb,
        EndpointMethodMetadata endpointMethodMetadata,
        ResponseTypeNameAndItemSchema contractReturnTypeName)
    {
        if (!endpointMethodMetadata.HasContractParameterRequestBody())
        {
            return;
        }

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormData())
        {
            return;
        }

        var schema = endpointMethodMetadata.ContractParameter?.ApiOperation.RequestBody?.Content.GetSchemaByFirstMediaType();

        if (schema is null)
        {
            return;
        }

        var modelName = schema.GetModelName();

        if (string.IsNullOrEmpty(modelName))
        {
            return;
        }

        var modelSchema     = endpointMethodMetadata.ComponentsSchemas.GetSchemaByModelName(modelName);
        var relevantSchemas = endpointMethodMetadata.GetRelevantSchemasForBadRequestBodyParameters(modelSchema);

        var headerRequiredParameters = endpointMethodMetadata.GetHeaderRequiredParameters();

        var relativeRef = RenderRelativeRef(endpointMethodMetadata);

        foreach (var testForSchema in relevantSchemas)
        {
            sb.AppendLine();
            sb.AppendLine(8, "[Theory]");
            sb.AppendLine(8, $"[InlineData(\"{relativeRef}\")]");
            sb.AppendLine(8, $"public async Task {endpointMethodMetadata.MethodName}_BadRequest_InBody_{testForSchema.Key.EnsureFirstCharacterToUpper()}(string relativeRef)");
            sb.AppendLine(8, "{");
            sb.AppendLine(12, "// Arrange");
            if (headerRequiredParameters.Count > 0)
            {
                foreach (var headerParameter in headerRequiredParameters)
                {
                    var propertyValueGenerated = PropertyValueGenerator(headerParameter, endpointMethodMetadata.ComponentsSchemas, useForBadRequest: false, customValue: null);
                    sb.AppendLine(
                        12,
                        $"HttpClient.DefaultRequestHeaders.Add(\"{headerParameter.Name}\", \"{propertyValueGenerated}\");");
                }

                sb.AppendLine();
            }

            AppendNewRequestModelForBadRequest(12, sb, endpointMethodMetadata, contractReturnTypeName.StatusCode, testForSchema);
            sb.AppendLine();
            AppendActHttpClientOperation(12, sb, endpointMethodMetadata.HttpOperation, useData: true, isDataJson: true);
            sb.AppendLine();
            sb.AppendLine(12, "// Assert");
            sb.AppendLine(12, "response.Should().NotBeNull();");
            sb.AppendLine(12, $"response.StatusCode.Should().Be(HttpStatusCode.{HttpStatusCode.BadRequest});");
            sb.AppendLine(8, "}");
        }
    }
    private static List <string> GetUsingStatements(
        HostProjectOptions hostProjectOptions,
        EndpointMethodMetadata endpointMethodMetadata)
    {
        var systemList = new List <string>
        {
            "System.CodeDom.Compiler",
            "System.Net",
            "System.Threading.Tasks",
        };

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsingSystemNamespace())
        {
            systemList.Add("System");
        }

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsingStringBuilder())
        {
            systemList.Add("System.Text");
        }

        if (endpointMethodMetadata.IsContractReturnTypeUsingList() ||
            endpointMethodMetadata.IsContractParameterRequestBodyUsingSystemCollectionGenericNamespace())
        {
            systemList.Add("System.Collections.Generic");
        }

        var list = new List <string>
        {
            "Atc.XUnit",
            "FluentAssertions",
            "Xunit",
        };

        if (endpointMethodMetadata.IsContractReturnTypeUsingPagination())
        {
            list.Add("Atc.Rest.Results");
        }

        if (!endpointMethodMetadata.IsContractReturnTypeUsingTaskName() &&
            (endpointMethodMetadata.HasSharedModelOrEnumInContractParameterRequestBody() ||
             endpointMethodMetadata.HasSharedModelOrEnumInContractReturnType(includeProperties: false)))
        {
            list.Add($"{hostProjectOptions.ProjectName}.Generated.Contracts");
        }

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsed() ||
            endpointMethodMetadata.HasContractReturnTypeAsComplex())
        {
            systemList.Add("System.Net.Http");

            if (!endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartOctetStreamData() &&
                !endpointMethodMetadata.IsContractReturnTypeUsingTaskName())
            {
                list.Add($"{hostProjectOptions.ProjectName}.Generated.Contracts.{endpointMethodMetadata.SegmentName}");
            }
        }
        else if (endpointMethodMetadata.HasContractReturnTypeAsComplexAsListOrPagination())
        {
            systemList.Add("System.Net.Http");
        }

        if (endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartFormData() ||
            endpointMethodMetadata.IsContractParameterRequestBodyUsedAsMultipartOctetStreamData())
        {
            list.Add("Microsoft.AspNetCore.Http");
        }

        return(systemList
               .OrderBy(x => x)
               .Concat(list
                       .OrderBy(x => x))
               .ToList());
    }