Skip to content

Commit 92d4736

Browse files
sebdesignGummibeer
authored andcommitted
add Laravel Model and Collection assertions
1 parent 4a01cf7 commit 92d4736

File tree

5 files changed

+150
-0
lines changed

5 files changed

+150
-0
lines changed

src/Laravel/CollectionAssertions.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Astrotomic\PhpunitAssertions\Laravel;
4+
5+
use Illuminate\Support\Enumerable;
6+
use PHPUnit\Framework\Assert as PHPUnit;
7+
8+
trait CollectionAssertions
9+
{
10+
/**
11+
* @param $expected
12+
* @param Enumerable $actual
13+
*/
14+
public static function assertContains($expected, $actual): void
15+
{
16+
PHPUnit::assertInstanceOf(Enumerable::class, $actual);
17+
PHPUnit::assertTrue($actual->contains($expected));
18+
}
19+
}

src/Laravel/ModelAssertions.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Astrotomic\PhpunitAssertions\Laravel;
4+
5+
use Illuminate\Database\Eloquent\Model;
6+
use Illuminate\Support\Facades\DB;
7+
use Illuminate\Testing\Constraints\HasInDatabase;
8+
use PHPUnit\Framework\Assert as PHPUnit;
9+
10+
trait ModelAssertions
11+
{
12+
public static function assertExists($table, array $data = [], ?string $connection = null): void
13+
{
14+
if ($table instanceof Model) {
15+
$model = $table;
16+
17+
$table = $model->getTable();
18+
$connection = $model->getConnectionName();
19+
$data = [
20+
$model->getKeyName() => $model->getKey(),
21+
];
22+
}
23+
24+
PHPUnit::assertThat(
25+
$table,
26+
new HasInDatabase(DB::connection($connection), $data)
27+
);
28+
}
29+
30+
public static function assertSame(Model $expected, $actual): void
31+
{
32+
PHPUnit::assertInstanceOf(get_class($expected), $actual);
33+
PHPUnit::assertSame($expected->exists, $actual->exists);
34+
PHPUnit::assertTrue($expected->is($actual));
35+
}
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Astrotomic\PhpunitAssertions\Tests\Laravel;
4+
5+
use Astrotomic\PhpunitAssertions\Laravel\CollectionAssertions;
6+
use Illuminate\Support\Collection;
7+
8+
final class CollectionAssertionsTest extends TestCase
9+
{
10+
/**
11+
* @test
12+
* @dataProvider hundredTimes
13+
*/
14+
public function it_can_validate_contains(): void
15+
{
16+
$value = static::randomString(8);
17+
18+
$collection = new Collection([
19+
$value,
20+
self::randomString(),
21+
self::randomString(),
22+
self::randomString(),
23+
self::randomString(),
24+
]);
25+
26+
CollectionAssertions::assertContains($value, $collection);
27+
}
28+
}

tests/Laravel/ModelAssertionsTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?php
2+
3+
namespace Astrotomic\PhpunitAssertions\Tests\Laravel;
4+
5+
use Astrotomic\PhpunitAssertions\Laravel\CollectionAssertions;
6+
use Astrotomic\PhpunitAssertions\Laravel\ModelAssertions;
7+
use Illuminate\Database\Eloquent\Model;
8+
use Illuminate\Database\Schema\Blueprint;
9+
use Illuminate\Support\Collection;
10+
use Illuminate\Support\Facades\Schema;
11+
12+
final class ModelAssertionsTest extends TestCase
13+
{
14+
protected function setUp(): void
15+
{
16+
parent::setUp();
17+
18+
Schema::create('posts', static function (Blueprint $table): void {
19+
$table->increments('id');
20+
$table->string('title');
21+
$table->timestamps();
22+
});
23+
}
24+
25+
/**
26+
* @test
27+
* @dataProvider hundredTimes
28+
*/
29+
public function it_can_validate_exists(): void
30+
{
31+
$model = new class extends Model {
32+
protected $table = 'posts';
33+
protected $guarded = [];
34+
};
35+
36+
$model->title = self::randomString();
37+
$model->save();
38+
39+
ModelAssertions::assertExists($model);
40+
}
41+
42+
/**
43+
* @test
44+
* @dataProvider hundredTimes
45+
*/
46+
public function it_can_validate_same(): void
47+
{
48+
$model = new class extends Model {
49+
protected $table = 'posts';
50+
protected $guarded = [];
51+
};
52+
53+
$model->title = self::randomString();
54+
$model->save();
55+
56+
ModelAssertions::assertSame($model,$model->query()->first());
57+
}
58+
}

tests/Laravel/TestCase.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,18 @@
44

55
use Astrotomic\PhpunitAssertions\Tests\Utils\Randomize;
66
use Astrotomic\PhpunitAssertions\Tests\Utils\Repeatable;
7+
use Illuminate\Config\Repository as ConficContract;
78
use Orchestra\Testbench\TestCase as OrchestraTestCase;
89

910
abstract class TestCase extends OrchestraTestCase
1011
{
1112
use Randomize, Repeatable;
13+
14+
protected function setUp(): void
15+
{
16+
parent::setUp();
17+
18+
$this->app->make(ConficContract::class)->set('database.default', 'testing');
19+
$this->app->make(ConficContract::class)->set('database.connections.testing.database', ':memory:');
20+
}
1221
}

0 commit comments

Comments
 (0)