get($model, 'price', '1000', []); // THEN expect($money)->toBeInstanceOf(Money::class) ->and($money->getAmount())->toBe('1000') ->and($money->getCurrency()->getCode())->toBe(resolve(Currency::class)->getCode()); }); it('gets a money from int', function () { // GIVEN $cast = new MoneyCast(); $model = \Mockery::mock(Model::class); // WHEN $money = $cast->get($model, 'price', 1000, []); // THEN expect($money)->toBeInstanceOf(Money::class) ->and($money->getAmount())->toBe('1000'); }); it('throws exception when getting invalid money type', function () { // GIVEN $cast = new MoneyCast(); $model = \Mockery::mock(Model::class); // WHEN $cast->get($model, 'price', 'abc', []); // THEN })->throws( \InvalidArgumentException::class, 'The given value is not numeric.' ); it('throws exception when setting invalid money type', function () { // GIVEN $cast = new MoneyCast(); $model = \Mockery::mock(Model::class); // WHEN $cast->set($model, 'price', '1000', []); // THEN })->throws( \InvalidArgumentException::class, 'The given value is not an instance of Money.' ); it('sets a money', function () { // GIVEN $cast = new MoneyCast(); $model = \Mockery::mock(Model::class); $money = new Money(1000, resolve(Currency::class)); // WHEN $value = $cast->set($model, 'price', $money, []); // THEN expect($value)->toBe('1000'); }); it('throws exception when getting float', function () { // GIVEN $cast = new MoneyCast(); $model = \Mockery::mock(Model::class); // WHEN $cast->get($model, 'price', 10.5, []); // THEN })->throws( \InvalidArgumentException::class, 'The given value must be a string or integer.' );