123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- <?php
- namespace Illuminate\Tests\Validation;
- use Illuminate\Database\Capsule\Manager as DB;
- use Illuminate\Database\Eloquent\Model as Eloquent;
- use Illuminate\Translation\ArrayLoader;
- use Illuminate\Translation\Translator;
- use Illuminate\Validation\DatabasePresenceVerifier;
- use Illuminate\Validation\Rules\Exists;
- use Illuminate\Validation\Validator;
- use PHPUnit\Framework\TestCase;
- class ValidationExistsRuleTest extends TestCase
- {
- /**
- * Setup the database schema.
- *
- * @return void
- */
- protected function setUp(): void
- {
- $db = new DB;
- $db->addConnection([
- 'driver' => 'sqlite',
- 'database' => ':memory:',
- ]);
- $db->bootEloquent();
- $db->setAsGlobal();
- $this->createSchema();
- }
- public function testItCorrectlyFormatsAStringVersionOfTheRule()
- {
- $rule = new Exists('table');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:table,NULL,foo,"bar"', (string) $rule);
- $rule = new Exists(User::class);
- $rule->where('foo', 'bar');
- $this->assertSame('exists:users,NULL,foo,"bar"', (string) $rule);
- $rule = new Exists(UserWithPrefixedTable::class);
- $rule->where('foo', 'bar');
- $this->assertSame('exists:'.UserWithPrefixedTable::class.',NULL,foo,"bar"', (string) $rule);
- $rule = new Exists('table', 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:table,column,foo,"bar"', (string) $rule);
- $rule = new Exists(User::class, 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:users,column,foo,"bar"', (string) $rule);
- $rule = new Exists(UserWithConnection::class, 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:mysql.users,column,foo,"bar"', (string) $rule);
- $rule = new Exists('Illuminate\Tests\Validation\User', 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:users,column,foo,"bar"', (string) $rule);
- $rule = new Exists(NoTableNameModel::class, 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:no_table_name_models,column,foo,"bar"', (string) $rule);
- $rule = new Exists(ClassWithRequiredConstructorParameters::class, 'column');
- $rule->where('foo', 'bar');
- $this->assertSame('exists:'.ClassWithRequiredConstructorParameters::class.',column,foo,"bar"', (string) $rule);
- }
- public function testItChoosesValidRecordsUsingWhereInRule()
- {
- $rule = new Exists('users', 'id');
- $rule->whereIn('type', ['foo', 'bar']);
- User::create(['id' => '1', 'type' => 'foo']);
- User::create(['id' => '2', 'type' => 'bar']);
- User::create(['id' => '3', 'type' => 'baz']);
- User::create(['id' => '4', 'type' => 'other']);
- $trans = $this->getIlluminateArrayTranslator();
- $v = new Validator($trans, [], ['id' => $rule]);
- $v->setPresenceVerifier(new DatabasePresenceVerifier(Eloquent::getConnectionResolver()));
- $v->setData(['id' => 1]);
- $this->assertTrue($v->passes());
- $v->setData(['id' => 2]);
- $this->assertTrue($v->passes());
- $v->setData(['id' => 3]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 4]);
- $this->assertFalse($v->passes());
- }
- public function testItChoosesValidRecordsUsingWhereNotInRule()
- {
- $rule = new Exists('users', 'id');
- $rule->whereNotIn('type', ['foo', 'bar']);
- User::create(['id' => '1', 'type' => 'foo']);
- User::create(['id' => '2', 'type' => 'bar']);
- User::create(['id' => '3', 'type' => 'baz']);
- User::create(['id' => '4', 'type' => 'other']);
- $trans = $this->getIlluminateArrayTranslator();
- $v = new Validator($trans, [], ['id' => $rule]);
- $v->setPresenceVerifier(new DatabasePresenceVerifier(Eloquent::getConnectionResolver()));
- $v->setData(['id' => 1]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 2]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 3]);
- $this->assertTrue($v->passes());
- $v->setData(['id' => 4]);
- $this->assertTrue($v->passes());
- }
- public function testItChoosesValidRecordsUsingConditionalModifiers()
- {
- $rule = new Exists('users', 'id');
- $rule->when(true, function ($rule) {
- $rule->whereNotIn('type', ['foo', 'bar']);
- });
- $rule->unless(true, function ($rule) {
- $rule->whereNotIn('type', ['baz', 'other']);
- });
- User::create(['id' => '1', 'type' => 'foo']);
- User::create(['id' => '2', 'type' => 'bar']);
- User::create(['id' => '3', 'type' => 'baz']);
- User::create(['id' => '4', 'type' => 'other']);
- $trans = $this->getIlluminateArrayTranslator();
- $v = new Validator($trans, [], ['id' => $rule]);
- $v->setPresenceVerifier(new DatabasePresenceVerifier(Eloquent::getConnectionResolver()));
- $v->setData(['id' => 1]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 2]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 3]);
- $this->assertTrue($v->passes());
- $v->setData(['id' => 4]);
- $this->assertTrue($v->passes());
- }
- public function testItChoosesValidRecordsUsingWhereNotInAndWhereNotInRulesTogether()
- {
- $rule = new Exists('users', 'id');
- $rule->whereIn('type', ['foo', 'bar', 'baz'])->whereNotIn('type', ['foo', 'bar']);
- User::create(['id' => '1', 'type' => 'foo']);
- User::create(['id' => '2', 'type' => 'bar']);
- User::create(['id' => '3', 'type' => 'baz']);
- User::create(['id' => '4', 'type' => 'other']);
- $trans = $this->getIlluminateArrayTranslator();
- $v = new Validator($trans, [], ['id' => $rule]);
- $v->setPresenceVerifier(new DatabasePresenceVerifier(Eloquent::getConnectionResolver()));
- $v->setData(['id' => 1]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 2]);
- $this->assertFalse($v->passes());
- $v->setData(['id' => 3]);
- $this->assertTrue($v->passes());
- $v->setData(['id' => 4]);
- $this->assertFalse($v->passes());
- }
- public function testItIgnoresSoftDeletes()
- {
- $rule = new Exists('table');
- $rule->withoutTrashed();
- $this->assertSame('exists:table,NULL,deleted_at,"NULL"', (string) $rule);
- $rule = new Exists('table');
- $rule->withoutTrashed('softdeleted_at');
- $this->assertSame('exists:table,NULL,softdeleted_at,"NULL"', (string) $rule);
- }
- protected function createSchema()
- {
- $this->schema('default')->create('users', function ($table) {
- $table->unsignedInteger('id');
- $table->string('type');
- });
- }
- /**
- * Get a schema builder instance.
- *
- * @return \Illuminate\Database\Schema\Builder
- */
- protected function schema($connection = 'default')
- {
- return $this->connection($connection)->getSchemaBuilder();
- }
- /**
- * Get a database connection instance.
- *
- * @return \Illuminate\Database\Connection
- */
- protected function connection($connection = 'default')
- {
- return $this->getConnectionResolver()->connection($connection);
- }
- /**
- * Get connection resolver.
- *
- * @return \Illuminate\Database\ConnectionResolverInterface
- */
- protected function getConnectionResolver()
- {
- return Eloquent::getConnectionResolver();
- }
- /**
- * Tear down the database schema.
- *
- * @return void
- */
- protected function tearDown(): void
- {
- $this->schema('default')->drop('users');
- }
- public function getIlluminateArrayTranslator()
- {
- return new Translator(
- new ArrayLoader, 'en'
- );
- }
- }
- /**
- * Eloquent Models.
- */
- class User extends Eloquent
- {
- protected $table = 'users';
- protected $guarded = [];
- public $timestamps = false;
- }
- class UserWithPrefixedTable extends Eloquent
- {
- protected $table = 'public.users';
- protected $guarded = [];
- public $timestamps = false;
- }
- class UserWithConnection extends User
- {
- protected $connection = 'mysql';
- }
- class NoTableNameModel extends Eloquent
- {
- protected $guarded = [];
- public $timestamps = false;
- }
- class ClassWithRequiredConstructorParameters
- {
- private $bar;
- private $baz;
- public function __construct($bar, $baz)
- {
- $this->bar = $bar;
- $this->baz = $baz;
- }
- }
|