Ejemplo n.º 1
0
        private static List <string> GetUsingStatements(HostProjectOptions hostProjectOptions, EndpointMethodMetadata endpointMethodMetadata)
        {
            var systemList = new List <string>
            {
                "System",
                "System.CodeDom.Compiler",
                "System.Collections.Generic",
                "System.Net",
                "System.Net.Http",
                "System.Text",
                "System.Threading.Tasks",
            }.OrderBy(x => x);

            var generalList = new List <string>
            {
                "FluentAssertions",
                "Xunit",
                $"{hostProjectOptions.ProjectName}.Generated.Contracts",
                $"{hostProjectOptions.ProjectName}.Generated.Contracts.{endpointMethodMetadata.SegmentName}",
            };

            if (endpointMethodMetadata.IsPaginationUsed())
            {
                generalList.Add("Atc.Rest.Results");
            }

            return(systemList
                   .OrderBy(x => x)
                   .Concat(generalList
                           .OrderBy(x => x))
                   .ToList());
        }
Ejemplo n.º 2
0
        public static LogKeyValueItem Generate(
            HostProjectOptions hostProjectOptions,
            EndpointMethodMetadata endpointMethodMetadata)
        {
            if (hostProjectOptions == null)
            {
                throw new ArgumentNullException(nameof(hostProjectOptions));
            }

            if (endpointMethodMetadata == null)
            {
                throw new ArgumentNullException(nameof(endpointMethodMetadata));
            }

            var sb = new StringBuilder();

            AppendUsingStatements(sb, hostProjectOptions, endpointMethodMetadata);
            sb.AppendLine();
            GenerateCodeHelper.AppendNamespaceComment(sb, hostProjectOptions.ToolNameAndVersion);
            AppendNamespaceAndClassStart(sb, hostProjectOptions, endpointMethodMetadata);
            AppendConstructor(sb, endpointMethodMetadata);
            AppendTestMethod(sb, endpointMethodMetadata);
            AppendNamespaceAndClassEnd(sb);
            return(SaveFile(sb, hostProjectOptions, endpointMethodMetadata));
        }
    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);
    }
Ejemplo n.º 4
0
 private static void AppendUsingStatements(
     StringBuilder sb,
     HostProjectOptions hostProjectOptions,
     EndpointMethodMetadata endpointMethodMetadata)
 {
     foreach (var statement in GetUsingStatements(hostProjectOptions, endpointMethodMetadata))
     {
         sb.AppendLine($"using {statement};");
     }
 }
Ejemplo n.º 5
0
 private static void AppendNamespaceAndClassStart(
     StringBuilder sb,
     HostProjectOptions hostProjectOptions,
     EndpointMethodMetadata endpointMethodMetadata)
 {
     sb.AppendLine($"namespace {hostProjectOptions.ProjectName}.Tests.Endpoints.{endpointMethodMetadata.SegmentName}.Generated");
     sb.AppendLine("{");
     GenerateCodeHelper.AppendGeneratedCodeAttribute(sb, hostProjectOptions.ToolName, hostProjectOptions.ToolVersion);
     sb.AppendLine(4, $"public class {endpointMethodMetadata.MethodName}HandlerStub : {endpointMethodMetadata.ContractInterfaceHandlerTypeName}");
     sb.AppendLine(4, "{");
 }
Ejemplo n.º 6
0
 private static void AppendNamespaceAndClassStart(
     StringBuilder sb,
     HostProjectOptions hostProjectOptions,
     EndpointMethodMetadata endpointMethodMetadata)
 {
     sb.AppendLine($"namespace {hostProjectOptions.ProjectName}.Tests.Endpoints.{endpointMethodMetadata.SegmentName}.Generated");
     sb.AppendLine("{");
     GenerateCodeHelper.AppendGeneratedCodeAttribute(sb, hostProjectOptions.ToolName, hostProjectOptions.ToolVersion);
     sb.AppendLine(4, "[Collection(\"Sequential-Endpoints\")]");
     sb.AppendLine(4, $"public class {endpointMethodMetadata.MethodName}Tests : WebApiControllerBaseTest");
     sb.AppendLine(4, "{");
 }
Ejemplo n.º 7
0
        private static LogKeyValueItem SaveFile(
            StringBuilder sb,
            HostProjectOptions hostProjectOptions,
            EndpointMethodMetadata endpointMethodMetadata)
        {
            var pathA    = Path.Combine(hostProjectOptions.PathForTestGenerate !.FullName, "Endpoints");
            var pathB    = Path.Combine(pathA, endpointMethodMetadata.SegmentName);
            var pathC    = Path.Combine(pathB, "Generated");
            var fileName = $"{endpointMethodMetadata.MethodName}Tests.cs";
            var file     = new FileInfo(Path.Combine(pathC, fileName));

            return(TextFileHelper.Save(file, sb.ToString()));
        }
    private static void SaveFile(
        ILogger logger,
        StringBuilder sb,
        HostProjectOptions hostProjectOptions,
        EndpointMethodMetadata endpointMethodMetadata)
    {
        var pathA    = Path.Combine(hostProjectOptions.PathForTestGenerate !.FullName, "Endpoints");
        var pathB    = Path.Combine(pathA, endpointMethodMetadata.SegmentName);
        var pathC    = Path.Combine(pathB, "Generated");
        var fileName = $"{endpointMethodMetadata.MethodName}Tests.cs";
        var file     = new FileInfo(Path.Combine(pathC, fileName));

        var fileDisplayLocation = file.FullName.Replace(hostProjectOptions.PathForTestGenerate.FullName, "test: ", StringComparison.Ordinal);

        TextFileHelper.Save(logger, file, fileDisplayLocation, sb.ToString());
    }
Ejemplo n.º 9
0
        private static void AppendUsingStatements(
            StringBuilder sb,
            HostProjectOptions hostProjectOptions,
            EndpointMethodMetadata endpointMethodMetadata)
        {
            sb.AppendLine("using System;");
            sb.AppendLine("using System.CodeDom.Compiler;");
            sb.AppendLine("using System.Collections.Generic;");
            sb.AppendLine("using System.Threading;");
            sb.AppendLine("using System.Threading.Tasks;");
            if (endpointMethodMetadata.IsPaginationUsed())
            {
                sb.AppendLine("using Atc.Rest.Results;");
            }

            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts;");
            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts.{endpointMethodMetadata.SegmentName};");
        }
Ejemplo n.º 10
0
        public static List <LogKeyValueItem> GenerateServerHost(
            string projectPrefixName,
            DirectoryInfo outputPath,
            DirectoryInfo?outputTestPath,
            Tuple <OpenApiDocument, OpenApiDiagnostic, FileInfo> apiDocument,
            ApiOptions apiOptions,
            DirectoryInfo apiPath,
            DirectoryInfo domainPath)
        {
            if (projectPrefixName == null)
            {
                throw new ArgumentNullException(nameof(projectPrefixName));
            }

            if (outputPath == null)
            {
                throw new ArgumentNullException(nameof(outputPath));
            }

            if (apiDocument == null)
            {
                throw new ArgumentNullException(nameof(apiDocument));
            }

            if (apiOptions == null)
            {
                throw new ArgumentNullException(nameof(apiOptions));
            }

            if (apiPath == null)
            {
                throw new ArgumentNullException(nameof(apiPath));
            }

            if (domainPath == null)
            {
                throw new ArgumentNullException(nameof(domainPath));
            }

            var hostProjectOptions  = new HostProjectOptions(outputPath, outputTestPath, apiDocument.Item1, apiDocument.Item3, projectPrefixName, apiOptions, apiPath, domainPath);
            var serverHostGenerator = new ServerHostGenerator(hostProjectOptions);

            return(serverHostGenerator.Generate());
        }
    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);
        AppendMethodExecuteAsyncStart(sb, endpointMethodMetadata);
        AppendMethodExecuteAsyncContent(sb, endpointMethodMetadata);
        AppendMethodExecuteAsyncEnd(sb);
        AppendNamespaceAndClassEnd(sb);
        SaveFile(logger, sb, hostProjectOptions, endpointMethodMetadata);
    }
Ejemplo n.º 12
0
        public static LogKeyValueItem Generate(HostProjectOptions hostProjectOptions, EndpointMethodMetadata endpointMethodMetadata)
        {
            if (hostProjectOptions == null)
            {
                throw new ArgumentNullException(nameof(hostProjectOptions));
            }

            if (endpointMethodMetadata == null)
            {
                throw new ArgumentNullException(nameof(endpointMethodMetadata));
            }

            var sb = new StringBuilder();

            sb.AppendLine("using System;");
            sb.AppendLine("using System.CodeDom.Compiler;");
            sb.AppendLine("using System.Collections.Generic;");
            sb.AppendLine("using System.Net;");
            sb.AppendLine("using System.Net.Http;");
            sb.AppendLine("using System.Text;");
            sb.AppendLine("using System.Threading.Tasks;");
            sb.AppendLine("using FluentAssertions;");
            if (endpointMethodMetadata.IsPaginationUsed())
            {
                sb.AppendLine("using Atc.Rest.Results;");
            }

            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts;");
            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts.{endpointMethodMetadata.SegmentName};");
            sb.AppendLine("using Xunit;");
            sb.AppendLine();
            GenerateCodeHelper.AppendNamespaceComment(sb, hostProjectOptions.ToolNameAndVersion);
            sb.AppendLine($"namespace {hostProjectOptions.ProjectName}.Tests.Endpoints.{endpointMethodMetadata.SegmentName}.Generated");
            sb.AppendLine("{");
            GenerateCodeHelper.AppendGeneratedCodeAttribute(sb, hostProjectOptions.ToolName, hostProjectOptions.ToolVersion);
            sb.AppendLine(4, "[Collection(\"Sequential-Endpoints\")]");
            sb.AppendLine(4, $"public class {endpointMethodMetadata.MethodName}Tests : WebApiControllerBaseTest");
            sb.AppendLine(4, "{");
            sb.AppendLine(8, $"public {endpointMethodMetadata.MethodName}Tests(WebApiStartupFactory fixture) : base(fixture) {{ }}");
            foreach (var contractReturnTypeName in endpointMethodMetadata.ContractReturnTypeNames)
            {
                switch (contractReturnTypeName.Item1)
                {
                case HttpStatusCode.OK:
                    AppendTest200Ok(sb, endpointMethodMetadata, contractReturnTypeName !);
                    break;

                case HttpStatusCode.Created:
                    AppendTest201Created(sb, endpointMethodMetadata, contractReturnTypeName !);
                    break;

                case HttpStatusCode.BadRequest:
                    AppendTest400BadRequestInPath(sb, endpointMethodMetadata, contractReturnTypeName !);
                    AppendTest400BadRequestInHeader(sb, endpointMethodMetadata, contractReturnTypeName !);
                    AppendTest400BadRequestInQuery(sb, endpointMethodMetadata, contractReturnTypeName !);
                    AppendTest400BadRequestInBody(sb, endpointMethodMetadata, contractReturnTypeName !);
                    break;
                }
            }

            sb.AppendLine(4, "}");
            sb.AppendLine("}");

            var pathA    = Path.Combine(hostProjectOptions.PathForTestGenerate !.FullName, "Endpoints");
            var pathB    = Path.Combine(pathA, endpointMethodMetadata.SegmentName);
            var pathC    = Path.Combine(pathB, "Generated");
            var fileName = $"{endpointMethodMetadata.MethodName}Tests.cs";
            var file     = new FileInfo(Path.Combine(pathC, fileName));

            return(TextFileHelper.Save(file, sb.ToString()));
        }
    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());
    }
        public static LogKeyValueItem Generate(
            HostProjectOptions hostProjectOptions,
            EndpointMethodMetadata endpointMethodMetadata)
        {
            if (hostProjectOptions == null)
            {
                throw new ArgumentNullException(nameof(hostProjectOptions));
            }

            if (endpointMethodMetadata == null)
            {
                throw new ArgumentNullException(nameof(endpointMethodMetadata));
            }

            var sb = new StringBuilder();

            sb.AppendLine("using System;");
            sb.AppendLine("using System.CodeDom.Compiler;");
            sb.AppendLine("using System.Collections.Generic;");
            sb.AppendLine("using System.Threading;");
            sb.AppendLine("using System.Threading.Tasks;");
            if (endpointMethodMetadata.IsPaginationUsed())
            {
                sb.AppendLine("using Atc.Rest.Results;");
            }

            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts;");
            sb.AppendLine($"using {hostProjectOptions.ProjectName}.Generated.Contracts.{endpointMethodMetadata.SegmentName};");
            sb.AppendLine();
            GenerateCodeHelper.AppendNamespaceComment(sb, hostProjectOptions.ToolNameAndVersion);
            sb.AppendLine($"namespace {hostProjectOptions.ProjectName}.Tests.Endpoints.{endpointMethodMetadata.SegmentName}.Generated");
            sb.AppendLine("{");
            GenerateCodeHelper.AppendGeneratedCodeAttribute(sb, hostProjectOptions.ToolName, hostProjectOptions.ToolVersion);
            sb.AppendLine(4, $"public class {endpointMethodMetadata.MethodName}HandlerStub : {endpointMethodMetadata.ContractInterfaceHandlerTypeName}");
            sb.AppendLine(4, "{");
            sb.AppendLine(8, endpointMethodMetadata.ContractParameterTypeName == null
                ? $"public Task<{endpointMethodMetadata.ContractResultTypeName}> ExecuteAsync(CancellationToken cancellationToken = default)"
                : $"public Task<{endpointMethodMetadata.ContractResultTypeName}> ExecuteAsync({endpointMethodMetadata.ContractParameterTypeName} parameters, CancellationToken cancellationToken = default)");
            sb.AppendLine(8, "{");
            if (endpointMethodMetadata.ContractReturnTypeNames.FirstOrDefault(x => x.Item1 == HttpStatusCode.OK) != null)
            {
                AppendContentForExecuteAsync(sb, endpointMethodMetadata, HttpStatusCode.OK);
            }
            else if (endpointMethodMetadata.ContractReturnTypeNames.FirstOrDefault(x => x.Item1 == HttpStatusCode.Created) != null)
            {
                AppendContentForExecuteAsync(sb, endpointMethodMetadata, HttpStatusCode.Created);
            }
            else
            {
                sb.AppendLine(12, "throw new System.NotImplementedException();");
            }

            sb.AppendLine(8, "}");
            sb.AppendLine(4, "}");
            sb.AppendLine("}");

            var pathA    = Path.Combine(hostProjectOptions.PathForTestGenerate !.FullName, "Endpoints");
            var pathB    = Path.Combine(pathA, endpointMethodMetadata.SegmentName);
            var pathC    = Path.Combine(pathB, "Generated");
            var fileName = $"{endpointMethodMetadata.ContractInterfaceHandlerTypeName.Substring(1)}Stub.cs";
            var file     = new FileInfo(Path.Combine(pathC, fileName));

            return(TextFileHelper.Save(file, sb.ToString()));
        }