From c3d725321d093a3bd1e8d4a74476de9f4c0f28a7 Mon Sep 17 00:00:00 2001 From: StarryFolf Date: Wed, 7 Jun 2023 10:38:58 +0700 Subject: [PATCH] test: add integration tests --- .../BaseClassFixture.cs | 4 +- .../Borrows/Commands/UpdateBorrowTests.cs | 186 ++++++++++++++++++ 2 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 tests/Application.Tests.Integration/Borrows/Commands/UpdateBorrowTests.cs diff --git a/tests/Application.Tests.Integration/BaseClassFixture.cs b/tests/Application.Tests.Integration/BaseClassFixture.cs index ee1f2c14..304ec0e7 100644 --- a/tests/Application.Tests.Integration/BaseClassFixture.cs +++ b/tests/Application.Tests.Integration/BaseClassFixture.cs @@ -207,8 +207,8 @@ protected static Borrow CreateBorrowRequest(User borrower, Document document, Bo Document = document, Reason = "something something", Status = status, - BorrowTime = LocalDateTime.FromDateTime(DateTime.UtcNow), - DueTime = LocalDateTime.FromDateTime(DateTime.UtcNow + TimeSpan.FromDays(1)) + BorrowTime = LocalDateTime.FromDateTime(DateTime.Now), + DueTime = LocalDateTime.FromDateTime(DateTime.Now + TimeSpan.FromDays(1)) }; } } \ No newline at end of file diff --git a/tests/Application.Tests.Integration/Borrows/Commands/UpdateBorrowTests.cs b/tests/Application.Tests.Integration/Borrows/Commands/UpdateBorrowTests.cs new file mode 100644 index 00000000..f00d3e25 --- /dev/null +++ b/tests/Application.Tests.Integration/Borrows/Commands/UpdateBorrowTests.cs @@ -0,0 +1,186 @@ +using Application.Borrows.Commands; +using Application.Common.Exceptions; +using Application.Identity; +using Domain.Entities.Physical; +using Domain.Statuses; +using FluentAssertions; +using Infrastructure.Persistence; +using Microsoft.Extensions.DependencyInjection; +using NodaTime; +using Xunit; + +namespace Application.Tests.Integration.Borrows.Commands; + +public class UpdateBorrowTests : BaseClassFixture +{ + public UpdateBorrowTests(CustomApiFactory apiFactory) : base(apiFactory) + { + + } + + [Fact] + public async Task ShouldUpdateBorrow_WhenDetailsAreValid() + { + // Arrange + var user = CreateUser(IdentityData.Roles.Employee, "aaaaaa"); + + var document = CreateNDocuments(1).First(); + + var borrow = CreateBorrowRequest(user, document, BorrowRequestStatus.Pending); + + await AddAsync(borrow); + + var command = new UpdateBorrow.Command() + { + Reason = "Example Update", + BorrowFrom = DateTime.Now.AddDays(3), + BorrowTo = DateTime.Now.AddDays(12), + BorrowId = borrow.Id, + }; + + // Act + var result = await SendAsync(command); + + // Assert + result.Reason.Should().Be(command.Reason); + result.BorrowTime.Should().Be(command.BorrowFrom); + result.DueTime.Should().Be(command.BorrowTo); + + // Cleanup + Remove(await FindAsync(borrow.Id)); + Remove(user); + Remove(document); + } + + [Fact] + public async Task ShouldThrowKeyNotFoundException_WhenRequestDoesNotExist() + { + // Arrange + var command = new UpdateBorrow.Command() + { + Reason = "adsda", + BorrowFrom = DateTime.Now.AddHours(1), + BorrowTo = DateTime.Now.AddHours(2), + BorrowId = Guid.NewGuid(), + }; + + // Act + var result = async () => await SendAsync(command); + + // Assert + await result.Should().ThrowAsync() + .WithMessage("Borrow request does not exist."); + } + + [Fact] + public async Task ShouldThrowConflictException_WhenRequestStatusIsNotPending() + { + // Arrange + var user = CreateUser(IdentityData.Roles.Employee, "a"); + + var document = CreateNDocuments(1).First(); + + var borrow = CreateBorrowRequest(user, document, BorrowRequestStatus.Approved); + + await AddAsync(borrow); + + var command = new UpdateBorrow.Command() + { + Reason = "Example Update", + BorrowFrom = DateTime.Now.AddDays(3), + BorrowTo = DateTime.Now.AddDays(12), + BorrowId = borrow.Id, + }; + + // Act + var result = async () => await SendAsync(command); + + // Assert + await result.Should().ThrowAsync() + .WithMessage("Cannot update borrow request."); + + // Cleanup + Remove(borrow); + Remove(user); + Remove(document); + } + + [Fact] + public async Task ShouldThrowConflictException_WhenDocumentIsLost() + { + // Arrange + var user = CreateUser(IdentityData.Roles.Employee, "a"); + + var document = CreateNDocuments(1).First(); + document.Status = DocumentStatus.Lost; + + var borrow = CreateBorrowRequest(user, document, BorrowRequestStatus.Pending); + + await AddAsync(borrow); + + var command = new UpdateBorrow.Command() + { + Reason = "Example Update", + BorrowFrom = DateTime.Now.AddDays(3), + BorrowTo = DateTime.Now.AddDays(12), + BorrowId = borrow.Id, + }; + + // Act + var result = async () => await SendAsync(command); + + // Assert + await result.Should().ThrowAsync() + .WithMessage("Document is lost."); + + // Cleanup + Remove(borrow); + Remove(user); + Remove(document); + } + + [Fact] + public async Task ShouldThrowConflictException_WhenRequestTimespanOverlapAnApprovedOrCheckedOutRequestTimespan() + { + // Arrange + using var scope = ScopeFactory.CreateScope(); + var context = scope.ServiceProvider.GetRequiredService(); + + var user1 = CreateUser(IdentityData.Roles.Employee, "a"); + var user2 = CreateUser(IdentityData.Roles.Employee, "a"); + + var document = CreateNDocuments(1).First(); + + var borrow1 = CreateBorrowRequest(user1, document, BorrowRequestStatus.Pending); + var borrow2 = CreateBorrowRequest(user2, document, BorrowRequestStatus.Approved); + borrow2.BorrowTime = LocalDateTime.FromDateTime(DateTime.Now.AddDays(4)); + borrow2.DueTime = LocalDateTime.FromDateTime(DateTime.Now.AddDays(12)); + + await context.AddAsync(borrow1); + await context.AddAsync(borrow2); + + await context.SaveChangesAsync(); + + var command = new UpdateBorrow.Command() + { + Reason = "Example Update", + BorrowFrom = DateTime.Now.AddDays(5), + BorrowTo = DateTime.Now.AddDays(13), + BorrowId = borrow1.Id, + }; + + // Act + var result = async () => await SendAsync(command); + + // Assert + await result.Should().ThrowAsync() + .WithMessage("This document cannot be borrowed."); + + // Cleanup + Remove(borrow1); + Remove(borrow2); + Remove(user1); + Remove(user2); + Remove(document); + } +} \ No newline at end of file