ldc-boutique-cnc-sable/tests/Unit/App/Casts/DiscountValueCastTest.php
2026-10-27 09:58:12 +01:00

165 lines
4 KiB
PHP

<?php
declare(strict_types=1);
use App\Casts\DiscountValueCast;
use Domain\Enums\DiscountType;
use Domain\Models\ValueObjects\DiscountValue;
use Illuminate\Database\Eloquent\Model;
use Money\Currency;
use Money\Money;
it('gets a discount value from percentage', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$value = $cast->get(
$model,
'discount',
10,
['type' => DiscountType::PERCENT->value]
);
// THEN
expect($value)->toBeInstanceOf(DiscountValue::class)
->and($value->value())->toBe(10);
});
it('gets a discount value from amount', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$value = $cast->get(
$model,
'discount',
1000,
['type' => DiscountType::AMOUNT->value]
);
// THEN
expect($value)->toBeInstanceOf(DiscountValue::class)
->and($value->value())->toBeInstanceOf(Money::class)
->and($value->value()->getAmount())->toBe('1000');
});
it('gets a discount value from amount string', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$value = $cast->get(
$model,
'discount',
'1000',
['type' => (string) DiscountType::AMOUNT->value]
);
// THEN
expect($value)->toBeInstanceOf(DiscountValue::class)
->and($value->value())->toBeInstanceOf(Money::class)
->and($value->value()->getAmount())->toBe('1000');
});
it('throws exception when type is missing', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$cast->get($model, 'discount', 10, []);
// THEN
})->throws(
\UnexpectedValueException::class,
'The discount type attribute is missing to cast the value.'
);
it('throws exception when type is invalid', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$cast->get($model, 'discount', 10, ['type' => 'invalid']);
// THEN
})->throws(
\UnexpectedValueException::class,
'Unknown discount type raw value: invalid'
);
it('throws exception when value is invalid', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$cast->get(
$model,
'discount',
'invalid',
['type' => DiscountType::PERCENT->value]
);
// THEN
})->throws(
\UnexpectedValueException::class,
'The discount value must be an integer or a numeric string.'
);
it('throws exception when setting null', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$cast->set($model, 'discount', null, []);
// THEN
})->throws(\InvalidArgumentException::class, 'The value cannot be null.');
it('throws exception when setting invalid type', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
// WHEN
$cast->set($model, 'discount', 10, []);
// THEN
})->throws(
\InvalidArgumentException::class,
'The value must be an instance of DiscountValue.'
);
it('sets a discount value percentage', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
$discount = DiscountValue::fromPercentage(10);
// WHEN
$value = $cast->set($model, 'discount', $discount, []);
// THEN
expect($value)->toBe(10);
});
it('sets a discount value amount', function () {
// GIVEN
$cast = new DiscountValueCast();
$model = \Mockery::mock(Model::class);
$currency = resolve(Currency::class);
$discount = DiscountValue::fromAmount(new Money(1000, $currency));
// WHEN
$value = $cast->set($model, 'discount', $discount, []);
// THEN
expect($value)->toBe(1000);
});