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()); }
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); }
private static void AppendUsingStatements( StringBuilder sb, HostProjectOptions hostProjectOptions, EndpointMethodMetadata endpointMethodMetadata) { foreach (var statement in GetUsingStatements(hostProjectOptions, endpointMethodMetadata)) { sb.AppendLine($"using {statement};"); } }
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, "{"); }
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, "{"); }
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()); }
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};"); }
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); }
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())); }