61 lines
1.5 KiB
PHP
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');
|
|
});
|
|
});
|