TypeTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. namespace Test\PhpDevCommunity\RequestKit;
  3. use PhpDevCommunity\RequestKit\Type\BoolType;
  4. use PhpDevCommunity\RequestKit\Type\DateTimeType;
  5. use PhpDevCommunity\RequestKit\Type\DateType;
  6. use PhpDevCommunity\RequestKit\Type\IntType;
  7. use PhpDevCommunity\RequestKit\Type\NumericType;
  8. use PhpDevCommunity\RequestKit\Type\StringType;
  9. class TypeTest extends \PhpDevCommunity\UniTester\TestCase
  10. {
  11. protected function setUp(): void
  12. {
  13. // TODO: Implement setUp() method.
  14. }
  15. protected function tearDown(): void
  16. {
  17. // TODO: Implement tearDown() method.
  18. }
  19. protected function execute(): void
  20. {
  21. $this->testStringType();
  22. $this->testIntType();
  23. $this->testBoolType();
  24. $this->testDateTimeType();
  25. $this->testDateType();
  26. $this->testNumericType();
  27. }
  28. private function testStringType()
  29. {
  30. $type = (new StringType())
  31. ->required()
  32. ->length(4, 20);
  33. $result = $type->validate(" test ");
  34. $this->assertTrue($result->isValid());
  35. $this->assertEquals(' test ', $result->getValue());
  36. $type->trim();
  37. $result = $type->validate(" test ");
  38. $this->assertTrue($result->isValid());
  39. $this->assertEquals('test', $result->getValue());
  40. $type->length(10, 20);
  41. $result = $type->validate(" test ");
  42. $this->assertFalse($result->isValid());
  43. $this->assertEquals('test must be at least 10 characters long', $result->getError());
  44. $type->length(1, 3);
  45. $result = $type->validate(" test ");
  46. $this->assertFalse($result->isValid());
  47. $this->assertEquals('test cannot be longer than 3 characters', $result->getError());
  48. $type->length(10, 20)->optional();
  49. $result = $type->validate(null);
  50. $this->assertTrue($result->isValid());
  51. $this->assertEquals(null, $result->getValue());
  52. $type->required();
  53. $result = $type->validate(null);
  54. $this->assertFalse($result->isValid());
  55. $this->assertEquals('Value is required, but got null or empty string', $result->getError());
  56. $type->length(1);
  57. $result = $type->validate(123);
  58. $this->assertTrue($result->isValid());
  59. $this->assertEquals('123', $result->getValue());
  60. $this->assertEquals(123, $result->getRawValue());
  61. $type->strict();
  62. $result = $type->validate(123);
  63. $this->assertFalse($result->isValid());
  64. $this->assertEquals('Value must be a string, got: integer', $result->getError());
  65. $type->uppercase();
  66. $result = $type->validate("is test");
  67. $this->assertTrue($result->isValid());
  68. $this->assertStrictEquals('IS TEST', $result->getValue());
  69. $type->lowercase();
  70. $type->removeSpaces();
  71. $result = $type->validate("is test for me");
  72. $this->assertTrue($result->isValid());
  73. $this->assertStrictEquals('istestforme', $result->getValue());
  74. $type->length(6);
  75. $type->padLeft(6, "0");
  76. $result = $type->validate("1");
  77. $this->assertTrue($result->isValid());
  78. $this->assertStrictEquals('000001', $result->getValue());
  79. $type->length(6);
  80. $type->removeChars('+', '-', '.');
  81. $result = $type->validate("123-45+6.");
  82. $this->assertTrue($result->isValid());
  83. $this->assertStrictEquals('123456', $result->getValue());
  84. $type->allowed('123456', '654321');
  85. $result = $type->validate("654321");
  86. $this->assertTrue($result->isValid());
  87. $this->assertStrictEquals('654321', $result->getValue());
  88. $type->allowed('123456', '654321');
  89. $result = $type->validate("254321");
  90. $this->assertFalse($result->isValid());
  91. $this->assertNotNull($result->getError());
  92. }
  93. private function testIntType()
  94. {
  95. $type = (new IntType())
  96. ->required()
  97. ->min(5)
  98. ->max(12);
  99. $result = $type->validate(12);
  100. $this->assertTrue($result->isValid());
  101. $this->assertEquals(12, $result->getValue());
  102. $result = $type->validate('12');
  103. $this->assertTrue($result->isValid());
  104. $this->assertEquals(12, $result->getValue());
  105. $result = $type->validate(1);
  106. $this->assertFalse($result->isValid());
  107. $this->assertNotNull($result->getError());
  108. $type->strict();
  109. $result = $type->validate("10");
  110. $this->assertFalse($result->isValid());
  111. $this->assertNotNull($result->getError());
  112. $result = $type->validate(null);
  113. $this->assertFalse($result->isValid());
  114. $this->assertNotNull($result->getError());
  115. $type->optional();
  116. $result = $type->validate(null);
  117. $this->assertTrue($result->isValid());
  118. $this->assertNull($result->getError());
  119. }
  120. private function testBoolType()
  121. {
  122. $type = (new BoolType())
  123. ->required();
  124. $result = $type->validate(true);
  125. $this->assertTrue($result->isValid());
  126. $this->assertEquals(true, $result->getValue());
  127. $result = $type->validate('true');
  128. $this->assertTrue($result->isValid());
  129. $this->assertEquals(true, $result->getValue());
  130. $result = $type->validate('1');
  131. $this->assertTrue($result->isValid());
  132. $this->assertEquals(true, $result->getValue());
  133. $result = $type->validate(1);
  134. $this->assertTrue($result->isValid());
  135. $this->assertEquals(true, $result->getValue());
  136. $result = $type->validate(false);
  137. $this->assertTrue($result->isValid());
  138. $this->assertEquals(false, $result->getValue());
  139. $result = $type->validate('false');
  140. $this->assertTrue($result->isValid());
  141. $this->assertEquals(false, $result->getValue());
  142. $result = $type->validate('0');
  143. $this->assertTrue($result->isValid());
  144. $this->assertEquals(false, $result->getValue());
  145. $result = $type->validate(0);
  146. $this->assertTrue($result->isValid());
  147. $this->assertEquals(false, $result->getValue());
  148. }
  149. private function testDateTimeType()
  150. {
  151. $type = (new DateTimeType())
  152. ->format('Y-m-d H:i:s')
  153. ->required();
  154. $result = $type->validate('2020-01-01 10:00:00');
  155. $this->assertTrue($result->isValid());
  156. $this->assertInstanceOf(\DateTime::class, $result->getValue());
  157. $type->optional();
  158. $result = $type->validate(null);
  159. $this->assertTrue($result->isValid());
  160. $this->assertEquals(null, $result->getValue());
  161. $type->required();
  162. $result = $type->validate('2020-01-01 10:00');
  163. $this->assertFalse($result->isValid());
  164. $this->assertNotNull($result->getError());
  165. ;
  166. $result = $type->validate(strtotime('2020-01-01 10:00'));
  167. $this->assertTrue($result->isValid());
  168. $this->assertInstanceOf(\DateTime::class, $result->getValue());
  169. $datetime = $result->getValue();
  170. $this->assertEquals('2020-01-01 10:00:00', $datetime->format('Y-m-d H:i:s'));
  171. }
  172. private function testDateType()
  173. {
  174. $type = (new DateType())
  175. ->format('Y-m-d')
  176. ->required();
  177. $result = $type->validate('2020-01-01');
  178. $this->assertTrue($result->isValid());
  179. $this->assertInstanceOf(\DateTime::class, $result->getValue());
  180. $type->optional();
  181. $result = $type->validate(null);
  182. $this->assertTrue($result->isValid());
  183. $this->assertEquals(null, $result->getValue());
  184. $type->required();
  185. $result = $type->validate('2020-01-01 10:00');
  186. $this->assertFalse($result->isValid());
  187. $this->assertNotNull($result->getError());
  188. $result = $type->validate(strtotime('2020-01-01'));
  189. $this->assertTrue($result->isValid());
  190. $this->assertInstanceOf(\DateTime::class, $result->getValue());
  191. $datetime = $result->getValue();
  192. $this->assertEquals('2020-01-01', $datetime->format('Y-m-d'));
  193. }
  194. private function testNumericType()
  195. {
  196. $testCases = [
  197. [1, '1'],
  198. ['1', '1'],
  199. ['1.0', '1.0'],
  200. [1.0, '1'],
  201. [0, '0'],
  202. [0.0, '0'],
  203. ['0.0', '0.0'],
  204. ['136585.589', '136585.589'],
  205. [136585.589, '136585.589'],
  206. [-1, "-1"],
  207. [-1.5,'-1.5'],
  208. [PHP_INT_MAX, (string)PHP_INT_MAX],
  209. ];
  210. foreach ($testCases as [$input, $expectedOutput]) {
  211. $type = (new NumericType())->required();
  212. $result = $type->validate($input);
  213. $this->assertTrue($result->isValid());
  214. $this->assertStrictEquals($expectedOutput, $result->getValue());
  215. }
  216. }
  217. }