Skip to content

Commit 4d96c3f

Browse files
committed
add assertRelationship assertion
1 parent 6d902ef commit 4d96c3f

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ This will prevent any method name conflicts with core, your custom or other trai
135135
```php
136136
\Astrotomic\PhpunitAssertions\Laravel\ModelAssertions::assertExists($model);
137137
\Astrotomic\PhpunitAssertions\Laravel\ModelAssertions::assertSame($model, \App\Models\User::first());
138+
\Astrotomic\PhpunitAssertions\Laravel\ModelAssertions::assertRelated($post, $comment, 'comments');
139+
\Astrotomic\PhpunitAssertions\Laravel\ModelAssertions::assertRelationship($post, \App\Models\Comment::class, 'comments', \Illuminate\Database\Eloquent\Relations\HasMany::class);
138140
```
139141

140142
### Blade

src/Laravel/ModelAssertions.php

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010

1111
trait ModelAssertions
1212
{
13+
/**
14+
* @param string|\Illuminate\Database\Eloquent\Model $table
15+
* @param array $data
16+
* @param string|null $connection
17+
*/
1318
public static function assertExists($table, array $data = [], ?string $connection = null): void
1419
{
1520
if ($table instanceof Model) {
@@ -28,14 +33,23 @@ public static function assertExists($table, array $data = [], ?string $connectio
2833
);
2934
}
3035

36+
/**
37+
* @param \Illuminate\Database\Eloquent\Model $expected
38+
* @param \Illuminate\Database\Eloquent\Model|mixed $actual
39+
*/
3140
public static function assertSame(Model $expected, $actual): void
3241
{
3342
PHPUnit::assertInstanceOf(get_class($expected), $actual);
3443
PHPUnit::assertSame($expected->exists, $actual->exists);
3544
PHPUnit::assertTrue($expected->is($actual));
3645
}
3746

38-
public static function assertRelated(Model $model, $actual, string $relation)
47+
/**
48+
* @param \Illuminate\Database\Eloquent\Model $model
49+
* @param string $relation
50+
* @param \Illuminate\Database\Eloquent\Model|mixed $actual
51+
*/
52+
public static function assertRelated(Model $model, string $relation, $actual)
3953
{
4054
PHPUnit::assertInstanceOf(Model::class, $actual);
4155
PHPUnit::assertTrue(method_exists($model, $relation));
@@ -44,4 +58,30 @@ public static function assertRelated(Model $model, $actual, string $relation)
4458
$related = $model->$relation()->whereKey($actual->getKey())->first();
4559
self::assertSame($actual, $related);
4660
}
61+
62+
/**
63+
* @param \Illuminate\Database\Eloquent\Model $model
64+
* @param string $relation
65+
* @param string|\Illuminate\Database\Eloquent\Model|mixed $actual
66+
* @param string|null $type
67+
*/
68+
public static function assertRelationship(Model $model, string $relation, $actual, ?string $type = null)
69+
{
70+
PHPUnit::assertTrue(method_exists($model, $relation));
71+
PHPUnit::assertInstanceOf(Relation::class, $model->$relation());
72+
73+
if($type) {
74+
PHPUnit::assertInstanceOf($type, $model->$relation());
75+
}
76+
77+
$related = $model->$relation()->getRelated();
78+
PHPUnit::assertInstanceOf(Model::class, $related);
79+
80+
if(is_string($actual)) {
81+
PHPUnit::assertInstanceOf($actual, $related);
82+
} else {
83+
PHPUnit::assertInstanceOf(get_class($actual), $related);
84+
self::assertRelated($model, $relation, $actual);
85+
}
86+
}
4787
}

tests/Laravel/ModelAssertionsTest.php

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Astrotomic\PhpunitAssertions\Laravel\ModelAssertions;
66
use Astrotomic\PhpunitAssertions\Tests\Laravel\Models\Comment;
77
use Astrotomic\PhpunitAssertions\Tests\Laravel\Models\Post;
8+
use Illuminate\Database\Eloquent\Relations\BelongsTo;
9+
use Illuminate\Database\Eloquent\Relations\HasMany;
810

911
final class ModelAssertionsTest extends TestCase
1012
{
@@ -57,7 +59,31 @@ public function it_can_validate_related(): void
5759
'post_id' => $post->getKey(),
5860
]);
5961

60-
ModelAssertions::assertRelated($post, $comment, 'comments');
61-
ModelAssertions::assertRelated($comment, $post, 'post');
62+
ModelAssertions::assertRelated($post, 'comments', $comment);
63+
ModelAssertions::assertRelated($comment, 'post', $post);
64+
}
65+
66+
/**
67+
* @test
68+
* @dataProvider hundredTimes
69+
*/
70+
public function it_can_validate_relationship(): void
71+
{
72+
$post = Post::create([
73+
'title' => self::randomString(),
74+
]);
75+
76+
$comment = Comment::create([
77+
'message' => self::randomString(),
78+
'post_id' => $post->getKey(),
79+
]);
80+
81+
ModelAssertions::assertRelationship($post, 'comments', Comment::class);
82+
ModelAssertions::assertRelationship($post, 'comments', Comment::class, HasMany::class);
83+
ModelAssertions::assertRelationship($post, 'comments', $comment, HasMany::class);
84+
85+
ModelAssertions::assertRelationship($comment, 'post', Post::class);
86+
ModelAssertions::assertRelationship($comment, 'post', Post::class, BelongsTo::class);
87+
ModelAssertions::assertRelationship($comment, 'post', $post, BelongsTo::class);
6288
}
6389
}

0 commit comments

Comments
 (0)