ValidationUniqueRuleTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. <?php
  2. namespace Illuminate\Tests\Validation;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Validation\Rules\Unique;
  5. use PHPUnit\Framework\TestCase;
  6. class ValidationUniqueRuleTest extends TestCase
  7. {
  8. public function testItCorrectlyFormatsAStringVersionOfTheRule()
  9. {
  10. $rule = new Unique('table');
  11. $rule->where('foo', 'bar');
  12. $this->assertSame('unique:table,NULL,NULL,id,foo,"bar"', (string) $rule);
  13. $rule = new Unique(EloquentModelStub::class);
  14. $rule->where('foo', 'bar');
  15. $this->assertSame('unique:table,NULL,NULL,id,foo,"bar"', (string) $rule);
  16. $rule = new Unique(NoTableName::class);
  17. $rule->where('foo', 'bar');
  18. $this->assertSame('unique:no_table_names,NULL,NULL,id,foo,"bar"', (string) $rule);
  19. $rule = new Unique('Illuminate\Tests\Validation\NoTableName');
  20. $rule->where('foo', 'bar');
  21. $this->assertSame('unique:no_table_names,NULL,NULL,id,foo,"bar"', (string) $rule);
  22. $rule = new Unique(ClassWithNonEmptyConstructor::class);
  23. $rule->where('foo', 'bar');
  24. $this->assertSame('unique:'.ClassWithNonEmptyConstructor::class.',NULL,NULL,id,foo,"bar"', (string) $rule);
  25. $rule = new Unique('table', 'column');
  26. $rule->ignore('Taylor, Otwell', 'id_column');
  27. $rule->where('foo', 'bar');
  28. $this->assertSame('unique:table,column,"Taylor, Otwell",id_column,foo,"bar"', (string) $rule);
  29. $rule = new Unique(PrefixedTableEloquentModelStub::class);
  30. $this->assertSame('unique:'.PrefixedTableEloquentModelStub::class.',NULL,NULL,id', (string) $rule);
  31. $rule = new Unique(EloquentModelStub::class, 'column');
  32. $rule->ignore('Taylor, Otwell', 'id_column');
  33. $rule->where('foo', 'bar');
  34. $this->assertSame('unique:table,column,"Taylor, Otwell",id_column,foo,"bar"', (string) $rule);
  35. $rule = new Unique(EloquentModelStub::class, 'column');
  36. $rule->where('foo', 'bar');
  37. $rule->when(true, function ($rule) {
  38. $rule->ignore('Taylor, Otwell', 'id_column');
  39. });
  40. $rule->unless(true, function ($rule) {
  41. $rule->ignore('Chris', 'id_column');
  42. });
  43. $this->assertSame('unique:table,column,"Taylor, Otwell",id_column,foo,"bar"', (string) $rule);
  44. $rule = new Unique('table', 'column');
  45. $rule->ignore('Taylor, Otwell"\'..-"', 'id_column');
  46. $rule->where('foo', 'bar');
  47. $this->assertSame('unique:table,column,"Taylor, Otwell\"\\\'..-\"",id_column,foo,"bar"', (string) $rule);
  48. $this->assertSame('Taylor, Otwell"\'..-"', stripslashes(str_getcsv('table,column,"Taylor, Otwell\"\\\'..-\"",id_column,foo,"bar"')[2]));
  49. $this->assertSame('id_column', stripslashes(str_getcsv('table,column,"Taylor, Otwell\"\\\'..-\"",id_column,foo,"bar"')[3]));
  50. $rule = new Unique('table', 'column');
  51. $rule->ignore(null, 'id_column');
  52. $rule->where('foo', 'bar');
  53. $this->assertSame('unique:table,column,NULL,id_column,foo,"bar"', (string) $rule);
  54. $model = new EloquentModelStub(['id_column' => 1]);
  55. $rule = new Unique('table', 'column');
  56. $rule->ignore($model);
  57. $rule->where('foo', 'bar');
  58. $this->assertSame('unique:table,column,"1",id_column,foo,"bar"', (string) $rule);
  59. $rule = new Unique('table', 'column');
  60. $rule->ignore($model, 'id_column');
  61. $rule->where('foo', 'bar');
  62. $this->assertSame('unique:table,column,"1",id_column,foo,"bar"', (string) $rule);
  63. $rule = new Unique('table');
  64. $rule->where('foo', '"bar"');
  65. $this->assertSame('unique:table,NULL,NULL,id,foo,"""bar"""', (string) $rule);
  66. }
  67. public function testItIgnoresSoftDeletes()
  68. {
  69. $rule = new Unique('table');
  70. $rule->withoutTrashed();
  71. $this->assertSame('unique:table,NULL,NULL,id,deleted_at,"NULL"', (string) $rule);
  72. $rule = new Unique('table');
  73. $rule->withoutTrashed('softdeleted_at');
  74. $this->assertSame('unique:table,NULL,NULL,id,softdeleted_at,"NULL"', (string) $rule);
  75. }
  76. }
  77. class EloquentModelStub extends Model
  78. {
  79. protected $table = 'table';
  80. protected $primaryKey = 'id_column';
  81. protected $guarded = [];
  82. }
  83. class PrefixedTableEloquentModelStub extends Model
  84. {
  85. protected $table = 'public.table';
  86. protected $primaryKey = 'id_column';
  87. protected $guarded = [];
  88. }
  89. class NoTableName extends Model
  90. {
  91. protected $guarded = [];
  92. public $timestamps = false;
  93. }
  94. class ClassWithNonEmptyConstructor
  95. {
  96. private $bar;
  97. private $baz;
  98. public function __construct($bar, $baz)
  99. {
  100. $this->bar = $bar;
  101. $this->baz = $baz;
  102. }
  103. }