ValidatorTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace Illuminate\Tests\Integration\Validation;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Schema\Blueprint;
  5. use Illuminate\Support\Facades\Schema;
  6. use Illuminate\Support\Str;
  7. use Illuminate\Tests\Integration\Database\DatabaseTestCase;
  8. use Illuminate\Translation\ArrayLoader;
  9. use Illuminate\Translation\Translator;
  10. use Illuminate\Validation\DatabasePresenceVerifier;
  11. use Illuminate\Validation\Validator;
  12. class ValidatorTest extends DatabaseTestCase
  13. {
  14. protected function setUp(): void
  15. {
  16. parent::setUp();
  17. Schema::create('users', function (Blueprint $table) {
  18. $table->increments('id');
  19. $table->string('uuid');
  20. $table->string('first_name');
  21. });
  22. User::create(['uuid' => (string) Str::uuid(), 'first_name' => 'John']);
  23. User::create(['uuid' => (string) Str::uuid(), 'first_name' => 'Jim']);
  24. }
  25. public function testExists()
  26. {
  27. $validator = $this->getValidator(['first_name' => ['John', 'Taylor']], ['first_name' => 'exists:users']);
  28. $this->assertFalse($validator->passes());
  29. }
  30. public function testUnique()
  31. {
  32. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.User::class]);
  33. $this->assertFalse($validator->passes());
  34. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.User::class.',first_name,1']);
  35. $this->assertTrue($validator->passes());
  36. $validator = $this->getValidator(['first_name' => 'Taylor'], ['first_name' => 'unique:'.User::class]);
  37. $this->assertTrue($validator->passes());
  38. }
  39. public function testUniqueWithCustomModelKey()
  40. {
  41. $_SERVER['CUSTOM_MODEL_KEY_NAME'] = 'uuid';
  42. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.UserWithUuid::class]);
  43. $this->assertFalse($validator->passes());
  44. $user = UserWithUuid::where('first_name', 'John')->first();
  45. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:'.UserWithUuid::class.',first_name,'.$user->uuid]);
  46. $this->assertTrue($validator->passes());
  47. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:users,first_name,'.$user->uuid.',uuid']);
  48. $this->assertTrue($validator->passes());
  49. $validator = $this->getValidator(['first_name' => 'John'], ['first_name' => 'unique:users,first_name,'.$user->uuid.',id']);
  50. $this->assertFalse($validator->passes());
  51. $validator = $this->getValidator(['first_name' => 'Taylor'], ['first_name' => 'unique:'.UserWithUuid::class]);
  52. $this->assertTrue($validator->passes());
  53. unset($_SERVER['CUSTOM_MODEL_KEY_NAME']);
  54. }
  55. public function testImplicitAttributeFormatting()
  56. {
  57. $translator = new Translator(new ArrayLoader, 'en');
  58. $translator->addLines(['validation.string' => ':attribute must be a string!'], 'en');
  59. $validator = new Validator($translator, [['name' => 1]], ['*.name' => 'string']);
  60. $validator->setImplicitAttributesFormatter(function ($attribute) {
  61. [$line, $attribute] = explode('.', $attribute);
  62. return sprintf('%s at line %d', $attribute, $line + 1);
  63. });
  64. $validator->passes();
  65. $this->assertSame('name at line 1 must be a string!', $validator->getMessageBag()->all()[0]);
  66. }
  67. protected function getValidator(array $data, array $rules)
  68. {
  69. $translator = new Translator(new ArrayLoader, 'en');
  70. $validator = new Validator($translator, $data, $rules);
  71. $validator->setPresenceVerifier(new DatabasePresenceVerifier($this->app['db']));
  72. return $validator;
  73. }
  74. }
  75. class User extends Model
  76. {
  77. public $timestamps = false;
  78. protected $guarded = [];
  79. }
  80. class UserWithUuid extends Model
  81. {
  82. protected $table = 'users';
  83. public $timestamps = false;
  84. protected $guarded = [];
  85. protected $keyType = 'string';
  86. public $incrementing = false;
  87. public function getKeyName()
  88. {
  89. return 'uuid';
  90. }
  91. }