2026-01-03 10:29:03 -06:00

125 lines
2.9 KiB
C#

namespace BudgetApp.Tests.Domain;
using BudgetApp.Domain.Models;
using Xunit;
public class MoneyTests
{
[Fact]
public void Constructor_WithValidAmount_CreatesMoney()
{
// Arrange & Act
var money = new Money(100.50m, "USD");
// Assert
Assert.Equal(100.50m, money.Amount);
Assert.Equal("USD", money.Currency);
}
[Fact]
public void Constructor_WithNegativeAmount_ThrowsException()
{
// Arrange, Act & Assert
Assert.Throws<ArgumentException>(() => new Money(-100m, "USD"));
}
[Fact]
public void Constructor_WithNullCurrency_ThrowsException()
{
// Arrange, Act & Assert
Assert.Throws<ArgumentException>(() => new Money(100m, null!));
Assert.Throws<ArgumentException>(() => new Money(100m, ""));
}
[Fact]
public void Add_WithSameCurrency_ReturnsSum()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(50m, "USD");
// Act
var result = money1.Add(money2);
// Assert
Assert.Equal(150m, result.Amount);
Assert.Equal("USD", result.Currency);
}
[Fact]
public void Add_WithDifferentCurrencies_ThrowsException()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(50m, "EUR");
// Act & Assert
Assert.Throws<InvalidOperationException>(() => money1.Add(money2));
}
[Fact]
public void Subtract_WithSameCurrency_ReturnsDifference()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(50m, "USD");
// Act
var result = money1.Subtract(money2);
// Assert
Assert.Equal(50m, result.Amount);
}
[Fact]
public void Subtract_ResultingInNegative_ThrowsException()
{
// Arrange
var money1 = new Money(50m, "USD");
var money2 = new Money(100m, "USD");
// Act & Assert
Assert.Throws<InvalidOperationException>(() => money1.Subtract(money2));
}
[Fact]
public void Equals_WithSameAmountAndCurrency_ReturnsTrue()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(100m, "USD");
// Act & Assert
Assert.True(money1.Equals(money2));
Assert.True(money1 == money2);
}
[Fact]
public void Equals_WithDifferentAmount_ReturnsFalse()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(50m, "USD");
// Act & Assert
Assert.False(money1.Equals(money2));
Assert.True(money1 != money2);
}
[Fact]
public void OperatorAdd_WithSameCurrency_ReturnsSum()
{
// Arrange
var money1 = new Money(100m, "USD");
var money2 = new Money(50m, "USD");
// Act
var result = money1 + money2;
// Assert
Assert.Equal(150m, result.Amount);
}
}