ScopedValidatorsTest.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php declare(strict_types=1);
  2. /**
  3. * Created by PhpStorm.
  4. * User: inhere
  5. * Date: 2019-01-23
  6. * Time: 01:26
  7. */
  8. namespace Inhere\ValidateTest\Traits;
  9. use Inhere\Validate\Validation;
  10. use InvalidArgumentException;
  11. use PHPUnit\Framework\TestCase;
  12. use stdClass;
  13. use const UPLOAD_ERR_INI_SIZE;
  14. use const UPLOAD_ERR_OK;
  15. /**
  16. * Class ScopedValidatorsTest
  17. */
  18. class ScopedValidatorsTest extends TestCase
  19. {
  20. public function testUserValidators(): void
  21. {
  22. $v = Validation::make([]);
  23. $v->clearValidators();
  24. $v->addValidators([
  25. 'name1' => static function () {
  26. },
  27. 'name2' => static function () {
  28. },
  29. '' => static function () {
  30. },
  31. ]);
  32. $this->assertCount(2, $v->getValidators());
  33. $this->assertTrue($v->hasValidator('name1'));
  34. $this->assertFalse($v->hasValidator(''));
  35. $this->assertNotEmpty($v->getValidator('name2'));
  36. $this->assertEmpty($v->getValidator('name3'));
  37. $v->addValidator('name4', static function () {
  38. });
  39. $this->assertNotEmpty($v->getValidator('name4'));
  40. $v->delValidator('name1');
  41. $this->assertFalse($v->hasValidator('name1'));
  42. $v->clearValidators();
  43. $this->assertCount(0, $v->getValidators());
  44. }
  45. /**
  46. * eq, neq, lt, lte, gt, gte field compare...
  47. */
  48. public function testFiledCompare(): void
  49. {
  50. $v = Validation::make([
  51. 'name' => 'tom',
  52. 'age' => 34,
  53. 'tags' => ['funny', 'smile'],
  54. ]);
  55. // eq
  56. $this->assertTrue($v->eqFieldValidator(34, 'age'));
  57. $this->assertFalse($v->eqFieldValidator(334, 'age'));
  58. $this->assertFalse($v->eqFieldValidator(334, ''));
  59. // neq
  60. $this->assertTrue($v->neqFieldValidator(334, 'age'));
  61. $this->assertFalse($v->neqFieldValidator(34, 'age'));
  62. $this->assertFalse($v->neqFieldValidator(34, ''));
  63. // lt
  64. $this->assertTrue($v->ltFieldValidator(23, 'age'));
  65. $this->assertFalse($v->ltFieldValidator('23', 'age'));
  66. $this->assertFalse($v->ltFieldValidator(34, 'age'));
  67. $this->assertFalse($v->ltFieldValidator(34, ''));
  68. // lte
  69. $this->assertTrue($v->lteFieldValidator(23, 'age'));
  70. $this->assertTrue($v->lteFieldValidator(34, 'age'));
  71. $this->assertFalse($v->lteFieldValidator('34', 'age'));
  72. $this->assertFalse($v->lteFieldValidator('34', ''));
  73. // gt
  74. $this->assertTrue($v->gtFieldValidator(45, 'age'));
  75. $this->assertFalse($v->gtFieldValidator('45', 'age'));
  76. $this->assertFalse($v->gtFieldValidator(23, 'age'));
  77. $this->assertFalse($v->gtFieldValidator(23, ''));
  78. // gte
  79. $this->assertTrue($v->gteFieldValidator(43, 'age'));
  80. $this->assertTrue($v->gteFieldValidator(34, 'age'));
  81. $this->assertFalse($v->gteFieldValidator('34', 'age'));
  82. $this->assertFalse($v->gteFieldValidator('34', ''));
  83. // in
  84. $this->assertTrue($v->inFieldValidator('funny', 'tags'));
  85. $this->assertFalse($v->inFieldValidator('book', 'tags'));
  86. }
  87. public function testRequired(): void
  88. {
  89. $v = Validation::make([
  90. 'age' => 23,
  91. 'zero' => 0,
  92. 'false' => false,
  93. 'null' => null,
  94. 'emptyStr' => '',
  95. 'emptyArr' => [],
  96. 'emptyObj' => new stdClass(),
  97. ]);
  98. $samples = [
  99. ['age', true],
  100. ['zero', true],
  101. ['false', true],
  102. ['null', false],
  103. ['emptyStr', false],
  104. ['emptyArr', false],
  105. ['emptyObj', false],
  106. ['notExist', false],
  107. ];
  108. foreach ($samples as $item) {
  109. $this->assertSame($item[1], $v->required($item[0]));
  110. }
  111. }
  112. public function testRequiredXXX(): void
  113. {
  114. $v = Validation::make([
  115. 'nick' => 'tom',
  116. ]);
  117. $vs1 = ['john', 'jac'];
  118. $vs2 = ['john', 'tom'];
  119. // 如果指定的另一个字段( anotherField )值等于任何一个 value 时,此字段为 必填 (refer laravel)
  120. $ok = $v->requiredIf('name', 'inhere', 'nick', $vs2);
  121. $this->assertTrue($ok);
  122. $ok = $v->requiredIf('name', '', 'nick', $vs2);
  123. $this->assertFalse($ok);
  124. $ok = $v->requiredIf('name', '', 'nick', $vs1);
  125. $this->assertNull($ok);
  126. // 如果指定的另一个字段( anotherField )值等于任何一个 value 时,此字段为 不必填(refer laravel)
  127. $ok = $v->requiredUnless('name', '', 'nick', $vs2);
  128. $this->assertNull($ok);
  129. $ok = $v->requiredUnless('name', 'inhere', 'nick', $vs1);
  130. $this->assertTrue($ok);
  131. }
  132. public function testUploadFile(): void
  133. {
  134. $v = Validation::make([]);
  135. $v->setUploadedFiles([
  136. 'file1' => [
  137. 'name' => 'some.jpg',
  138. 'tmp_name' => '/tmp/some.jpg',
  139. 'error' => UPLOAD_ERR_OK,
  140. ],
  141. 'err_file' => [
  142. 'name' => 'some.jpg',
  143. 'tmp_name' => '/tmp/some.jpg',
  144. 'error' => UPLOAD_ERR_INI_SIZE,
  145. ],
  146. 'err_suffix' => [
  147. 'name' => 'some-no-ext',
  148. 'tmp_name' => '/tmp/some.jpg',
  149. 'error' => UPLOAD_ERR_OK,
  150. ],
  151. ]);
  152. $this->assertNotEmpty($v->getUploadedFiles());
  153. $this->assertNotEmpty($v->getUploadedFile('file1'));
  154. $this->assertTrue($v->fileValidator('file1'));
  155. $this->assertTrue($v->fileValidator('file1', ['jpg']));
  156. $this->assertFalse($v->fileValidator('err_suffix', ['jpg']));
  157. $this->assertFalse($v->fileValidator('err_file'));
  158. $this->assertFalse($v->fileValidator('not-exist'));
  159. $this->assertFalse($v->imageValidator('err_file'));
  160. $this->assertFalse($v->imageValidator('not-exist'));
  161. }
  162. public function testEachValidator(): void
  163. {
  164. $v = Validation::make([
  165. 'tags' => [3, 4, 5],
  166. 'goods' => ['apple', 'pear'],
  167. 'users' => [
  168. ['id' => 34, 'name' => 'tom'],
  169. ['id' => 89, 'name' => 'john'],
  170. ],
  171. ]);
  172. $v->addValidator('my-validator', function () {
  173. return true;
  174. });
  175. $tags = $v->getByPath('tags.*');
  176. $this->assertFalse($v->eachValidator($tags, 'lt', 4));
  177. $this->assertTrue($v->eachValidator($tags, 'gt', 2));
  178. $this->assertTrue($v->eachValidator($tags, 'is_int'));
  179. $this->assertTrue($v->eachValidator($tags, 'my-validator'));
  180. $this->assertTrue($v->eachValidator($tags, function () {
  181. return true;
  182. }));
  183. $this->expectException(InvalidArgumentException::class);
  184. $this->assertTrue($v->eachValidator([]));
  185. }
  186. }