Skip to content

Commit

Permalink
Fix TransactionService Update unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Chingling152 committed Mar 14, 2024
1 parent dc26de2 commit 45aa732
Showing 1 changed file with 182 additions and 68 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using FinancialHub.Core.Domain.DTOS.Transactions;
using FinancialHub.Core.Domain.Tests.Builders.DTOS.Transactions;
using static FinancialHub.Common.Results.Errors.ValidationError;

namespace FinancialHub.Core.Application.Tests.Services
{
Expand All @@ -14,118 +15,231 @@ protected void AddUpdateTransactionBuilder()
[Test]
public async Task UpdateAsync_ValidTransaction_UpdatesTransaction()
{
var model = this.transactionModelBuilder.Generate();
var id = model.Id.GetValueOrDefault();

this.provider
.Setup(x => x.GetByIdAsync(id))
.ReturnsAsync(model)
.Verifiable();
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(ServiceResult.Success);
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(ServiceResult.Success);
this.provider
.Setup(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()))
.Returns<Guid, TransactionModel>(async (_, x) => await Task.FromResult(x))
.Verifiable();

var updateTransaction = updateTransactionDtoBuilder
.WithBalanceId(model.BalanceId)
.WithCategoryId(model.CategoryId)
.Generate();
await this.service.UpdateAsync(model.Id.GetValueOrDefault(), updateTransaction);
await this.service.UpdateAsync(id, updateTransaction);

this.provider.Verify(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()), Times.Once);
}

[Test]
public async Task UpdateAsync_ValidTransaction_ReturnsTransaction()
{
var model = this.transactionModelBuilder.Generate();
var id = model.Id.GetValueOrDefault();

this.provider
.Setup(x => x.GetByIdAsync(id))
.ReturnsAsync(model)
.Verifiable();

var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(ServiceResult.Success);
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(ServiceResult.Success);
this.provider
.Setup(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()))
.Returns<Guid, TransactionModel>(async (_, x) => await Task.FromResult(x))
.Verifiable();
.Returns<Guid, TransactionModel>(async (_, x) => await Task.FromResult(x));

var updateTransaction = updateTransactionDtoBuilder
.WithBalanceId(model.BalanceId)
.WithCategoryId(model.CategoryId)
.Generate();
var result = await this.service.UpdateAsync(model.Id.GetValueOrDefault(), updateTransaction);
var result = await this.service.UpdateAsync(id, updateTransaction);

Assert.IsNotNull(result);
Assert.IsInstanceOf<ServiceResult<TransactionDto>>(result);
}

[Test]
public async Task UpdateAsync_NonExistingTransactionId_ReturnsResultError()
public async Task UpdateAsync_InvalidTransaction_DoNotUpdatesTransaction()
{
var model = this.transactionModelBuilder.Generate();
var id = model.Id.GetValueOrDefault();
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.provider
.Setup(x => x.GetByIdAsync(id))
.ReturnsAsync(default(TransactionModel))
.Verifiable();
this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(new ValidationError("Transaction Validation Error", Array.Empty<FieldValidationError>()));

this.provider
.Setup(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()))
.Returns<Guid,TransactionModel>(async (_, x) => await Task.FromResult(x))
.Verifiable();
await this.service.UpdateAsync(id, updateTransaction);

var updateTransaction = updateTransactionDtoBuilder
.WithBalanceId(model.BalanceId)
.WithCategoryId(model.CategoryId)
.Generate();
var result = await this.service.UpdateAsync(model.Id.GetValueOrDefault(), updateTransaction);
this.provider.Verify(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()), Times.Never);
}

[Test]
public async Task UpdateAsync_InvalidTransaction_ReturnsValidationError()
{
var expectedMessage = "Transaction Validation Error";
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(new ValidationError(expectedMessage, Array.Empty<FieldValidationError>()));

var result = await this.service.UpdateAsync(id, updateTransaction);

Assert.IsInstanceOf<ServiceResult<TransactionDto>>(result);
Assert.IsTrue(result.HasError);
Assert.IsInstanceOf<ValidationError>(result.Error);
Assert.AreEqual(expectedMessage, result.Error!.Message);
}

[Test]
public async Task UpdateAsync_InvalidCategory_ReturnsNotFoundError()
public async Task UpdateAsync_NonExistingTransactionId_ReturnsNotFoundError()
{
var model = this.transactionModelBuilder.Generate();
var expectedErrorMessage = $"Not found Category with id {model.CategoryId}";
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();
var expectedMessage = $"Not found transaction with id {id}";

this.provider
.Setup(x => x.GetByIdAsync(model.Id.GetValueOrDefault()))
.ReturnsAsync(model)
.Verifiable();
this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(new NotFoundError(expectedMessage));

var updateTransaction = updateTransactionDtoBuilder
.WithBalanceId(model.BalanceId)
.WithCategoryId(model.CategoryId)
.Generate();
var result = await this.service.UpdateAsync(model.Id.GetValueOrDefault(), updateTransaction);
var result = await this.service.UpdateAsync(id, updateTransaction);

Assert.IsTrue(result.HasError);
Assert.IsInstanceOf<NotFoundError>(result.Error);
Assert.AreEqual(expectedMessage, result.Error!.Message);
}

[Test]
public async Task UpdateAsync_NonExistingTransactionId_DoNotUpdatesTransaction()
{
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(new NotFoundError($"Not found transaction with id {id}"));

await this.service.UpdateAsync(id, updateTransaction);

this.provider.Verify(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()), Times.Never);
}

[Test]
public async Task UpdateAsync_InvalidCategory_ReturnsNotFoundError()
{
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();
var expectedErrorMessage = $"Not found Category with id {updateTransaction.CategoryId}";

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(ServiceResult.Success);
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(new NotFoundError(expectedErrorMessage));

var result = await this.service.UpdateAsync(id, updateTransaction);

Assert.IsTrue(result.HasError);
Assert.IsInstanceOf<NotFoundError>(result.Error);
Assert.AreEqual(expectedErrorMessage, result.Error!.Message);
}

[Test]
public async Task UpdateAsync_InvalidBalance_ReturnsNotFoundError()
public async Task UpdateAsync_InvalidCategory_DoNotUpdatesTransaction()
{
var model = this.transactionModelBuilder.Generate();
var expectedErrorMessage = $"Not found Balance with id {model.BalanceId}";
this.provider
.Setup(x => x.GetByIdAsync(model.Id.GetValueOrDefault()))
.ReturnsAsync(model)
.Verifiable();
var updateTransaction = updateTransactionDtoBuilder.Generate();
var id = Guid.NewGuid();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(ServiceResult.Success);
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(new NotFoundError($"Not found Category with id {updateTransaction.CategoryId}"));

await this.service.UpdateAsync(id, updateTransaction);

this.provider.Verify(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()), Times.Never);
}

var updateTransaction = updateTransactionDtoBuilder
.WithBalanceId(model.BalanceId)
.WithCategoryId(model.CategoryId)
.Generate();
var result = await this.service.UpdateAsync(model.Id.GetValueOrDefault(), updateTransaction);
[Test]
public async Task UpdateAsync_InvalidBalance_ReturnsNotFoundError()
{
var id = Guid.NewGuid();
var updateTransaction = updateTransactionDtoBuilder.Generate();
var expectedErrorMessage = $"Not found Balance with id {updateTransaction.BalanceId}";

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(new NotFoundError(expectedErrorMessage));
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(ServiceResult.Success);

var result = await this.service.UpdateAsync(id, updateTransaction);

Assert.IsTrue(result.HasError);
Assert.IsInstanceOf<NotFoundError>(result.Error);
Assert.AreEqual(expectedErrorMessage, result.Error!.Message);
}

[Test]
public async Task UpdateAsync_InvalidBalance_DoNotUpdatesTransaction()
{
var id = Guid.NewGuid();
var updateTransaction = updateTransactionDtoBuilder.Generate();

this.validator
.Setup(x => x.ValidateAsync(updateTransaction))
.ReturnsAsync(ServiceResult.Success);
this.validator
.Setup(x => x.ExistsAsync(id))
.ReturnsAsync(ServiceResult.Success);
this.balancesValidator
.Setup(x => x.ExistsAsync(updateTransaction.BalanceId))
.ReturnsAsync(new NotFoundError($"Not found Balance with id {updateTransaction.BalanceId}"));
this.categoriesValidator
.Setup(x => x.ExistsAsync(updateTransaction.CategoryId))
.ReturnsAsync(ServiceResult.Success);

var result = await this.service.UpdateAsync(id, updateTransaction);

this.provider.Verify(x => x.UpdateAsync(id, It.IsAny<TransactionModel>()), Times.Never);
}
}
}

0 comments on commit 45aa732

Please sign in to comment.