Skip to content

Commit ff6dc15

Browse files
committed
Add tests for validation and eloquent casting
1 parent 2764e83 commit ff6dc15

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Spatie\LaravelData\Tests\Fakes\Models;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\AbstractPropertyMorphableData;
7+
use Spatie\LaravelData\Tests\Fakes\SimpleDataCollection;
8+
9+
class DummyModelWithPropertyMorphableCast extends Model
10+
{
11+
protected $casts = [
12+
'data' => AbstractPropertyMorphableData::class,
13+
'data_collection' => SimpleDataCollection::class.':'.AbstractPropertyMorphableData::class,
14+
];
15+
16+
protected $table = 'dummy_model_with_casts';
17+
18+
public $timestamps = false;
19+
}

tests/Support/EloquentCasts/DataCollectionEloquentCastTest.php

+29
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithCasts;
1212
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithCustomCollectionCasts;
1313
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithDefaultCasts;
14+
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithPropertyMorphableCast;
15+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\PropertyMorphableDataA;
16+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\PropertyMorphableDataB;
1417
use Spatie\LaravelData\Tests\Fakes\SimpleData;
1518
use Spatie\LaravelData\Tests\Fakes\SimpleDataCollection;
1619

@@ -170,3 +173,29 @@
170173
expect($model->abstract_collection[0])->toBeInstanceOf(AbstractDataA::class);
171174
expect($model->abstract_collection[1])->toBeInstanceOf(AbstractDataB::class);
172175
});
176+
177+
it('can load and save an abstract property-morphable data collection', function () {
178+
$abstractA = new PropertyMorphableDataA('foo');
179+
$abstractB = new PropertyMorphableDataB('bar');
180+
181+
$modelId = DummyModelWithPropertyMorphableCast::create([
182+
'data_collection' => [$abstractA, $abstractB],
183+
])->id;
184+
185+
assertDatabaseHas(DummyModelWithPropertyMorphableCast::class, [
186+
'data_collection' => json_encode([
187+
['a' => 'foo', 'variant' => 'a'],
188+
['b' => 'bar', 'variant' => 'b'],
189+
], JSON_PRETTY_PRINT),
190+
]);
191+
192+
$model = DummyModelWithPropertyMorphableCast::find($modelId);
193+
194+
expect($model->data_collection[0])
195+
->toBeInstanceOf(PropertyMorphableDataA::class)
196+
->a->toBe('foo');
197+
198+
expect($model->data_collection[1])
199+
->toBeInstanceOf(PropertyMorphableDataB::class)
200+
->b->toBe('bar');
201+
});

tests/Support/EloquentCasts/DataEloquentCastTest.php

+20
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithCasts;
1313
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithDefaultCasts;
1414
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithEncryptedCasts;
15+
use Spatie\LaravelData\Tests\Fakes\Models\DummyModelWithPropertyMorphableCast;
16+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\PropertyMorphableDataA;
1517
use Spatie\LaravelData\Tests\Fakes\SimpleData;
1618
use Spatie\LaravelData\Tests\Fakes\SimpleDataWithDefaultValue;
1719

@@ -183,3 +185,21 @@
183185

184186
expect($isEncrypted)->toBeTrue();
185187
});
188+
189+
it('can load and save an abstract property-morphable data object', function () {
190+
$abstractA = new PropertyMorphableDataA('foo');
191+
192+
$modelId = DummyModelWithPropertyMorphableCast::create([
193+
'data' => $abstractA,
194+
])->id;
195+
196+
assertDatabaseHas(DummyModelWithPropertyMorphableCast::class, [
197+
'data' => json_encode(['a' => 'foo', 'variant' => 'a']),
198+
]);
199+
200+
$model = DummyModelWithPropertyMorphableCast::find($modelId);
201+
202+
expect($model->data)
203+
->toBeInstanceOf(PropertyMorphableDataA::class)
204+
->a->toBe('foo');
205+
});

tests/ValidationTest.php

+55
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@
5555
use Spatie\LaravelData\Tests\Fakes\MultiData;
5656
use Spatie\LaravelData\Tests\Fakes\NestedData;
5757
use Spatie\LaravelData\Tests\Fakes\NestedNullableData;
58+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\AbstractPropertyMorphableData;
59+
use Spatie\LaravelData\Tests\Fakes\PropertyMorphableData\NestedPropertyMorphableData;
5860
use Spatie\LaravelData\Tests\Fakes\SimpleData;
5961
use Spatie\LaravelData\Tests\Fakes\SimpleDataWithExplicitValidationRuleAttributeData;
6062
use Spatie\LaravelData\Tests\Fakes\SimpleDataWithOverwrittenRules;
@@ -2528,3 +2530,56 @@ public function __construct(
25282530
'otherProperty' => 'Hello World',
25292531
]);
25302532
});
2533+
2534+
it('can validate property-morphable data', function () {
2535+
DataValidationAsserter::for(AbstractPropertyMorphableData::class)
2536+
->assertErrors([], [
2537+
'variant' => ['The variant field is required.'],
2538+
])
2539+
->assertErrors([
2540+
'variant' => 'c',
2541+
], [
2542+
'variant' => ['The selected variant is invalid.'],
2543+
])
2544+
->assertErrors([
2545+
'variant' => 'a',
2546+
], [
2547+
'a' => ['The a field is required.'],
2548+
])
2549+
->assertErrors([
2550+
'variant' => 'b',
2551+
], [
2552+
'b' => ['The b field is required.'],
2553+
])
2554+
->assertOk([
2555+
'variant' => 'a',
2556+
'a' => 'foo',
2557+
])
2558+
->assertOk([
2559+
'variant' => 'b',
2560+
'b' => 'foo',
2561+
]);
2562+
});
2563+
2564+
it('can validate nested property-morphable data', function () {
2565+
DataValidationAsserter::for(NestedPropertyMorphableData::class)
2566+
->assertErrors([
2567+
'nestedCollection' => [[]],
2568+
], [
2569+
'nestedCollection.0.variant' => ['The nested collection.0.variant field is required.'],
2570+
])
2571+
->assertErrors([
2572+
'nestedCollection' => [['variant' => 'c']],
2573+
], [
2574+
'nestedCollection.0.variant' => ['The selected nested collection.0.variant is invalid.'],
2575+
])
2576+
->assertErrors([
2577+
'nestedCollection' => [['variant' => 'a'], ['variant' => 'b']],
2578+
], [
2579+
'nestedCollection.0.a' => ['The nested collection.0.a field is required.'],
2580+
'nestedCollection.1.b' => ['The nested collection.1.b field is required.'],
2581+
])
2582+
->assertOk([
2583+
'nestedCollection' => [['variant' => 'a', 'a' => 'foo'], ['variant' => 'b', 'b' => 'bar']],
2584+
]);
2585+
});

0 commit comments

Comments
 (0)