Skip to content

Commit

Permalink
fix(Database): Fix PHPStan with scopes parameter
Browse files Browse the repository at this point in the history
  • Loading branch information
pionl committed May 11, 2023
1 parent da2f8f3 commit 2e9e6fe
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/Database/Queries/AbstractEloquentQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ protected function forceDelete(array $scopes = []): int
}

/**
* @param Scope[] $scopes
* @param array<int, Scope|null> $scopes
*
* @return Builder<TModel>
*/
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Queries/AbstractQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ abstract class AbstractQuery
/**
* @template TBuilderModel of \Illuminate\Database\Eloquent\Model
* @param Builder<TBuilderModel> $builder
* @param Scope[]|null[] $scopes
* @param array<int, Scope|null> $scopes
*
* @return Builder<TBuilderModel>
*/
Expand Down
23 changes: 23 additions & 0 deletions tests/Feature/Database/Models/Scopes/TestScope.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Database\Models\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use LaraStrict\Database\Scopes\AbstractScope;
use Tests\LaraStrict\Feature\Database\Models\Test;

class TestScope extends AbstractScope
{
public function __construct(
private readonly string $value = '',
) {
}

public function apply(Builder $builder, Model $model): void
{
$builder->where(Test::AttributeTest, $this->value);
}
}
61 changes: 61 additions & 0 deletions tests/Feature/Database/Queries/AbstractEloquentQueryTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Database\Queries;

use Closure;
use Illuminate\Database\Eloquent\Scope;
use Tests\LaraStrict\Feature\Database\Models\Scopes\TestScope;
use Tests\LaraStrict\Feature\TestCase;

class AbstractEloquentQueryTest extends TestCase
{
/**
* @return array<string|int, array{0: Closure(static):void}>
*/
public function dataScopes(): array
{
return [
'empty' => [
static fn (self $self) => $self->assertScopes(
'select * from "tests" where "tests"."deleted_at" is null',
[]
),
],
'null' => [
static fn (self $self) => $self->assertScopes(
'select * from "tests" where "tests"."deleted_at" is null',
[null]
),
],
'null and test scope' => [
static fn (self $self) => $self->assertScopes(
'select * from "tests" where "test" = ? and "tests"."deleted_at" is null',
[new TestScope(), null]
),
],
];
}

/**
* @param Closure(static):void $assert
*
* @dataProvider dataScopes
*/
public function testScopes(Closure $assert): void
{
$assert($this);
}

/**
* @param array<int, Scope|null> $scopes
*/
public function assertScopes(string $expectedSql, array $scopes): void
{
$query = app(TestSqlQuery::class);
assert($query instanceof TestSqlQuery);

$this->assertEquals(expected: $expectedSql, actual: $query->execute($scopes));
}
}
21 changes: 21 additions & 0 deletions tests/Feature/Database/Queries/AbstractTestQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Database\Queries;

use LaraStrict\Database\Queries\AbstractEloquentQuery;
use Tests\LaraStrict\Feature\Database\Models\Test;

/**
* This is not a real example of a query (scopes should not be a parameter in execute).
*
* @extends AbstractEloquentQuery<Test>
*/
abstract class AbstractTestQuery extends AbstractEloquentQuery
{
protected function getModelClass(): string
{
return Test::class;
}
}
10 changes: 1 addition & 9 deletions tests/Feature/Database/Queries/TestScopeQuery.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,13 @@
namespace Tests\LaraStrict\Feature\Database\Queries;

use Illuminate\Database\Eloquent\Collection;
use LaraStrict\Database\Queries\AbstractEloquentQuery;
use LaraStrict\Database\Scopes\AbstractScope;
use Tests\LaraStrict\Feature\Database\Models\Test;

/**
* This is not a real example of a query (scopes should not be a parameter in execute).
*
* @extends AbstractEloquentQuery<Test>
*/
class TestScopeQuery extends AbstractEloquentQuery
class TestScopeQuery extends AbstractTestQuery
{
/**
* @param array<AbstractScope> $scopes
Expand All @@ -24,9 +21,4 @@ public function execute(array $scopes): Collection
{
return $this->getAll($scopes);
}

protected function getModelClass(): string
{
return Test::class;
}
}
19 changes: 19 additions & 0 deletions tests/Feature/Database/Queries/TestSqlQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace Tests\LaraStrict\Feature\Database\Queries;

use Illuminate\Database\Eloquent\Scope;

class TestSqlQuery extends AbstractTestQuery
{
/**
* @param array<int, Scope|null> $scopes
*/
public function execute(array $scopes): string
{
return $this->getQuery($scopes)
->toSql();
}
}

0 comments on commit 2e9e6fe

Please sign in to comment.