Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions tests/Validation/ValidationUniqueRuleTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,30 @@

namespace Illuminate\Tests\Validation;

use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Translation\ArrayLoader;
use Illuminate\Translation\Translator;
use Illuminate\Validation\DatabasePresenceVerifier;
use Illuminate\Validation\Rules\Unique;
use Illuminate\Validation\Validator;
use PHPUnit\Framework\TestCase;

class ValidationUniqueRuleTest extends TestCase
{
protected function setUp(): void
{
$db = new DB;
$db->addConnection([
'driver' => 'sqlite',
'database' => ':memory:',
]);

$db->bootEloquent();
$this->createSchema();
}

public function testItCorrectlyFormatsAStringVersionOfTheRule()
{
$rule = new Unique('table');
Expand Down Expand Up @@ -129,6 +147,10 @@ public function testItHandlesWhereWithSpecialValues()
$rule->where('foo', null);
$this->assertSame('unique:table,column,NULL,id,foo,"NULL"', (string) $rule);

$rule = new Unique('table', 'column');
$rule->whereNot('foo', 'bar');
$this->assertSame('unique:table,column,NULL,id,foo,"!bar"', (string) $rule);

$rule = new Unique('table', 'column');
$rule->whereNull('foo');
$this->assertSame('unique:table,column,NULL,id,foo,"NULL"', (string) $rule);
Expand All @@ -141,6 +163,58 @@ public function testItHandlesWhereWithSpecialValues()
$rule->where('foo', 0);
$this->assertSame('unique:table,column,NULL,id,foo,"0"', (string) $rule);
}

public function testItValidatesUniqueRuleWithWhereInAndWhereNotIn()
{
EloquentModelStub::create(['id_column' => 1, 'type' => 'admin']);
EloquentModelStub::create(['id_column' => 2, 'type' => 'moderator']);
EloquentModelStub::create(['id_column' => 3, 'type' => 'editor']);
EloquentModelStub::create(['id_column' => 4, 'type' => 'user']);

$rule = new Unique(table: 'table', column: 'id_column');
$rule->whereIn(column: 'type', values: ['admin', 'moderator', 'editor'])
->whereNotIn(column: 'type', values: ['editor']);

$trans = $this->getIlluminateArrayTranslator();
$v = new Validator($trans, [], ['id_column' => $rule]);
$v->setPresenceVerifier(new DatabasePresenceVerifier(Model::getConnectionResolver()));

$v->setData(['id_column' => 1]);
$this->assertFalse($v->passes());

$v->setData(['id_column' => 2]);
$this->assertFalse($v->passes());

$v->setData(['id_column' => 3]);
$this->assertTrue($v->passes());

$v->setData(['id_column' => 4]);
$this->assertTrue($v->passes());

$v->setData(['id_column' => 5]);
$this->assertTrue($v->passes());
}

protected function createSchema(): void
{
$this->connection()->getSchemaBuilder()->create('table', function ($table) {
$table->unsignedInteger('id_column');
$table->string('type');
$table->timestamps();
});
}

protected function connection(): ConnectionInterface
{
return Model::getConnectionResolver()->connection();
}

protected function getIlluminateArrayTranslator(): Translator
{
return new Translator(
new ArrayLoader, locale: 'en'
);
}
}

class EloquentModelStub extends Model
Expand Down
Loading