ldc-mesbr-app/tests/Unit/Shared/ValueObjects/MoneyTest.php
2026-10-02 12:47:27 +02:00

61 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\Shared\ValueObjects;
use Shared\Enums\Currency;
use Shared\ValueObjects\Money;
covers(Money::class);
describe('money', function (): void {
it('creates a valid money value', function (): void {
// GIVEN
$value = 300;
// WHEN
$money = new Money(Currency::EUR, $value);
// THEN
expect($money)->toBeInstanceOf(Money::class)
->and($money->currency)->toBe(Currency::EUR)
->and($money->value)->toBe($value);
});
it('accepts a zero value', function (): void {
// WHEN
$money = new Money(Currency::EUR, 0);
// THEN
expect($money->value)->toBe(0);
});
it('rejects a negative value', function (): void {
// WHEN
$action = fn (): Money => new Money(Currency::EUR, -1);
// THEN
expect($action)->toThrow(\DomainException::class, 'Money value cannot be negative.');
});
it('implements equals correctly', function (): void {
// GIVEN
$money1 = new Money(Currency::EUR, 300);
$money2 = new Money(Currency::EUR, 300);
$money3 = new Money(Currency::EUR, 500);
// THEN
expect($money1->equals($money2))->toBeTrue()
->and($money1->equals($money3))->toBeFalse()
->and($money1->equals(null))->toBeFalse();
});
it('converts to string', function (): void {
// GIVEN
$money = new Money(Currency::EUR, 300);
// THEN
expect((string) $money)->toBe('300 EUR');
});
});