1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
<?php
namespace Illuminate\Tests\Database;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\Eloquent\Model;
use PHPUnit\Framework\TestCase;
class DatabaseEloquentLocalScopesTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
tap(new DB)->addConnection([
'driver' => 'sqlite',
'database' => ':memory:',
])->bootEloquent();
}
protected function tearDown(): void
{
parent::tearDown();
Model::unsetConnectionResolver();
}
public function testCanCheckExistenceOfLocalScope()
{
$model = new EloquentLocalScopesTestModel;
$this->assertTrue($model->hasNamedScope('active'));
$this->assertTrue($model->hasNamedScope('type'));
$this->assertFalse($model->hasNamedScope('nonExistentLocalScope'));
}
public function testLocalScopeIsApplied()
{
$model = new EloquentLocalScopesTestModel;
$query = $model->newQuery()->active();
$this->assertSame('select * from "table" where "active" = ?', $query->toSql());
$this->assertEquals([true], $query->getBindings());
}
public function testDynamicLocalScopeIsApplied()
{
$model = new EloquentLocalScopesTestModel;
$query = $model->newQuery()->type('foo');
$this->assertSame('select * from "table" where "type" = ?', $query->toSql());
$this->assertEquals(['foo'], $query->getBindings());
}
public function testLocalScopesCanChained()
{
$model = new EloquentLocalScopesTestModel;
$query = $model->newQuery()->active()->type('foo');
$this->assertSame('select * from "table" where "active" = ? and "type" = ?', $query->toSql());
$this->assertEquals([true, 'foo'], $query->getBindings());
}
public function testLocalScopeNestingDoesntDoubleFirstWhereClauseNegation()
{
$model = new EloquentLocalScopesTestModel;
$query = $model
->newQuery()
->whereNot('firstWhere', true)
->orWhere('secondWhere', true)
->active();
$this->assertSame('select * from "table" where (not "firstWhere" = ? or "secondWhere" = ?) and "active" = ?', $query->toSql());
$this->assertEquals([true, true, true], $query->getBindings());
}
public function testLocalScopeNestingGroupsOrNotWhereClause()
{
$model = new EloquentLocalScopesTestModel;
$query = $model
->newQuery()
->where('firstWhere', true)
->orWhereNot('secondWhere', true)
->active();
$this->assertSame('select * from "table" where ("firstWhere" = ? or not "secondWhere" = ?) and "active" = ?', $query->toSql());
$this->assertEquals([true, true, true], $query->getBindings());
}
}
class EloquentLocalScopesTestModel extends Model
{
protected $table = 'table';
public function scopeActive($query)
{
$query->where('active', true);
}
public function scopeType($query, $type)
{
$query->where('type', $type);
}
}
|