From 81a3e91d6e397995947d9e4db4251d90dce14503 Mon Sep 17 00:00:00 2001 From: Alejandro Sarmiento Date: Wed, 28 Feb 2024 22:40:34 +0100 Subject: [PATCH] Video 76 Se hizo toda la parte del Unit Of Work y estoy a punto de terminar la de tests unitarios --- .../Controllers/StreamerController.cs | 8 +- .../Controllers/VideoController.cs | 41 +++- .../CleanArchitecture.API/appsettings.json | 2 +- ...nArchitecture.Application.UnitTests.csproj | 34 +++ .../GetVideosListQueryHandlerXUnitTests.cs | 42 ++++ .../Mocks/MockStreamerRepository.cs | 12 + .../Mocks/MockUnitOfWork.cs | 18 ++ .../Mocks/MockVideoRepository.cs | 33 +++ .../CleanArchitecture.Application.csproj | 1 - .../Contracts/Persistence/IAsyncRepository.cs | 2 +- .../CreateDirector/CreateDirectorCommand.cs | 2 +- .../CreateDirectorCommandHandler.cs | 4 +- .../CreateStreamer/CreateStreamerCommand.cs | 5 +- .../CreateStreamerCommandHandler.cs | 12 +- .../DeleteStreamer/DeleteStreamerCommand.cs | 2 +- .../UpdateStreamer/UpdateStreamerCommand.cs | 7 +- .../UpdateStreamerCommandHandler.cs | 13 +- .../CreateVideo/CreateVideoCommand.cs | 11 + .../CreateVideo/CreateVideoCommandHandler.cs | 57 +++++ .../CreateVideoCommandValidator.cs | 17 ++ .../DeleteVideo/DeleteStreamerCommand.cs | 9 + .../DeleteStreamerCommandHandler.cs | 39 +++ .../UpdateVideo/UpdateStreamerCommand.cs | 12 + .../UpdateStreamerCommandHandler.cs | 43 ++++ .../UpdateStreamerCommandValidator.cs | 21 ++ .../Videos/Queries/GetVideosList/VideosVm.cs | 2 +- .../Mappings/MappingProfile.cs | 10 +- .../CleanArchitecture.Infrastructure.csproj | 4 + ...0240215190923_Second-Migration.Designer.cs | 163 ------------- .../20240215190923_Second-Migration.cs | 148 ----------- ...15201317_BaseDomainModelUpdate.Designer.cs | 215 ---------------- .../20240215201317_BaseDomainModelUpdate.cs | 187 -------------- ...23327_cleanArchitectureFromApi.Designer.cs | 230 ------------------ ...20240218123327_cleanArchitectureFromApi.cs | 72 ------ ...40221215002_Initial-Migration.Designer.cs} | 53 +++- ...cs => 20240221215002_Initial-Migration.cs} | 27 +- .../ApplicationDbContextModelSnapshot.cs | 227 ----------------- .../StreamerDbContextModelSnapshot.cs | 103 ++++++++ .../Persistence/StreamerDbContext.cs | 85 +++++-- .../Repositories/RepositoryBase.cs | 2 +- .../Repositories/StreamerRepository.cs | 2 +- .../Repositories/UnitOfWork.cs | 92 +++---- .../Repositories/VideoRepository.cs | 2 +- .../CleanArchitecture.Domain/Actor.cs | 6 +- .../Common/BaseDomainModel.cs | 2 +- .../CleanArchitecture.Domain/Video.cs | 16 +- CleanArchitecture/CleanArchitecture.sln | 9 +- .../MandarCorreo/MandarCorreo.sln | 25 ++ .../MandarCorreo/MandarCorreo.csproj | 10 + .../MandarCorreo/MandarCorreo/Program.cs | 28 +++ .../MongoProject.API/MongoProject.API.csproj | 17 ++ .../MongoProject.API/MongoProject.API.http | 6 + .../MongoProject/MongoProject.API/Program.cs | 23 ++ .../Properties/launchSettings.json | 31 +++ .../appsettings.Development.json | 8 + .../MongoProject.API/appsettings.json | 9 + .../MongoProject.Application.csproj | 9 + .../MongoProject/MongoProject.Domain/Actor.cs | 17 ++ .../Common/BaseDomainModel.cs | 18 ++ .../MongoProject.Domain/Common/ValueObject.cs | 41 ++++ .../MongoProject.Domain/Director.cs | 13 + .../MongoProject.Domain.csproj | 9 + .../MongoProject.Domain/Streamer.cs | 16 ++ .../MongoProject/MongoProject.Domain/Video.cs | 22 ++ .../MongoProject.Domain/VideoActor.cs | 12 + .../MongoProject.Infrastructure.csproj | 9 + .../MongoProject/MongoProject.sln | 60 +++++ 67 files changed, 1112 insertions(+), 1375 deletions(-) create mode 100644 CleanArchitecture/CleanArchitecture.Application.UnitTests/CleanArchitecture.Application.UnitTests.csproj create mode 100644 CleanArchitecture/CleanArchitecture.Application.UnitTests/Features/Video/Queries/GetVideosListQueryHandlerXUnitTests.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockStreamerRepository.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockUnitOfWork.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockVideoRepository.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/CreateVideo/CreateVideoCommand.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/CreateVideo/CreateVideoCommandHandler.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/CreateVideo/CreateVideoCommandValidator.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/DeleteVideo/DeleteStreamerCommand.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/DeleteVideo/DeleteStreamerCommandHandler.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/UpdateVideo/UpdateStreamerCommand.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/UpdateVideo/UpdateStreamerCommandHandler.cs create mode 100644 CleanArchitecture/CleanArchitecture.Application/Features/Videos/Commands/UpdateVideo/UpdateStreamerCommandValidator.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240215190923_Second-Migration.Designer.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240215190923_Second-Migration.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240215201317_BaseDomainModelUpdate.Designer.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240215201317_BaseDomainModelUpdate.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240218123327_cleanArchitectureFromApi.Designer.cs delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/20240218123327_cleanArchitectureFromApi.cs rename CleanArchitecture/CleanArchitecture.Data/Migrations/{20240215100525_InitialMigration.Designer.cs => 20240221215002_Initial-Migration.Designer.cs} (51%) rename CleanArchitecture/CleanArchitecture.Data/Migrations/{20240215100525_InitialMigration.cs => 20240221215002_Initial-Migration.cs} (59%) delete mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/ApplicationDbContextModelSnapshot.cs create mode 100644 CleanArchitecture/CleanArchitecture.Data/Migrations/StreamerDbContextModelSnapshot.cs create mode 100644 CleanArchitectureRedis/MandarCorreo/MandarCorreo.sln create mode 100644 CleanArchitectureRedis/MandarCorreo/MandarCorreo/MandarCorreo.csproj create mode 100644 CleanArchitectureRedis/MandarCorreo/MandarCorreo/Program.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/MongoProject.API.csproj create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/MongoProject.API.http create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/Program.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/Properties/launchSettings.json create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/appsettings.Development.json create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.API/appsettings.json create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Application/MongoProject.Application.csproj create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Actor.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Common/BaseDomainModel.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Common/ValueObject.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Director.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/MongoProject.Domain.csproj create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Streamer.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/Video.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Domain/VideoActor.cs create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.Infrastructure/MongoProject.Infrastructure.csproj create mode 100644 CleanArchitectureRedis/MongoProject/MongoProject.sln diff --git a/CleanArchitecture/CleanArchitecture.API/Controllers/StreamerController.cs b/CleanArchitecture/CleanArchitecture.API/Controllers/StreamerController.cs index 1128e83..80547c1 100644 --- a/CleanArchitecture/CleanArchitecture.API/Controllers/StreamerController.cs +++ b/CleanArchitecture/CleanArchitecture.API/Controllers/StreamerController.cs @@ -25,7 +25,7 @@ namespace CleanArchitecture.API.Controllers public async Task> CreateStreamer([FromBody] CreateStreamerCommand command) { var response = await mediator.Send(command); - return Ok(new { StreamerId = response }); + return Ok(response); } [HttpPut(Name = "UpdateStreamer")] @@ -35,8 +35,8 @@ namespace CleanArchitecture.API.Controllers [ProducesDefaultResponseType] public async Task UpdateStreamer([FromBody] UpdateStreamerCommand command) { - await mediator.Send(command); - return NoContent(); + var createdStreamer = await mediator.Send(command); + return Ok(createdStreamer); } [HttpDelete("{id}", Name = "DeleteStreamer")] @@ -44,7 +44,7 @@ namespace CleanArchitecture.API.Controllers [ProducesResponseType((int)HttpStatusCode.NoContent)] [ProducesResponseType((int)HttpStatusCode.NotFound)] [ProducesDefaultResponseType] - public async Task DeleteStreamer(int id) + public async Task DeleteStreamer(Guid id) { var request = new DeleteStreamerCommand() { Id = id }; await mediator.Send(request); diff --git a/CleanArchitecture/CleanArchitecture.API/Controllers/VideoController.cs b/CleanArchitecture/CleanArchitecture.API/Controllers/VideoController.cs index c5a464b..54caf39 100644 --- a/CleanArchitecture/CleanArchitecture.API/Controllers/VideoController.cs +++ b/CleanArchitecture/CleanArchitecture.API/Controllers/VideoController.cs @@ -1,4 +1,11 @@ -using CleanArchitecture.Application.Features.Videos.Queries.GetVideosList; +using CleanArchitecture.Application.Features.Streamers.Commands.CreateStreamer; +using CleanArchitecture.Application.Features.Streamers.Commands.DeleteStreamer; +using CleanArchitecture.Application.Features.Streamers.Commands.UpdateStreamer; +using CleanArchitecture.Application.Features.Videos.Commands.CreateVideo; +using CleanArchitecture.Application.Features.Videos.Commands.DeleteVideo; +using CleanArchitecture.Application.Features.Videos.Commands.UpdateVideo; +using CleanArchitecture.Application.Features.Videos.Queries.GetVideosList; +using CleanArchitecture.Domain; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; @@ -27,5 +34,37 @@ namespace CleanArchitecture.API.Controllers var videos = await mediator.Send(query); return Ok(videos); } + + [HttpPost(Name = "CreateVideo")] + [Authorize(Roles = "Administrator")] + [ProducesResponseType(typeof(int), (int)HttpStatusCode.OK)] + public async Task> CreateVideo([FromBody] CreateVideoCommand command) + { + var response = await mediator.Send(command); + return Ok(response); + } + + [HttpPut(Name = "UpdateVideo")] + [Authorize(Roles = "Administrator")] + [ProducesResponseType((int)HttpStatusCode.NoContent)] + [ProducesResponseType((int)HttpStatusCode.NotFound)] + [ProducesDefaultResponseType] + public async Task> UpdateVideo([FromBody] UpdateVideoCommand command) + { + var response = await mediator.Send(command); + return Ok(response); + } + + [HttpDelete("{id}", Name = "DeleteVideo")] + [Authorize(Roles = "Administrator")] + [ProducesResponseType((int)HttpStatusCode.NoContent)] + [ProducesResponseType((int)HttpStatusCode.NotFound)] + [ProducesDefaultResponseType] + public async Task DeleteVideo(Guid id) + { + var request = new DeleteVideoCommand() { Id = id }; + await mediator.Send(request); + return NoContent(); + } } } diff --git a/CleanArchitecture/CleanArchitecture.API/appsettings.json b/CleanArchitecture/CleanArchitecture.API/appsettings.json index 7ec6057..351455a 100644 --- a/CleanArchitecture/CleanArchitecture.API/appsettings.json +++ b/CleanArchitecture/CleanArchitecture.API/appsettings.json @@ -1,7 +1,7 @@ { "ConnectionStrings": { - "ConnectionString": "server=localhost;database=CleanArchitecture;user=root;password=securePassword", + "ConnectionString": "server=localhost;database=CleanArchitectureV2;user=root;password=securePassword", "IdentityConnectionString": "server=localhost;database=CleanArchitecture.Security;user=root;password=securePassword" }, "EmailSettings": { diff --git a/CleanArchitecture/CleanArchitecture.Application.UnitTests/CleanArchitecture.Application.UnitTests.csproj b/CleanArchitecture/CleanArchitecture.Application.UnitTests/CleanArchitecture.Application.UnitTests.csproj new file mode 100644 index 0000000..ef074c7 --- /dev/null +++ b/CleanArchitecture/CleanArchitecture.Application.UnitTests/CleanArchitecture.Application.UnitTests.csproj @@ -0,0 +1,34 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + diff --git a/CleanArchitecture/CleanArchitecture.Application.UnitTests/Features/Video/Queries/GetVideosListQueryHandlerXUnitTests.cs b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Features/Video/Queries/GetVideosListQueryHandlerXUnitTests.cs new file mode 100644 index 0000000..31e2911 --- /dev/null +++ b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Features/Video/Queries/GetVideosListQueryHandlerXUnitTests.cs @@ -0,0 +1,42 @@ +using AutoMapper; +using CleanArchitecture.Application.Contracts.Persistence; +using CleanArchitecture.Application.Features.Videos.Queries.GetVideosList; +using CleanArchitecture.Application.Mappings; +using CleanArchitecture.Application.UnitTests.Mocks; +using Moq; +using Shouldly; +using Xunit; + +namespace CleanArchitecture.Application.UnitTests.Features.Video.Queries +{ + public class GetVideosListQueryHandlerXUnitTests + { + + private readonly IMapper mapper; + private readonly Mock mockUnitOfWork; + + public GetVideosListQueryHandlerXUnitTests() + { + mockUnitOfWork = MockUnitOfWork.GetUnitOfWork(); + var mapperConfiguration = new MapperConfiguration(cfg => + { + cfg.AddProfile(); + }); + mapper = mapperConfiguration.CreateMapper(); + + } + + [Fact] + public async Task GetVideoListTest() + { + var handler = new GetVideosListQueryHandler(mockUnitOfWork.Object, mapper); + var request = new GetVideosListQuery("Alex"); + var result = await handler.Handle(request, CancellationToken.None); + + result.ShouldBeOfType>(); + result.Count.ShouldBe(1); + + + } + } +} diff --git a/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockStreamerRepository.cs b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockStreamerRepository.cs new file mode 100644 index 0000000..0b47829 --- /dev/null +++ b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockStreamerRepository.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CleanArchitecture.Application.UnitTests.Mocks +{ + internal class MockStreamerRepository + { + } +} diff --git a/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockUnitOfWork.cs b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockUnitOfWork.cs new file mode 100644 index 0000000..505848a --- /dev/null +++ b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockUnitOfWork.cs @@ -0,0 +1,18 @@ +using CleanArchitecture.Application.Contracts.Persistence; +using Moq; + +namespace CleanArchitecture.Application.UnitTests.Mocks +{ + public static class MockUnitOfWork + { + + public static Mock GetUnitOfWork() + { + var mockUnitOfWork = new Mock(); + var mockVideoRepository = MockVideoRepository.GetVideoRepository(); + mockUnitOfWork.Setup(uow => uow.VideoRepository).Returns(mockVideoRepository.Object); + return mockUnitOfWork; + } + + } +} diff --git a/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockVideoRepository.cs b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockVideoRepository.cs new file mode 100644 index 0000000..1aafed0 --- /dev/null +++ b/CleanArchitecture/CleanArchitecture.Application.UnitTests/Mocks/MockVideoRepository.cs @@ -0,0 +1,33 @@ +using AutoFixture; +using CleanArchitecture.Application.Contracts.Persistence; +using CleanArchitecture.Domain; +using CleanArchitecture.Infrastructure.Persistence; +using Microsoft.EntityFrameworkCore; +using Moq; +using CleanArchitecture.Infrastructure.Repositories; + +namespace CleanArchitecture.Application.UnitTests.Mocks +{ + public static class MockVideoRepository + { + public static Mock GetVideoRepository() + { + var fixture = new Fixture(); + fixture.Behaviors.Add(new OmitOnRecursionBehavior()); + + var videos = fixture.CreateMany