public static string EnsureTaskNameWithNamespaceIfNeeded(ResponseTypeNameAndItemSchema contractReturnTypeNameAndSchema)
    {
        ArgumentNullException.ThrowIfNull(contractReturnTypeNameAndSchema);

        return(ContainsModelNameTask(contractReturnTypeNameAndSchema.FullModelName) ||
               (contractReturnTypeNameAndSchema.HasSchema &&
                contractReturnTypeNameAndSchema.Schema !.HasModelNameOrAnyPropertiesWithModelName("Task"))
            ? "System.Threading.Tasks.Task"
            : "Task");
    }
    private static void AppendTest400BadRequestInHeader(
        StringBuilder sb,
        EndpointMethodMetadata endpointMethodMetadata,
        ResponseTypeNameAndItemSchema contractReturnTypeName)
    {
        var headerRequiredParameters = endpointMethodMetadata.GetHeaderRequiredParameters();
        var testForParameters        = headerRequiredParameters
                                       .Where(x => x.Schema.GetDataType() != OpenApiDataTypeConstants.String)
                                       .ToList();

        if (headerRequiredParameters.Count == 0)
        {
            return;
        }

        var relativeRef = RenderRelativeRef(endpointMethodMetadata);

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

                sb.AppendLine();
            }

            AppendNewRequestModel(12, sb, endpointMethodMetadata, contractReturnTypeName.StatusCode);
            sb.AppendLine();
            AppendActHttpClientOperation(12, sb, endpointMethodMetadata.HttpOperation, useData: 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 void AppendTest400BadRequestInQuery(
        StringBuilder sb,
        EndpointMethodMetadata endpointMethodMetadata,
        ResponseTypeNameAndItemSchema contractReturnTypeName)
    {
        var renderRelativeRefs = RenderRelativeRefsForQuery(endpointMethodMetadata, useForBadRequest: true);

        if (renderRelativeRefs.Count == 0)
        {
            return;
        }

        sb.AppendLine();
        sb.AppendLine(8, "[Theory]");
        foreach (var renderRelativeRef in renderRelativeRefs)
        {
            sb.AppendLine(8, $"[InlineData(\"{renderRelativeRef}\")]");
        }

        sb.AppendLine(8, $"public async Task {endpointMethodMetadata.MethodName}_BadRequest_InQuery(string relativeRef)");
        AppendTextContent(sb, endpointMethodMetadata, HttpStatusCode.BadRequest, contractReturnTypeName);
    }
    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, "}");
        }
    }