Unit test improvements.

This commit is contained in:
2026-07-30 12:35:33 +02:00
parent fe9b68dba0
commit 8145ff1054
22 changed files with 283 additions and 160 deletions
@@ -1,34 +1,40 @@
using FinancialApi.Domain.Entities;
using FinancialApi.Domain.Exceptions;
namespace FinancialApi.Domain.Aggregates;
public record BalancedJournal
{
public JournalEntry Entry { get; }
public BalancedJournalEntry Entry { get; }
private BalancedJournal(JournalEntry entry)
private BalancedJournal(BalancedJournalEntry entry)
{
Entry = entry;
}
public static BalancedJournal Create(Guid id, string description, DateTimeOffset createdAt, List<JournalLine> lines)
{
if (lines.Count(l => l.Type == EntryType.Debit) == 0)
{
throw new GaapViolationException($"GAAP Violation: A journal entry needs at least one debit line.");
}
if (lines.Count(l => l.Type == EntryType.Credit) == 0)
{
throw new GaapViolationException($"A journal entry needs at least one credit line.");
}
var debits = lines.Where(l => l.Type == EntryType.Debit)
.Sum(l => l.Amount);
var credits = lines.Where(l => l.Type == EntryType.Credit)
.Sum(l => l.Amount);
if (debits != credits)
{
throw new InvalidOperationException(
$"GAAP Violation: Total Debits ({debits}) must equal Total Credits ({credits})!"
);
}
return new BalancedJournal(new JournalEntry(id, description, createdAt, lines));
return debits != credits
? throw new GaapViolationException($"Total Debits ({debits}) must equal Total Credits ({credits})!")
: new BalancedJournal(new BalancedJournalEntry(id, description, createdAt, lines));
}
public static BalancedJournal CreateReversal(JournalEntry original, string reason, DateTimeOffset now)
public static BalancedJournal CreateReversal(BalancedJournalEntry original, string reason, DateTimeOffset now)
{
var reversedLines = original.Lines.Select(l =>
l with { Type = l.Type == EntryType.Debit ? EntryType.Credit : EntryType.Debit }
@@ -1,4 +1,6 @@
namespace FinancialApi.Domain.Entities;
using FinancialApi.Domain.Exceptions;
namespace FinancialApi.Domain.Entities;
public enum AccountType
{
@@ -1,15 +1,13 @@
namespace FinancialApi.Domain.Entities;
public record JournalEntry
public record BalancedJournalEntry
{
public Guid Id { get; init; }
public string Description { get; init; }
public DateTimeOffset CreatedAt { get; init; }
public List<JournalLine> Lines { get; init; } = [];
internal JournalEntry() { }
internal JournalEntry(Guid id, string description, DateTimeOffset createdAt, List<JournalLine> lines)
internal BalancedJournalEntry(Guid id, string description, DateTimeOffset createdAt, List<JournalLine> lines)
{
Lines = lines;
Id = id;
@@ -1,3 +0,0 @@
namespace FinancialApi.Domain.Entities;
public class InsufficientFundsException(string message) : Exception(message);
@@ -1,3 +0,0 @@
namespace FinancialApi.Domain.Entities;
public class InvalidStartingBalanceException(string message) : Exception(message);
@@ -0,0 +1,3 @@
namespace FinancialApi.Domain.Exceptions;
public class GaapViolationException(string message) : Exception(message);
@@ -0,0 +1,3 @@
namespace FinancialApi.Domain.Exceptions;
public class InsufficientFundsException(string message) : GaapViolationException(message);
@@ -0,0 +1,3 @@
namespace FinancialApi.Domain.Exceptions;
public class InvalidStartingBalanceException(string message) : GaapViolationException(message);