From 7eb243d035cc024ae62012200d71ee2ec478f1ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Balc=C3=A1rek?= Date: Wed, 19 Jun 2024 21:15:37 +0200 Subject: [PATCH] migration to small api toolkit (#2) * migration to small api toolkit * update packages & add yamlDotNet ChoETL.Yaml has problems with dynamic objects * fix codacy --- README.md | 1 + .../EndpointBuilders/FileEndpointsBuilder.cs | 27 +++---- src/File.API/Extensions/IHandlerExtension.cs | 25 ++----- src/File.API/File.API.csproj | 7 +- src/File.API/Files/FormFileProxy.cs | 2 +- .../Midlewares/ExceptionMiddleware.cs | 56 --------------- src/File.API/Program.cs | 2 +- .../Abstractions/IAddFilesCommandHandler.cs | 3 +- .../Abstractions/IConvertToQueryHandler.cs | 3 +- .../Abstractions/IDownloadFileQueryHandler.cs | 3 +- .../Abstractions/IExportFileQueryHandler.cs | 3 +- .../Abstractions/IFileByOptionsValidator.cs | 2 +- .../Abstractions/IFileConvertService.cs | 4 +- .../Abstractions/IGetFilesInfoQueryHandler.cs | 5 +- src/File.Core/Abstractions/IRequestHandler.cs | 9 --- .../Commands/AddFilesCommandHandler.cs | 3 +- src/File.Core/Extensions/FileExtensions.cs | 2 +- src/File.Core/File.Core.csproj | 11 +-- .../Queries/ConvertToQueryHandler.cs | 3 +- .../Queries/DownloadFileQueryHandler.cs | 3 +- .../Queries/ExportFileQueryHandler.cs | 3 +- .../Queries/GetFilesInfoQueryHandler.cs | 4 +- .../Validation/FileByOptionsValidator.cs | 2 +- src/File.Core/Validation/GeneralPredicates.cs | 2 +- .../Abstractions/{IFile.cs => IFileProxy.cs} | 2 +- src/File.Domain/Commands/AddFilesCommand.cs | 4 +- src/File.Domain/Dtos/FileDto.cs | 6 +- .../Extensions/FluentResultExtensions.cs | 2 +- .../Extensions/HttpDataResponses.cs | 70 ------------------- src/File.Domain/File.Domain.csproj | 3 +- src/File.Domain/Http/DataResponse.cs | 9 --- src/File.Domain/Http/EmptyRequest.cs | 20 ------ src/File.Domain/Http/HttpDataResponse.cs | 10 --- src/File.Domain/Queries/ConvertToQuery.cs | 4 +- .../File.Infrastructure.csproj | 7 +- .../FileConversions/ConvertedFile.cs | 2 +- .../Converters/JsonToYamlFileConverter.cs | 17 ++--- .../Converters/YamlToJsonFileConverter.cs | 20 +++--- .../FileConversions/FileConversionService.cs | 10 +-- ...ile.Infrastructure.IntegrationTests.csproj | 8 +-- .../File.API.SystemTests.csproj | 10 +-- .../Tests/DownloadTests.cs | 2 +- .../File.API.SystemTests/Tests/ExportTests.cs | 2 +- .../File.API.SystemTests/Tests/GetTests.cs | 4 +- .../File.API.SystemTests/Tests/UploadTests.cs | 2 +- .../File.API.UnitTests.csproj | 10 +-- .../Assets/FileMockFactory.cs | 4 +- .../Commands/AddFilesCommandHandlerTests.cs | 63 ++++++++--------- .../File.Core.UnitTests.csproj | 12 ++-- .../Queries/ConvertToQueryHandlerTests.cs | 15 ++-- .../Queries/DownloadFileQueryHandlerTests.cs | 3 - .../AddFilesCommandValidatorTests.cs | 26 +++---- .../ConvertToQueryValidatorTests.cs | 16 ++--- .../File.Domain.UnitTests.csproj | 10 +-- .../File.Infrastructure.UnitTests.csproj | 10 +-- .../YamlToJsonFileConverterTests.cs | 2 +- .../FileConversionServiceTests.cs | 2 +- .../File.UnitTests.Common.csproj | 4 +- 58 files changed, 199 insertions(+), 377 deletions(-) delete mode 100644 src/File.API/Midlewares/ExceptionMiddleware.cs delete mode 100644 src/File.Core/Abstractions/IRequestHandler.cs rename src/File.Domain/Abstractions/{IFile.cs => IFileProxy.cs} (90%) delete mode 100644 src/File.Domain/Extensions/HttpDataResponses.cs delete mode 100644 src/File.Domain/Http/DataResponse.cs delete mode 100644 src/File.Domain/Http/EmptyRequest.cs delete mode 100644 src/File.Domain/Http/HttpDataResponse.cs diff --git a/README.md b/README.md index 457e0c0..254a9e2 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Solution contains four layers: ## Technologies * [ASP.NET Core 7](https://learn.microsoft.com/en-us/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-7.0) * [Entity Framework Core InMemory](https://learn.microsoft.com/en-us/ef/core/providers/in-memory/?tabs=dotnet-core-cli) +* [SmallApiToolkit](https://github.com/Gramli/SmallApiToolkit) * [Mapster](https://github.com/MapsterMapper/Mapster) * [FluentResuls](https://github.com/altmann/FluentResults) * [Validot](https://github.com/bartoszlenar/Validot) diff --git a/src/File.API/EndpointBuilders/FileEndpointsBuilder.cs b/src/File.API/EndpointBuilders/FileEndpointsBuilder.cs index f7e6900..5431b6b 100644 --- a/src/File.API/EndpointBuilders/FileEndpointsBuilder.cs +++ b/src/File.API/EndpointBuilders/FileEndpointsBuilder.cs @@ -4,10 +4,12 @@ using File.Core.Queries; using File.Domain.Commands; using File.Domain.Dtos; -using File.Domain.Http; using File.Domain.Queries; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; +using SmallApiToolkit.Extensions; namespace File.API.EndpointBuilders { @@ -17,6 +19,7 @@ public static IEndpointRouteBuilder BuildFileEndpoints(this IEndpointRouteBuilde { return endpointRouteBuilder .MapGroup("file") + .MapVersionGroup(1) .BuildUploadEndpoints() .BuildDownloadEndpoints() .BuildGetEndpoints() @@ -26,11 +29,11 @@ public static IEndpointRouteBuilder BuildFileEndpoints(this IEndpointRouteBuilde private static IEndpointRouteBuilder BuildUploadEndpoints(this IEndpointRouteBuilder endpointRouteBuilder) { - endpointRouteBuilder.MapPost("v1/upload", + endpointRouteBuilder.MapPost("upload", async (IFormFileCollection files, [FromServices] IAddFilesCommandHandler handler, CancellationToken cancellationToken) => await handler.SendAsync(new AddFilesCommand(files.Select(file => new FormFileProxy(file))), cancellationToken)) .DisableAntiforgery() - .Produces>() + .ProducesDataResponse() .WithName("AddFiles") .WithTags("Post"); return endpointRouteBuilder; @@ -38,7 +41,7 @@ private static IEndpointRouteBuilder BuildUploadEndpoints(this IEndpointRouteBui private static IEndpointRouteBuilder BuildDownloadEndpoints(this IEndpointRouteBuilder endpointRouteBuilder) { - endpointRouteBuilder.MapGet("v1/download", + endpointRouteBuilder.MapGet("download", async (int id, [FromServices] IDownloadFileQueryHandler handler, CancellationToken cancellationToken) => await handler.GetFileAsync(new DownloadFileQuery(id), cancellationToken)) .DisableAntiforgery() @@ -46,11 +49,11 @@ await handler.GetFileAsync(new DownloadFileQuery(id), cancellationToken)) .WithName("DownloadFile") .WithTags("Get"); - endpointRouteBuilder.MapGet("v1/downloadAsJson", + endpointRouteBuilder.MapGet("downloadAsJson", async (int id, [FromServices] IDownloadFileQueryHandler handler, CancellationToken cancellationToken) => await handler.GetJsonFileAsync(new DownloadFileQuery(id), cancellationToken)) .DisableAntiforgery() - .Produces>() + .ProducesDataResponse() .WithName("DownloadFileAsJson") .WithTags("Get"); @@ -59,10 +62,10 @@ await handler.GetJsonFileAsync(new DownloadFileQuery(id), cancellationToken)) private static IEndpointRouteBuilder BuildGetEndpoints(this IEndpointRouteBuilder endpointRouteBuilder) { - endpointRouteBuilder.MapGet("v1/files-info", + endpointRouteBuilder.MapGet("files-info", async ([FromServices] IGetFilesInfoQueryHandler handler, CancellationToken cancellationToken) => await handler.SendAsync(EmptyRequest.Instance, cancellationToken)) - .Produces>>() + .ProducesDataResponse>() .WithName("GetFilesInfo") .WithTags("Get"); return endpointRouteBuilder; @@ -70,11 +73,11 @@ await handler.SendAsync(EmptyRequest.Instance, cancellationToken)) private static IEndpointRouteBuilder BuildParseEndpoints(this IEndpointRouteBuilder endpointRouteBuilder) { - endpointRouteBuilder.MapPost("v1/export", + endpointRouteBuilder.MapPost("export", async ([FromBody]ExportFileQuery parseFileQuery,[FromServices] IExportFileQueryHandler handler, CancellationToken cancellationToken) => await handler.GetFileAsync(parseFileQuery, cancellationToken)) .DisableAntiforgery() - .Produces() + .ProducesDataResponse() .WithName("Export") .WithTags("Post"); return endpointRouteBuilder; @@ -82,11 +85,11 @@ await handler.GetFileAsync(parseFileQuery, cancellationToken)) private static IEndpointRouteBuilder BuildExportEndpoints(this IEndpointRouteBuilder endpointRouteBuilder) { - endpointRouteBuilder.MapPost("v1/convert", + endpointRouteBuilder.MapPost("convert", async (IFormFile file, string formatToExport, [FromServices] IConvertToQueryHandler handler, CancellationToken cancellationToken) => await handler.GetFileAsync(new ConvertToQuery(new FormFileProxy(file), formatToExport), cancellationToken)) .DisableAntiforgery() - .Produces() + .ProducesDataResponse() .WithName("ConvertTo") .WithTags("Post"); return endpointRouteBuilder; diff --git a/src/File.API/Extensions/IHandlerExtension.cs b/src/File.API/Extensions/IHandlerExtension.cs index 3031824..4a49d4f 100644 --- a/src/File.API/Extensions/IHandlerExtension.cs +++ b/src/File.API/Extensions/IHandlerExtension.cs @@ -1,29 +1,12 @@ -using File.Core.Abstractions; -using File.Domain.Dtos; -using File.Domain.Http; -using System.Buffers.Text; +using File.Domain.Dtos; +using SmallApiToolkit.Core.RequestHandlers; +using SmallApiToolkit.Core.Response; namespace File.API.Extensions { internal static class IHandlerExtension { - internal static async Task SendAsync(this IRequestHandler requestHandler, TRequest request, CancellationToken cancellationToken) - { - var response = await requestHandler.HandleAsync(request, cancellationToken); - return Results.Json(response, statusCode: (int)response.StatusCode); - } - - internal static async Task GetFileAsync(this IRequestHandler requestHandler, TRequest request, CancellationToken cancellationToken) where TResponse : FileDto - { - var response = await requestHandler.HandleAsync(request, cancellationToken); - if(response.Data is not null) - { - return Results.File(response.Data.Data, response.Data.ContentType, response.Data.FileName); - } - return Results.NotFound(); - } - - internal static async Task GetJsonFileAsync(this IRequestHandler requestHandler, TRequest request, CancellationToken cancellationToken) where TResponse : FileDto + internal static async Task GetJsonFileAsync(this IHttpRequestHandler requestHandler, TRequest request, CancellationToken cancellationToken) where TResponse : FileDto { var response = await requestHandler.HandleAsync(request, cancellationToken); if (response.Data is not null) diff --git a/src/File.API/File.API.csproj b/src/File.API/File.API.csproj index faea7d5..354cc2c 100644 --- a/src/File.API/File.API.csproj +++ b/src/File.API/File.API.csproj @@ -7,10 +7,11 @@ - - + + - + + diff --git a/src/File.API/Files/FormFileProxy.cs b/src/File.API/Files/FormFileProxy.cs index 023d9e4..5ee6116 100644 --- a/src/File.API/Files/FormFileProxy.cs +++ b/src/File.API/Files/FormFileProxy.cs @@ -3,7 +3,7 @@ namespace File.API.Files { - internal sealed class FormFileProxy : IFile + internal sealed class FormFileProxy : IFileProxy { private readonly IFormFile _formFile; public string ContentType => _formFile.ContentType; diff --git a/src/File.API/Midlewares/ExceptionMiddleware.cs b/src/File.API/Midlewares/ExceptionMiddleware.cs deleted file mode 100644 index 8fe1fc9..0000000 --- a/src/File.API/Midlewares/ExceptionMiddleware.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Ardalis.GuardClauses; -using File.Domain.Http; -using File.Domain.Logging; -using Newtonsoft.Json; -using System.Net; - -namespace File.API.Middlewares -{ - public sealed class ExceptionMiddleware - { - private readonly RequestDelegate _next; - private readonly ILogger _logger; - - public ExceptionMiddleware(RequestDelegate next, ILogger logger) - { - _next = Guard.Against.Null(next); - _logger = Guard.Against.Null(logger); - } - - public async Task InvokeAsync(HttpContext context) - { - try - { - await _next(context); - } - catch (Exception generalEx) - { - _logger.LogError(LogEvents.GeneralError, generalEx, "Unexpected Error Occured."); - await WriteResponseAsync(generalEx, context); - } - } - - private async Task WriteResponseAsync(Exception generalEx, HttpContext context) - { - var (responseCode, responseMessage) = ExtractFromException(generalEx); - context.Response.ContentType = "application/json"; - context.Response.StatusCode = (int)responseCode; - var jsonResult = CreateResponseJson(responseMessage); - await context.Response.WriteAsync(jsonResult); - } - - private static string CreateResponseJson(string errorMessage) - { - var response = new DataResponse(); - response.Errors.Add(errorMessage); - return JsonConvert.SerializeObject(response); - } - - private (HttpStatusCode responseCode, string responseMessage) ExtractFromException(Exception generalEx) - => generalEx switch - { - TaskCanceledException taskCanceledException => (HttpStatusCode.NoContent, taskCanceledException.Message), - _ => (HttpStatusCode.InternalServerError, "Generic error occurred on server. Check logs for more info.") - }; - } -} diff --git a/src/File.API/Program.cs b/src/File.API/Program.cs index d9cf77d..327f529 100644 --- a/src/File.API/Program.cs +++ b/src/File.API/Program.cs @@ -1,9 +1,9 @@ using File.API.Configuration; using File.API.EndpointBuilders; using File.API.Extensions; -using File.API.Middlewares; using File.Core.Configuration; using File.Infrastructure.Configuration; +using SmallApiToolkit.Middleware; var builder = WebApplication.CreateBuilder(args); diff --git a/src/File.Core/Abstractions/IAddFilesCommandHandler.cs b/src/File.Core/Abstractions/IAddFilesCommandHandler.cs index 476e713..55c13da 100644 --- a/src/File.Core/Abstractions/IAddFilesCommandHandler.cs +++ b/src/File.Core/Abstractions/IAddFilesCommandHandler.cs @@ -1,8 +1,9 @@ using File.Domain.Commands; +using SmallApiToolkit.Core.RequestHandlers; namespace File.Core.Abstractions { - public interface IAddFilesCommandHandler : IRequestHandler + public interface IAddFilesCommandHandler : IHttpRequestHandler { } } diff --git a/src/File.Core/Abstractions/IConvertToQueryHandler.cs b/src/File.Core/Abstractions/IConvertToQueryHandler.cs index 09f8d8e..187f2b2 100644 --- a/src/File.Core/Abstractions/IConvertToQueryHandler.cs +++ b/src/File.Core/Abstractions/IConvertToQueryHandler.cs @@ -1,9 +1,10 @@ using File.Core.Queries; using File.Domain.Dtos; +using SmallApiToolkit.Core.RequestHandlers; namespace File.Core.Abstractions { - public interface IConvertToQueryHandler : IRequestHandler + public interface IConvertToQueryHandler : IHttpRequestHandler { } } diff --git a/src/File.Core/Abstractions/IDownloadFileQueryHandler.cs b/src/File.Core/Abstractions/IDownloadFileQueryHandler.cs index 8314520..8681edf 100644 --- a/src/File.Core/Abstractions/IDownloadFileQueryHandler.cs +++ b/src/File.Core/Abstractions/IDownloadFileQueryHandler.cs @@ -1,9 +1,10 @@ using File.Domain.Dtos; using File.Domain.Queries; +using SmallApiToolkit.Core.RequestHandlers; namespace File.Core.Abstractions { - public interface IDownloadFileQueryHandler : IRequestHandler + public interface IDownloadFileQueryHandler : IHttpRequestHandler { } } diff --git a/src/File.Core/Abstractions/IExportFileQueryHandler.cs b/src/File.Core/Abstractions/IExportFileQueryHandler.cs index 9450522..aaf5c35 100644 --- a/src/File.Core/Abstractions/IExportFileQueryHandler.cs +++ b/src/File.Core/Abstractions/IExportFileQueryHandler.cs @@ -1,9 +1,10 @@ using File.Domain.Dtos; using File.Domain.Queries; +using SmallApiToolkit.Core.RequestHandlers; namespace File.Core.Abstractions { - public interface IExportFileQueryHandler : IRequestHandler + public interface IExportFileQueryHandler : IHttpRequestHandler { } } diff --git a/src/File.Core/Abstractions/IFileByOptionsValidator.cs b/src/File.Core/Abstractions/IFileByOptionsValidator.cs index 6cf26d3..5097854 100644 --- a/src/File.Core/Abstractions/IFileByOptionsValidator.cs +++ b/src/File.Core/Abstractions/IFileByOptionsValidator.cs @@ -6,7 +6,7 @@ namespace File.Core.Abstractions //TODO CONVERSION VALIDATION internal interface IFileByOptionsValidator { - Result Validate(IFile file); + Result Validate(IFileProxy file); Result Validate(string extension); Result ValidateConversion(string sourceExtension, string destinationExtension); } diff --git a/src/File.Core/Abstractions/IFileConvertService.cs b/src/File.Core/Abstractions/IFileConvertService.cs index 279ffd4..8471430 100644 --- a/src/File.Core/Abstractions/IFileConvertService.cs +++ b/src/File.Core/Abstractions/IFileConvertService.cs @@ -6,7 +6,7 @@ namespace File.Core.Abstractions { public interface IFileConvertService { - Task> ConvertTo(IFile sourceFile, string destinationFormat, CancellationToken cancellationToken); - Task> ExportTo(FileDto sourceFile, string destinationFormat, CancellationToken cancellationToken); + Task> ConvertTo(IFileProxy sourceFile, string destinationFormat, CancellationToken cancellationToken); + Task> ExportTo(FileDto sourceFile, string destinationFormat, CancellationToken cancellationToken); } } diff --git a/src/File.Core/Abstractions/IGetFilesInfoQueryHandler.cs b/src/File.Core/Abstractions/IGetFilesInfoQueryHandler.cs index 5d25592..6e6ed3d 100644 --- a/src/File.Core/Abstractions/IGetFilesInfoQueryHandler.cs +++ b/src/File.Core/Abstractions/IGetFilesInfoQueryHandler.cs @@ -1,9 +1,10 @@ using File.Domain.Dtos; -using File.Domain.Http; +using SmallApiToolkit.Core.RequestHandlers; +using SmallApiToolkit.Core.Response; namespace File.Core.Abstractions { - public interface IGetFilesInfoQueryHandler : IRequestHandler, EmptyRequest> + public interface IGetFilesInfoQueryHandler : IHttpRequestHandler, EmptyRequest> { } } diff --git a/src/File.Core/Abstractions/IRequestHandler.cs b/src/File.Core/Abstractions/IRequestHandler.cs deleted file mode 100644 index 69ebf6f..0000000 --- a/src/File.Core/Abstractions/IRequestHandler.cs +++ /dev/null @@ -1,9 +0,0 @@ -using File.Domain.Http; - -namespace File.Core.Abstractions -{ - public interface IRequestHandler - { - Task> HandleAsync(TRequest request, CancellationToken cancellationToken); - } -} diff --git a/src/File.Core/Commands/AddFilesCommandHandler.cs b/src/File.Core/Commands/AddFilesCommandHandler.cs index 9a711c0..4df394f 100644 --- a/src/File.Core/Commands/AddFilesCommandHandler.cs +++ b/src/File.Core/Commands/AddFilesCommandHandler.cs @@ -4,9 +4,10 @@ using File.Core.Resources; using File.Domain.Commands; using File.Domain.Extensions; -using File.Domain.Http; using File.Domain.Logging; using Microsoft.Extensions.Logging; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; namespace File.Core.Commands { diff --git a/src/File.Core/Extensions/FileExtensions.cs b/src/File.Core/Extensions/FileExtensions.cs index ff75d1e..b2c2688 100644 --- a/src/File.Core/Extensions/FileExtensions.cs +++ b/src/File.Core/Extensions/FileExtensions.cs @@ -5,7 +5,7 @@ namespace File.Core.Extensions { internal static class FileExtensions { - public async static Task CreateFileDto(this IFile file, CancellationToken cancellationToken) + public async static Task CreateFileDto(this IFileProxy file, CancellationToken cancellationToken) { return new FileDto { diff --git a/src/File.Core/File.Core.csproj b/src/File.Core/File.Core.csproj index fd6cb8e..eb55922 100644 --- a/src/File.Core/File.Core.csproj +++ b/src/File.Core/File.Core.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -7,13 +7,14 @@ - + - - + + - + + diff --git a/src/File.Core/Queries/ConvertToQueryHandler.cs b/src/File.Core/Queries/ConvertToQueryHandler.cs index 3346783..38fe5e7 100644 --- a/src/File.Core/Queries/ConvertToQueryHandler.cs +++ b/src/File.Core/Queries/ConvertToQueryHandler.cs @@ -4,9 +4,10 @@ using File.Core.Resources; using File.Domain.Dtos; using File.Domain.Extensions; -using File.Domain.Http; using File.Domain.Logging; using Microsoft.Extensions.Logging; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; namespace File.Core.Queries { diff --git a/src/File.Core/Queries/DownloadFileQueryHandler.cs b/src/File.Core/Queries/DownloadFileQueryHandler.cs index 690b4fa..6404f8a 100644 --- a/src/File.Core/Queries/DownloadFileQueryHandler.cs +++ b/src/File.Core/Queries/DownloadFileQueryHandler.cs @@ -3,10 +3,11 @@ using File.Core.Resources; using File.Domain.Dtos; using File.Domain.Extensions; -using File.Domain.Http; using File.Domain.Logging; using File.Domain.Queries; using Microsoft.Extensions.Logging; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; using Validot; namespace File.Core.Queries diff --git a/src/File.Core/Queries/ExportFileQueryHandler.cs b/src/File.Core/Queries/ExportFileQueryHandler.cs index 777e7a2..39796d7 100644 --- a/src/File.Core/Queries/ExportFileQueryHandler.cs +++ b/src/File.Core/Queries/ExportFileQueryHandler.cs @@ -4,11 +4,12 @@ using File.Core.Resources; using File.Domain.Dtos; using File.Domain.Extensions; -using File.Domain.Http; using File.Domain.Logging; using File.Domain.Queries; using Mapster; using Microsoft.Extensions.Logging; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; namespace File.Core.Queries { diff --git a/src/File.Core/Queries/GetFilesInfoQueryHandler.cs b/src/File.Core/Queries/GetFilesInfoQueryHandler.cs index 7816af3..121b08d 100644 --- a/src/File.Core/Queries/GetFilesInfoQueryHandler.cs +++ b/src/File.Core/Queries/GetFilesInfoQueryHandler.cs @@ -1,8 +1,8 @@ using Ardalis.GuardClauses; using File.Core.Abstractions; using File.Domain.Dtos; -using File.Domain.Extensions; -using File.Domain.Http; +using SmallApiToolkit.Core.Extensions; +using SmallApiToolkit.Core.Response; namespace File.Core.Queries { diff --git a/src/File.Core/Validation/FileByOptionsValidator.cs b/src/File.Core/Validation/FileByOptionsValidator.cs index cb1234e..d623009 100644 --- a/src/File.Core/Validation/FileByOptionsValidator.cs +++ b/src/File.Core/Validation/FileByOptionsValidator.cs @@ -16,7 +16,7 @@ public FileByOptionsValidator(IOptions fileOptions) _fileOptions = Guard.Against.Null(fileOptions); } - public Result Validate(IFile file) + public Result Validate(IFileProxy file) { var options = _fileOptions.Value.AllowedFiles.SingleOrDefault(x => x.ContentType.Equals(file.ContentType)); if (options is null) diff --git a/src/File.Core/Validation/GeneralPredicates.cs b/src/File.Core/Validation/GeneralPredicates.cs index 56224db..cf953bf 100644 --- a/src/File.Core/Validation/GeneralPredicates.cs +++ b/src/File.Core/Validation/GeneralPredicates.cs @@ -7,7 +7,7 @@ internal static class GeneralPredicates { internal static readonly Predicate isValidId = m => m > 0 && m < int.MaxValue; internal static readonly Predicate isValidFileName = m => m.IndexOfAny(Path.GetInvalidFileNameChars()) < 0; - internal static readonly Specification fileSpecification = f => + internal static readonly Specification fileSpecification = f => f.Member(m => m.FileName, m => m .NotEmpty() .And() diff --git a/src/File.Domain/Abstractions/IFile.cs b/src/File.Domain/Abstractions/IFileProxy.cs similarity index 90% rename from src/File.Domain/Abstractions/IFile.cs rename to src/File.Domain/Abstractions/IFileProxy.cs index 4edb6bd..977412d 100644 --- a/src/File.Domain/Abstractions/IFile.cs +++ b/src/File.Domain/Abstractions/IFileProxy.cs @@ -1,6 +1,6 @@ namespace File.Domain.Abstractions { - public interface IFile + public interface IFileProxy { string FileName { get; } string ContentType { get; } diff --git a/src/File.Domain/Commands/AddFilesCommand.cs b/src/File.Domain/Commands/AddFilesCommand.cs index 65ec2a1..8e46994 100644 --- a/src/File.Domain/Commands/AddFilesCommand.cs +++ b/src/File.Domain/Commands/AddFilesCommand.cs @@ -4,9 +4,9 @@ namespace File.Domain.Commands { public sealed class AddFilesCommand { - public IEnumerable Files { get; init; } = []; + public IEnumerable Files { get; init; } = []; - public AddFilesCommand(IEnumerable files) + public AddFilesCommand(IEnumerable files) { Files = files; } diff --git a/src/File.Domain/Dtos/FileDto.cs b/src/File.Domain/Dtos/FileDto.cs index 786d42a..1b0f7bb 100644 --- a/src/File.Domain/Dtos/FileDto.cs +++ b/src/File.Domain/Dtos/FileDto.cs @@ -1,6 +1,8 @@ -namespace File.Domain.Dtos +using SmallApiToolkit.Core.Abstractions; + +namespace File.Domain.Dtos { - public class FileDto : BaseFileDto + public class FileDto : BaseFileDto, IFile { public byte[] Data { get; init; } = []; } diff --git a/src/File.Domain/Extensions/FluentResultExtensions.cs b/src/File.Domain/Extensions/FluentResultExtensions.cs index f55e514..8ac9f37 100644 --- a/src/File.Domain/Extensions/FluentResultExtensions.cs +++ b/src/File.Domain/Extensions/FluentResultExtensions.cs @@ -8,7 +8,7 @@ public static IEnumerable ToErrorMessages(this IList errors) { if(!errors.HasAny()) { - return Array.Empty(); + return []; } return errors.Select(error => error.Message); diff --git a/src/File.Domain/Extensions/HttpDataResponses.cs b/src/File.Domain/Extensions/HttpDataResponses.cs deleted file mode 100644 index d3d6c88..0000000 --- a/src/File.Domain/Extensions/HttpDataResponses.cs +++ /dev/null @@ -1,70 +0,0 @@ -using File.Domain.Http; - -namespace File.Domain.Extensions -{ - public static class HttpDataResponses - { - public static HttpDataResponse AsBadRequest(IEnumerable errorMessages) - { - return new HttpDataResponse - { - StatusCode = System.Net.HttpStatusCode.BadRequest, - Errors = errorMessages.ToList() - }; - } - - public static HttpDataResponse AsBadRequest(string errorMessages) - { - return new HttpDataResponse - { - StatusCode = System.Net.HttpStatusCode.BadRequest, - Errors = new List { errorMessages } - }; - } - - public static HttpDataResponse AsInternalServerError(IEnumerable errorMessages) - { - return new HttpDataResponse - { - StatusCode = System.Net.HttpStatusCode.InternalServerError, - Errors = errorMessages.ToList() - }; - } - - public static HttpDataResponse AsInternalServerError(string errorMessage) - { - return new HttpDataResponse - { - StatusCode = System.Net.HttpStatusCode.InternalServerError, - Errors = new List { errorMessage } - }; - } - - public static HttpDataResponse AsOK(T data) - { - return new HttpDataResponse - { - Data = data, - StatusCode = System.Net.HttpStatusCode.OK, - }; - } - - public static HttpDataResponse AsOK(T data, IEnumerable errorMessages) - { - return new HttpDataResponse - { - Data = data, - StatusCode = System.Net.HttpStatusCode.OK, - Errors = errorMessages.ToList() - }; - } - - public static HttpDataResponse AsNoContent() - { - return new HttpDataResponse - { - StatusCode = System.Net.HttpStatusCode.NoContent, - }; - } - } -} diff --git a/src/File.Domain/File.Domain.csproj b/src/File.Domain/File.Domain.csproj index b11bd62..f831350 100644 --- a/src/File.Domain/File.Domain.csproj +++ b/src/File.Domain/File.Domain.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -8,6 +8,7 @@ + diff --git a/src/File.Domain/Http/DataResponse.cs b/src/File.Domain/Http/DataResponse.cs deleted file mode 100644 index 6d3e926..0000000 --- a/src/File.Domain/Http/DataResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace File.Domain.Http -{ - public class DataResponse - { - public T? Data { get; init; } - - public IList Errors { get; init; } = []; - } -} diff --git a/src/File.Domain/Http/EmptyRequest.cs b/src/File.Domain/Http/EmptyRequest.cs deleted file mode 100644 index 2f4f9d6..0000000 --- a/src/File.Domain/Http/EmptyRequest.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace File.Domain.Http -{ - public sealed class EmptyRequest - { - private static EmptyRequest? _instance; - public static EmptyRequest Instance - { - get - { - _instance ??= new EmptyRequest(); - return _instance; - } - } - - private EmptyRequest() - { - - } - } -} diff --git a/src/File.Domain/Http/HttpDataResponse.cs b/src/File.Domain/Http/HttpDataResponse.cs deleted file mode 100644 index c07f2bc..0000000 --- a/src/File.Domain/Http/HttpDataResponse.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Net; - -namespace File.Domain.Http -{ - public sealed class HttpDataResponse : DataResponse - { - public HttpStatusCode StatusCode { get; init; } - - } -} diff --git a/src/File.Domain/Queries/ConvertToQuery.cs b/src/File.Domain/Queries/ConvertToQuery.cs index ea0e8c9..5c4f6f0 100644 --- a/src/File.Domain/Queries/ConvertToQuery.cs +++ b/src/File.Domain/Queries/ConvertToQuery.cs @@ -4,11 +4,11 @@ namespace File.Core.Queries { public sealed class ConvertToQuery { - public IFile File { get; init; } + public IFileProxy File { get; init; } public string ExtensionToConvert{ get; init; } = string.Empty; - public ConvertToQuery(IFile file, string extensionToConvert) + public ConvertToQuery(IFileProxy file, string extensionToConvert) { File = file; ExtensionToConvert = extensionToConvert; diff --git a/src/File.Infrastructure/File.Infrastructure.csproj b/src/File.Infrastructure/File.Infrastructure.csproj index e57c9b9..66f4ac9 100644 --- a/src/File.Infrastructure/File.Infrastructure.csproj +++ b/src/File.Infrastructure/File.Infrastructure.csproj @@ -7,12 +7,13 @@ - - + + - + + diff --git a/src/File.Infrastructure/FileConversions/ConvertedFile.cs b/src/File.Infrastructure/FileConversions/ConvertedFile.cs index 9221073..3da0510 100644 --- a/src/File.Infrastructure/FileConversions/ConvertedFile.cs +++ b/src/File.Infrastructure/FileConversions/ConvertedFile.cs @@ -3,7 +3,7 @@ namespace File.Infrastructure.FileConversions { - internal sealed class ConvertedFile : IFile + internal sealed class ConvertedFile : IFileProxy { public string FileName { get; } diff --git a/src/File.Infrastructure/FileConversions/Converters/JsonToYamlFileConverter.cs b/src/File.Infrastructure/FileConversions/Converters/JsonToYamlFileConverter.cs index 0c5c375..8b3c172 100644 --- a/src/File.Infrastructure/FileConversions/Converters/JsonToYamlFileConverter.cs +++ b/src/File.Infrastructure/FileConversions/Converters/JsonToYamlFileConverter.cs @@ -1,8 +1,9 @@ -using ChoETL; -using File.Infrastructure.Abstractions; +using File.Infrastructure.Abstractions; using File.Infrastructure.Extensions; using FluentResults; -using System.Text; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.Dynamic; namespace File.Infrastructure.FileConversions.Converters { @@ -10,11 +11,11 @@ internal sealed class JsonToYamlFileConverter : IFileConverter { public Task> Convert(string fileContent, CancellationToken cancellationToken) { - using var jsonCoReader = ChoJSONReader.LoadText(fileContent); - var stringBuilder = new StringBuilder(); - using var yamlWriter = new ChoYamlWriter(stringBuilder).SingleDocument(); - yamlWriter.Write(jsonCoReader); - var yamlContent = stringBuilder.ToString(); + var expConverter = new ExpandoObjectConverter(); + var deserializedObject = JsonConvert.DeserializeObject(fileContent, expConverter); + + var serializer = new YamlDotNet.Serialization.Serializer(); + var yamlContent = serializer.Serialize(deserializedObject); return Task.FromResult(yamlContent.OkIfNotNull()); } } diff --git a/src/File.Infrastructure/FileConversions/Converters/YamlToJsonFileConverter.cs b/src/File.Infrastructure/FileConversions/Converters/YamlToJsonFileConverter.cs index ff8e8a6..ebeeaf9 100644 --- a/src/File.Infrastructure/FileConversions/Converters/YamlToJsonFileConverter.cs +++ b/src/File.Infrastructure/FileConversions/Converters/YamlToJsonFileConverter.cs @@ -1,8 +1,8 @@ -using ChoETL; -using File.Infrastructure.Abstractions; +using File.Infrastructure.Abstractions; using File.Infrastructure.Extensions; using FluentResults; -using System.Text; +using Newtonsoft.Json; +using YamlDotNet.Serialization; namespace File.Infrastructure.FileConversions.Converters { @@ -10,12 +10,14 @@ internal sealed class YamlToJsonFileConverter : IFileConverter { public Task> Convert(string fileContent, CancellationToken cancellationToken) { - using var yamlReader = ChoYamlReader.LoadText(fileContent); - var stringBuilder = new StringBuilder(); - using var yamlWriter = new ChoYamlWriter(stringBuilder); - yamlWriter.Write(yamlReader); - var jsonContent = stringBuilder.ToString(); - return Task.FromResult(jsonContent.OkIfNotNull()); + var deserializer = new Deserializer(); + var yamlObject = deserializer.Deserialize(fileContent); + + var jsonSerializer = new JsonSerializer(); + using var writer = new StringWriter(); + jsonSerializer.Serialize(writer, yamlObject); + + return Task.FromResult(writer.ToString().OkIfNotNull()); } } } diff --git a/src/File.Infrastructure/FileConversions/FileConversionService.cs b/src/File.Infrastructure/FileConversions/FileConversionService.cs index be6c244..e8e45fd 100644 --- a/src/File.Infrastructure/FileConversions/FileConversionService.cs +++ b/src/File.Infrastructure/FileConversions/FileConversionService.cs @@ -19,18 +19,18 @@ public FileConversionService(IFileConverterFactory fileConverterFactory, IEncodi _encodingFactory = Guard.Against.Null(encodingFactory); } - public async Task> ConvertTo(IFile sourceFile, string destinationExtension, CancellationToken cancellationToken) + public async Task> ConvertTo(IFileProxy sourceFile, string destinationExtension, CancellationToken cancellationToken) { var data = await sourceFile.GetData(cancellationToken); return await ConvertFile(data, sourceFile.FileName, sourceFile.ContentType, destinationExtension, cancellationToken); } - public async Task> ExportTo(FileDto sourceFile, string destinationExtension, CancellationToken cancellationToken) + public async Task> ExportTo(FileDto sourceFile, string destinationExtension, CancellationToken cancellationToken) { return await ConvertFile(sourceFile.Data, sourceFile.FileName, sourceFile.ContentType, destinationExtension, cancellationToken); } - private async Task> ConvertFile(byte[] data, string fileName, string contentType, string destinationExtension, CancellationToken cancellationToken) + private async Task> ConvertFile(byte[] data, string fileName, string contentType, string destinationExtension, CancellationToken cancellationToken) { var encoding = _encodingFactory.CreateEncoding(data); @@ -39,13 +39,13 @@ private async Task> ConvertFile(byte[] data, string fileName, stri if(convertedContentResult.IsFailed) { - return Result.Fail(convertedContentResult.Errors); + return Result.Fail(convertedContentResult.Errors); } var convertedData = encoding.GetBytes(convertedContentResult.Value); var convertedFileName = $"{Path.GetFileNameWithoutExtension(fileName)}.{destinationExtension}"; - return Result.Ok(new ConvertedFile(convertedFileName, contentType, convertedData)); + return Result.Ok(new ConvertedFile(convertedFileName, contentType, convertedData)); } } } diff --git a/src/Tests/IntegrationTests/File.Infrastructure.IntegrationTests/File.Infrastructure.IntegrationTests.csproj b/src/Tests/IntegrationTests/File.Infrastructure.IntegrationTests/File.Infrastructure.IntegrationTests.csproj index b7e4695..bab73db 100644 --- a/src/Tests/IntegrationTests/File.Infrastructure.IntegrationTests/File.Infrastructure.IntegrationTests.csproj +++ b/src/Tests/IntegrationTests/File.Infrastructure.IntegrationTests/File.Infrastructure.IntegrationTests.csproj @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/SystemTests/File.API.SystemTests/File.API.SystemTests.csproj b/src/Tests/SystemTests/File.API.SystemTests/File.API.SystemTests.csproj index 3ece095..a093308 100644 --- a/src/Tests/SystemTests/File.API.SystemTests/File.API.SystemTests.csproj +++ b/src/Tests/SystemTests/File.API.SystemTests/File.API.SystemTests.csproj @@ -9,14 +9,14 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/SystemTests/File.API.SystemTests/Tests/DownloadTests.cs b/src/Tests/SystemTests/File.API.SystemTests/Tests/DownloadTests.cs index 0c347e5..30633f8 100644 --- a/src/Tests/SystemTests/File.API.SystemTests/Tests/DownloadTests.cs +++ b/src/Tests/SystemTests/File.API.SystemTests/Tests/DownloadTests.cs @@ -1,7 +1,7 @@ using ChoETL; using File.API.SystemTests.Extensions; using File.Domain.Dtos; -using File.Domain.Http; +using SmallApiToolkit.Core.Response; using System.Net.Http.Json; namespace File.API.SystemTests.Tests diff --git a/src/Tests/SystemTests/File.API.SystemTests/Tests/ExportTests.cs b/src/Tests/SystemTests/File.API.SystemTests/Tests/ExportTests.cs index 88a77a9..cd72640 100644 --- a/src/Tests/SystemTests/File.API.SystemTests/Tests/ExportTests.cs +++ b/src/Tests/SystemTests/File.API.SystemTests/Tests/ExportTests.cs @@ -1,8 +1,8 @@ using File.API.SystemTests.Extensions; using File.Domain.Dtos; -using File.Domain.Http; using File.Domain.Queries; using Newtonsoft.Json; +using SmallApiToolkit.Core.Response; using System.Text; namespace File.API.SystemTests.Tests diff --git a/src/Tests/SystemTests/File.API.SystemTests/Tests/GetTests.cs b/src/Tests/SystemTests/File.API.SystemTests/Tests/GetTests.cs index 5e9992d..5574979 100644 --- a/src/Tests/SystemTests/File.API.SystemTests/Tests/GetTests.cs +++ b/src/Tests/SystemTests/File.API.SystemTests/Tests/GetTests.cs @@ -1,6 +1,6 @@ using File.API.SystemTests.Extensions; using File.Domain.Dtos; -using File.Domain.Http; +using SmallApiToolkit.Core.Response; namespace File.API.SystemTests.Tests { @@ -19,7 +19,7 @@ public async Task GetFileInfoAsync() //Assert var resultData = await result.GetResponseData>>(); Assert.NotNull(resultData); - Assert.NotEmpty(resultData?.Data); + Assert.NotEmpty(resultData.Data); } } } diff --git a/src/Tests/SystemTests/File.API.SystemTests/Tests/UploadTests.cs b/src/Tests/SystemTests/File.API.SystemTests/Tests/UploadTests.cs index 1001103..975646e 100644 --- a/src/Tests/SystemTests/File.API.SystemTests/Tests/UploadTests.cs +++ b/src/Tests/SystemTests/File.API.SystemTests/Tests/UploadTests.cs @@ -1,5 +1,5 @@ using File.API.SystemTests.Extensions; -using File.Domain.Http; +using SmallApiToolkit.Core.Response; namespace File.API.SystemTests.Tests { diff --git a/src/Tests/UnitTests/File.API.UnitTests/File.API.UnitTests.csproj b/src/Tests/UnitTests/File.API.UnitTests/File.API.UnitTests.csproj index 244e8d7..2d74f7d 100644 --- a/src/Tests/UnitTests/File.API.UnitTests/File.API.UnitTests.csproj +++ b/src/Tests/UnitTests/File.API.UnitTests/File.API.UnitTests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Assets/FileMockFactory.cs b/src/Tests/UnitTests/File.Core.UnitTests/Assets/FileMockFactory.cs index 2746e50..33b1d76 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Assets/FileMockFactory.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Assets/FileMockFactory.cs @@ -4,9 +4,9 @@ namespace File.Core.UnitTests.Assets { internal static class FileMockFactory { - public static Mock CreateMock(byte[] resultFileData, string contentType, string fileName) + public static Mock CreateMock(byte[] resultFileData, string contentType, string fileName) { - var resultFileMock = new Mock(); + var resultFileMock = new Mock(); resultFileMock.SetupGet(x => x.ContentType).Returns(contentType); resultFileMock.SetupGet(x => x.FileName).Returns(fileName); resultFileMock.SetupGet(x => x.Length).Returns(resultFileData.Length); diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Commands/AddFilesCommandHandlerTests.cs b/src/Tests/UnitTests/File.Core.UnitTests/Commands/AddFilesCommandHandlerTests.cs index 9445f5c..e5d72e5 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Commands/AddFilesCommandHandlerTests.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Commands/AddFilesCommandHandlerTests.cs @@ -3,9 +3,6 @@ using File.Domain.Abstractions; using File.Domain.Commands; using File.Domain.Dtos; -using FluentResults; -using Microsoft.Extensions.Logging; -using Moq; using System.Net; namespace File.Core.UnitTests.Commands @@ -31,7 +28,7 @@ public async Task Validation_Failed() { //Arrange var validationFailedMessage = "validationFailedMessage"; - var request = new AddFilesCommand(Enumerable.Empty()); + var request = new AddFilesCommand(Enumerable.Empty()); _addFilesCommandValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Fail(validationFailedMessage)); @@ -48,14 +45,14 @@ public async Task Validation_Failed() public async Task AddFileAsync_IOException_All_Failed() { //Arrange - var iFileMockOne = new Mock(); - var iFileMockTwo = new Mock(); + var iFileMockOne = new Mock(); + var iFileMockTwo = new Mock(); - var request = new AddFilesCommand(new List - { + var request = new AddFilesCommand( + [ iFileMockOne.Object, iFileMockTwo.Object - }); + ]); iFileMockOne.Setup(x => x.GetData(CancellationToken.None)).ThrowsAsync(new IOException()); iFileMockTwo.Setup(x => x.GetData(CancellationToken.None)).ThrowsAsync(new IOException()); @@ -67,7 +64,7 @@ public async Task AddFileAsync_IOException_All_Failed() //Assert Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(2, result.Errors.Count); + Assert.Equal(2, result.Errors.Count()); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); iFileMockOne.Verify(x => x.GetData(CancellationToken.None), Times.Once); iFileMockTwo.Verify(x => x.GetData(CancellationToken.None), Times.Once); @@ -77,14 +74,14 @@ public async Task AddFileAsync_IOException_All_Failed() public async Task AddFileAsync_IOException_One_Failed() { //Arrange - var iFileMockOne = new Mock(); - var iFileMockTwo = new Mock(); + var iFileMockOne = new Mock(); + var iFileMockTwo = new Mock(); - var request = new AddFilesCommand(new List() - { + var request = new AddFilesCommand( + [ iFileMockOne.Object, iFileMockTwo.Object - }); + ]); iFileMockOne.Setup(x => x.GetData(CancellationToken.None)).ThrowsAsync(new IOException()); iFileMockTwo.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); @@ -97,7 +94,7 @@ public async Task AddFileAsync_IOException_One_Failed() //Assert Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(1, result.Errors.Count); + Assert.Single(result.Errors); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); iFileMockOne.Verify(x => x.GetData(CancellationToken.None), Times.Once); iFileMockTwo.Verify(x => x.GetData(CancellationToken.None), Times.Once); @@ -108,14 +105,14 @@ public async Task AddFileAsync_IOException_One_Failed() public async Task AddFileAsync_All_Failed() { //Arrange - var iFileMockOne = new Mock(); - var iFileMockTwo = new Mock(); + var iFileMockOne = new Mock(); + var iFileMockTwo = new Mock(); - var request = new AddFilesCommand(new List() - { + var request = new AddFilesCommand( + [ iFileMockOne.Object, iFileMockTwo.Object - }); + ]); iFileMockOne.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); iFileMockTwo.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); @@ -128,7 +125,7 @@ public async Task AddFileAsync_All_Failed() //Assert Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(2, result.Errors.Count); + Assert.Equal(2, result.Errors.Count()); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); iFileMockOne.Verify(x => x.GetData(CancellationToken.None), Times.Once); iFileMockTwo.Verify(x => x.GetData(CancellationToken.None), Times.Once); @@ -141,14 +138,14 @@ public async Task AddFileAsync_One_Failed() //Arrange var fileName = "fileName"; - var iFileMockOne = new Mock(); - var iFileMockTwo = new Mock(); + var iFileMockOne = new Mock(); + var iFileMockTwo = new Mock(); - var request = new AddFilesCommand(new List() - { + var request = new AddFilesCommand( + [ iFileMockOne.Object, iFileMockTwo.Object - }); + ]); iFileMockOne.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); iFileMockOne.SetupGet(x => x.FileName).Returns(fileName); @@ -164,7 +161,7 @@ public async Task AddFileAsync_One_Failed() //Assert Assert.Equal(HttpStatusCode.OK, result.StatusCode); - Assert.Equal(1, result.Errors.Count); + Assert.Single(result.Errors); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); iFileMockOne.Verify(x => x.GetData(CancellationToken.None), Times.Once); iFileMockTwo.Verify(x => x.GetData(CancellationToken.None), Times.Once); @@ -175,14 +172,14 @@ public async Task AddFileAsync_One_Failed() public async Task Success() { //Arrange - var iFileMockOne = new Mock(); - var iFileMockTwo = new Mock(); + var iFileMockOne = new Mock(); + var iFileMockTwo = new Mock(); - var request = new AddFilesCommand(new List() - { + var request = new AddFilesCommand( + [ iFileMockOne.Object, iFileMockTwo.Object - }); + ]); iFileMockOne.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); iFileMockTwo.Setup(x => x.GetData(CancellationToken.None)).ReturnsAsync(Array.Empty()); diff --git a/src/Tests/UnitTests/File.Core.UnitTests/File.Core.UnitTests.csproj b/src/Tests/UnitTests/File.Core.UnitTests/File.Core.UnitTests.csproj index 5da2bad..ec8b7b1 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/File.Core.UnitTests.csproj +++ b/src/Tests/UnitTests/File.Core.UnitTests/File.Core.UnitTests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -9,14 +9,14 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Queries/ConvertToQueryHandlerTests.cs b/src/Tests/UnitTests/File.Core.UnitTests/Queries/ConvertToQueryHandlerTests.cs index e05ca44..4782ac6 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Queries/ConvertToQueryHandlerTests.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Queries/ConvertToQueryHandlerTests.cs @@ -5,9 +5,6 @@ using File.Domain.Abstractions; using File.Domain.Logging; using File.UnitTests.Common.Extensions; -using FluentResults; -using Microsoft.Extensions.Logging; -using Moq; using System.Net; namespace File.Core.UnitTests.Queries @@ -18,7 +15,7 @@ public class ConvertToQueryHandlerTests private readonly Mock _convertToQueryValidatorMock; private readonly Mock _fileConvertServiceMock; - private readonly Mock _fileMock; + private readonly Mock _fileMock; private readonly IConvertToQueryHandler _uut; @@ -28,7 +25,7 @@ public ConvertToQueryHandlerTests() _convertToQueryValidatorMock = new Mock(); _fileConvertServiceMock = new Mock(); - _fileMock = new Mock(); + _fileMock = new Mock(); _uut = new ConvertToQueryHandler(_loggerMock.Object, _fileConvertServiceMock.Object, _convertToQueryValidatorMock.Object); } @@ -61,7 +58,7 @@ public async Task FileConvert_Failed() var request = new ConvertToQuery(_fileMock.Object, format); var failedMessage = nameof(FileConvert_Failed); _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); - _fileConvertServiceMock.Setup(x => x.ConvertTo(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Fail(failedMessage)); + _fileConvertServiceMock.Setup(x => x.ConvertTo(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Fail(failedMessage)); _fileMock.SetupGet(x => x.FileName).Returns(fileName); //Act @@ -72,7 +69,7 @@ public async Task FileConvert_Failed() Assert.Single(result.Errors); Assert.Equal(result.Errors.First(), string.Format(ErrorMessages.ConvertFileFailed, fileName, format)); _convertToQueryValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); - _fileConvertServiceMock.Verify(x => x.ConvertTo(It.IsAny(), It.Is(y=>y.Equals(format)), It.IsAny()), Times.Once); + _fileConvertServiceMock.Verify(x => x.ConvertTo(It.IsAny(), It.Is(y=>y.Equals(format)), It.IsAny()), Times.Once); _loggerMock.VerifyLog(LogLevel.Error, LogEvents.ConvertFileGeneralError, Times.Once()); } @@ -86,7 +83,7 @@ public async Task Success() var format = "xml"; var request = new ConvertToQuery(_fileMock.Object, format); _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); - _fileConvertServiceMock.Setup(x => x.ConvertTo(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Ok(resultFileMock.Object)); + _fileConvertServiceMock.Setup(x => x.ConvertTo(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(Result.Ok(resultFileMock.Object)); _fileMock.SetupGet(x => x.FileName).Returns(nameof(FileConvert_Failed)); //Act @@ -95,7 +92,7 @@ public async Task Success() //Assert Assert.Equal(HttpStatusCode.OK, result.StatusCode); _convertToQueryValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request))), Times.Once); - _fileConvertServiceMock.Verify(x => x.ConvertTo(It.IsAny(), It.Is(y => y.Equals(format)), It.IsAny()), Times.Once); + _fileConvertServiceMock.Verify(x => x.ConvertTo(It.IsAny(), It.Is(y => y.Equals(format)), It.IsAny()), Times.Once); resultFileMock.VerifyGet(x => x.ContentType, Times.Once); resultFileMock.VerifyGet(x => x.FileName, Times.Once); resultFileMock.VerifyGet(x => x.Length, Times.Once); diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Queries/DownloadFileQueryHandlerTests.cs b/src/Tests/UnitTests/File.Core.UnitTests/Queries/DownloadFileQueryHandlerTests.cs index 53a741e..7ae6fcd 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Queries/DownloadFileQueryHandlerTests.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Queries/DownloadFileQueryHandlerTests.cs @@ -5,9 +5,6 @@ using File.Domain.Logging; using File.Domain.Queries; using File.UnitTests.Common.Extensions; -using FluentResults; -using Microsoft.Extensions.Logging; -using Moq; using System.Net; using Validot; using Validot.Results; diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Validation/AddFilesCommandValidatorTests.cs b/src/Tests/UnitTests/File.Core.UnitTests/Validation/AddFilesCommandValidatorTests.cs index 80a5f75..be39a02 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Validation/AddFilesCommandValidatorTests.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Validation/AddFilesCommandValidatorTests.cs @@ -29,7 +29,7 @@ public AddFilesCommandValidatorTests() public void CommandValidation_Failed() { //Arrange - var command = new AddFilesCommand(Enumerable.Empty()); + var command = new AddFilesCommand([]); _validationResultMock.SetupGet(x=>x.AnyErrors).Returns(true); _addFilesCommandValidatorMock.Setup(x=>x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); @@ -50,16 +50,16 @@ public void AllFilesValidation_Failed() var fileMockOne = FileMockFactory.CreateMock(new byte[10], "application/json", "resultFileOneName"); var fileMockTwo = FileMockFactory.CreateMock(new byte[10], "application/json", "resultFileTwoName"); - var command = new AddFilesCommand(new List - { + var command = new AddFilesCommand( + [ fileMockOne.Object, fileMockTwo.Object - }); + ]); var failedMessage = "failedMessage"; _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); _addFilesCommandValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Fail(failedMessage)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Fail(failedMessage)); //Act var result = _uut.Validate(command); @@ -69,7 +69,7 @@ public void AllFilesValidation_Failed() Assert.True(result.IsFailed); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(command)), It.IsAny()), Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); } [Fact] @@ -82,7 +82,7 @@ public void OneFilesValidation_Failed() var fileMockOne = FileMockFactory.CreateMock(new byte[10], "application/json", fileNameOne); var fileMockTwo = FileMockFactory.CreateMock(new byte[10], "application/json", fileNameTwo); - var command = new AddFilesCommand(new List + var command = new AddFilesCommand(new List { fileMockOne.Object, fileMockTwo.Object @@ -91,8 +91,8 @@ public void OneFilesValidation_Failed() _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); _addFilesCommandValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.Is(y=>y.FileName.Equals(fileNameTwo)))).Returns(Result.Fail(failedMessage)); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.Is(y =>y.FileName.Equals(fileNameOne)))).Returns(Result.Ok(true)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.Is(y=>y.FileName.Equals(fileNameTwo)))).Returns(Result.Fail(failedMessage)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.Is(y =>y.FileName.Equals(fileNameOne)))).Returns(Result.Ok(true)); //Act var result = _uut.Validate(command); @@ -101,7 +101,7 @@ public void OneFilesValidation_Failed() Assert.True(result.IsFailed); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(command)), It.IsAny()), Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Exactly(2)); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Exactly(2)); } [Fact] @@ -111,7 +111,7 @@ public void Success() var fileMockOne = FileMockFactory.CreateMock(new byte[10], "application/json", "fileNameOne"); var fileMockTwo = FileMockFactory.CreateMock(new byte[10], "application/json", "fileNameTwo"); - var command = new AddFilesCommand(new List + var command = new AddFilesCommand(new List { fileMockOne.Object, fileMockTwo.Object @@ -119,7 +119,7 @@ public void Success() _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); _addFilesCommandValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); //Act var result = _uut.Validate(command); @@ -128,7 +128,7 @@ public void Success() Assert.True(result.IsSuccess); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); _addFilesCommandValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(command)), It.IsAny()), Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Exactly(2)); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Exactly(2)); } } } diff --git a/src/Tests/UnitTests/File.Core.UnitTests/Validation/ConvertToQueryValidatorTests.cs b/src/Tests/UnitTests/File.Core.UnitTests/Validation/ConvertToQueryValidatorTests.cs index 45dc210..1eb1552 100644 --- a/src/Tests/UnitTests/File.Core.UnitTests/Validation/ConvertToQueryValidatorTests.cs +++ b/src/Tests/UnitTests/File.Core.UnitTests/Validation/ConvertToQueryValidatorTests.cs @@ -31,7 +31,7 @@ public ConvertToQueryValidatorTests() public void QueryValidation_Failed() { //Arrange - var request = new ConvertToQuery(new Mock().Object, string.Empty); + var request = new ConvertToQuery(new Mock().Object, string.Empty); _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); _validationResultMock.SetupGet(x=>x.AnyErrors).Returns(true); @@ -49,13 +49,13 @@ public void QueryValidation_Failed() public void FileValidation_Failed() { //Arrange - var request = new ConvertToQuery(new Mock().Object, string.Empty); + var request = new ConvertToQuery(new Mock().Object, string.Empty); var failedMessage = "failedMessage"; _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Fail(failedMessage)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Fail(failedMessage)); //Act var result = _uut.Validate(request); @@ -66,7 +66,7 @@ public void FileValidation_Failed() Assert.Equal(failedMessage, result.Errors.First().Message); _convertToQueryValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request)), It.IsAny()), Times.Once); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); } [Fact] @@ -82,7 +82,7 @@ public void ConversionValidation_Failed() _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); _fileByOptionsValidatorMock.Setup(x => x.ValidateConversion(It.IsAny(), It.IsAny())).Returns(Result.Fail(failedMessage)); //Act @@ -94,7 +94,7 @@ public void ConversionValidation_Failed() Assert.Equal(failedMessage, result.Errors.First().Message); _convertToQueryValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request)), It.IsAny()), Times.Once); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); _fileByOptionsValidatorMock.Verify(x => x.ValidateConversion(It.Is(y => y.Equals(sourceExtension)), It.Is(y => y.Equals(destinationExtension))), Times.Once); } @@ -109,7 +109,7 @@ public void Success() _convertToQueryValidatorMock.Setup(x => x.Validate(It.IsAny(), It.IsAny())).Returns(_validationResultMock.Object); _validationResultMock.SetupGet(x => x.AnyErrors).Returns(false); - _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); + _fileByOptionsValidatorMock.Setup(x => x.Validate(It.IsAny())).Returns(Result.Ok(true)); _fileByOptionsValidatorMock.Setup(x => x.ValidateConversion(It.IsAny(), It.IsAny())).Returns(Result.Ok(true)); //Act @@ -120,7 +120,7 @@ public void Success() Assert.Empty(result.Errors); _convertToQueryValidatorMock.Verify(x => x.Validate(It.Is(y => y.Equals(request)), It.IsAny()), Times.Once); _validationResultMock.VerifyGet(x => x.AnyErrors, Times.Once); - _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); + _fileByOptionsValidatorMock.Verify(x => x.Validate(It.IsAny()), Times.Once); _fileByOptionsValidatorMock.Verify(x => x.ValidateConversion(It.Is(y=>y.Equals(sourceExtension)), It.Is(y=>y.Equals(destinationExtension))), Times.Once); } } diff --git a/src/Tests/UnitTests/File.Domain.UnitTests/File.Domain.UnitTests.csproj b/src/Tests/UnitTests/File.Domain.UnitTests/File.Domain.UnitTests.csproj index 244e8d7..2d74f7d 100644 --- a/src/Tests/UnitTests/File.Domain.UnitTests/File.Domain.UnitTests.csproj +++ b/src/Tests/UnitTests/File.Domain.UnitTests/File.Domain.UnitTests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/UnitTests/File.Infrastructure.UnitTests/File.Infrastructure.UnitTests.csproj b/src/Tests/UnitTests/File.Infrastructure.UnitTests/File.Infrastructure.UnitTests.csproj index 019fc1d..aa77c4e 100644 --- a/src/Tests/UnitTests/File.Infrastructure.UnitTests/File.Infrastructure.UnitTests.csproj +++ b/src/Tests/UnitTests/File.Infrastructure.UnitTests/File.Infrastructure.UnitTests.csproj @@ -9,14 +9,14 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/Converters/YamlToJsonFileConverterTests.cs b/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/Converters/YamlToJsonFileConverterTests.cs index a7b0bd0..604fff8 100644 --- a/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/Converters/YamlToJsonFileConverterTests.cs +++ b/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/Converters/YamlToJsonFileConverterTests.cs @@ -1,7 +1,7 @@ using File.Infrastructure.Abstractions; using File.Infrastructure.FileConversions.Converters; using File.Infrastructure.UnitTests.Assets; -using SharpYaml; +using YamlDotNet.Core; namespace File.Infrastructure.UnitTests.FileConversions.Converters { diff --git a/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/FileConversionServiceTests.cs b/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/FileConversionServiceTests.cs index da95193..7640694 100644 --- a/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/FileConversionServiceTests.cs +++ b/src/Tests/UnitTests/File.Infrastructure.UnitTests/FileConversions/FileConversionServiceTests.cs @@ -28,7 +28,7 @@ public async Task ConvertTo_Failed() { //Arrange var extension = "tst"; - var file = new Mock(); + var file = new Mock(); file.Setup(x => x.GetData(It.IsAny())).ReturnsAsync(Array.Empty()); file.SetupGet(x => x.FileName).Returns($"sone.{extension}"); diff --git a/src/Tests/UnitTests/File.UnitTests.Common/File.UnitTests.Common.csproj b/src/Tests/UnitTests/File.UnitTests.Common/File.UnitTests.Common.csproj index ce6e47d..15f5fe7 100644 --- a/src/Tests/UnitTests/File.UnitTests.Common/File.UnitTests.Common.csproj +++ b/src/Tests/UnitTests/File.UnitTests.Common/File.UnitTests.Common.csproj @@ -7,8 +7,8 @@ - - + +