fix tests for fp2

This commit is contained in:
Oli Sturm
2026-04-22 15:31:07 +01:00
parent 778e181ed1
commit 1debc5d600
2 changed files with 50 additions and 46 deletions
+27 -32
View File
@@ -1,5 +1,4 @@
using CsharpFp2.Applications;
using CsharpFp2.Contracts;
using CsharpFp2.Application;
using CsharpFp2.Domain;
using CsharpFp2.Infrastructure;
@@ -10,76 +9,72 @@ namespace CsharpFp2.Tests;
public class WithdrawMoneyHandlerTests
{
private static (
WithdrawMoneyHandler handler,
InMemoryAccountRepository repository
WithdrawMoney withdraw,
LoadAccount loadAccount,
SaveAccount saveAccount
) BuildHandler()
{
var repository = new InMemoryAccountRepository();
var handler = new WithdrawMoneyHandler(repository);
return (handler, repository);
var (loadAccount, saveAccount) = InMemoryAccount.Create();
var withdraw = AccountApplication.CreateWithdrawMoney(loadAccount, saveAccount);
return (withdraw, loadAccount, saveAccount);
}
[Fact]
public void Withdrawing_from_an_account_reduces_its_balance_by_the_withdrawn_amount()
{
var (handler, repository) = BuildHandler();
var (withdraw, loadAccount, saveAccount) = BuildHandler();
var accountId = Guid.NewGuid();
repository.Save(new Account(new AccountId(accountId), new Money(200m)));
saveAccount(AccountDomain.Open(accountId, new Money(200m)));
handler.Handle(new WithdrawMoneyCommand { AccountId = accountId, Amount = 75m });
withdraw(accountId, 75m);
var account = repository.GetById(new AccountId(accountId))!;
var account = loadAccount(accountId)!;
Assert.Equal(125m, account.Balance.Amount);
}
[Fact]
public void Withdrawing_the_entire_balance_leaves_the_account_at_zero()
{
var (handler, repository) = BuildHandler();
var (withdraw, loadAccount, saveAccount) = BuildHandler();
var accountId = Guid.NewGuid();
repository.Save(new Account(new AccountId(accountId), new Money(100m)));
saveAccount(AccountDomain.Open(accountId, new Money(100m)));
handler.Handle(new WithdrawMoneyCommand { AccountId = accountId, Amount = 100m });
withdraw(accountId, 100m);
var account = repository.GetById(new AccountId(accountId))!;
var account = loadAccount(accountId)!;
Assert.Equal(0m, account.Balance.Amount);
}
[Fact]
public void Withdrawing_from_a_non_existent_account_throws()
{
var (handler, _) = BuildHandler();
var command = new WithdrawMoneyCommand { AccountId = Guid.NewGuid(), Amount = 50m };
var (withdraw, _, _) = BuildHandler();
Assert.Throws<InvalidOperationException>(() => handler.Handle(command));
Assert.Throws<InvalidOperationException>(() => withdraw(Guid.NewGuid(), 50m));
}
[Fact]
public void Withdrawing_more_than_the_available_balance_throws()
public void Withdrawing_more_than_the_available_balance_returns_InsufficientBalance()
{
var (handler, repository) = BuildHandler();
var (withdraw, _, saveAccount) = BuildHandler();
var accountId = Guid.NewGuid();
repository.Save(new Account(new AccountId(accountId), new Money(50m)));
saveAccount(AccountDomain.Open(accountId, new Money(50m)));
Assert.Throws<InsufficientBalanceException>(() =>
handler.Handle(new WithdrawMoneyCommand { AccountId = accountId, Amount = 100m })
);
var result = withdraw(accountId, 100m);
Assert.IsType<WithdrawResult.InsufficientBalance>(result);
}
[Fact]
public void After_a_failed_withdrawal_the_balance_is_unchanged()
{
var (handler, repository) = BuildHandler();
var (withdraw, loadAccount, saveAccount) = BuildHandler();
var accountId = Guid.NewGuid();
repository.Save(new Account(new AccountId(accountId), new Money(50m)));
saveAccount(AccountDomain.Open(accountId, new Money(50m)));
try
{
handler.Handle(new WithdrawMoneyCommand { AccountId = accountId, Amount = 999m });
}
catch (InsufficientBalanceException) { }
withdraw(accountId, 999m);
var account = repository.GetById(new AccountId(accountId))!;
var account = loadAccount(accountId)!;
Assert.Equal(50m, account.Balance.Amount);
}
}