HydratorTest.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. namespace Test\Depo\RequestKit;
  3. use DateTime;
  4. use Depo\RequestKit\Builder\RequestKitBuilderFactory;
  5. use Depo\RequestKit\Builder\SchemaObjectFactory;
  6. use Depo\RequestKit\Exceptions\InvalidDataException;
  7. use Depo\RequestKit\Schema\Schema;
  8. use Depo\RequestKit\Type;
  9. use Depo\UniTester\TestCase;
  10. use Test\Depo\RequestKit\Model\AddressTest;
  11. use Test\Depo\RequestKit\Model\UserModelTest;
  12. class HydratorTest extends TestCase
  13. {
  14. private ?Schema $schema = null;
  15. protected function setUp(): void
  16. {
  17. $user = new UserModelTest();
  18. $user->setName('John Doe 3');
  19. $user->setActive(false);
  20. $this->schema = (new SchemaObjectFactory(sys_get_temp_dir()))->createSchemaFromObject($user);
  21. $this->schema = $this->schema->extend([
  22. 'email' => Type::email()->lowercase(),
  23. ]);
  24. }
  25. protected function tearDown(): void
  26. {
  27. // TODO: Implement tearDown() method.
  28. }
  29. protected function execute(): void
  30. {
  31. $this->testHydratorSimple();
  32. $this->testAddingNewProperty();
  33. $this->testForceNullOnDefaultValue();
  34. $this->testMissingNestedProperty();
  35. $this->testEmptyArrayForAddresses();
  36. $this->testInvalidTypeForName();
  37. $this->testInvalidDate();
  38. }
  39. public function testHydratorSimple(): void
  40. {
  41. $data = [
  42. 'name' => 'John Doe 3',
  43. 'active' => true,
  44. // 'created_at' => null,
  45. 'address' => [
  46. 'street' => '10 rue de la paix',
  47. 'city' => 'Paris',
  48. ],
  49. ];
  50. $result = $this->schema->process($data);
  51. $result = $result->toObject();
  52. $this->assertInstanceOf(UserModelTest::class, $result);
  53. $this->assertStrictEquals('John Doe 3', $result->getName());
  54. $this->assertStrictEquals(null, $result->getAge());
  55. $this->assertStrictEquals(null, $result->getEmail());
  56. $this->assertInstanceOf(AddressTest::class, $result->getAddress());
  57. $this->assertStrictEquals('10 rue de la paix', $result->getAddress()->getStreet());
  58. $this->assertStrictEquals('Paris', $result->getAddress()->getCity());
  59. $this->assertInstanceOf(DateTime::class, $result->getCreatedAt());
  60. $this->assertStrictEquals(true, $result->isActive());
  61. $data = [
  62. 'name' => 'John Doe',
  63. 'age' => 25,
  64. 'email' => 'JOHN@EXAMPLE.COM',
  65. 'date_of_birth' => '1990-01-01',
  66. 'created_at' => '2023-01-01 12:00:00',
  67. 'active' => 'off',
  68. 'address' => null,
  69. 'addresses' => null,
  70. ];
  71. $result = $this->schema->process($data);
  72. $result = $result->toObject();
  73. $this->assertInstanceOf(UserModelTest::class, $result);
  74. $this->assertStrictEquals('John Doe', $result->getName());
  75. $this->assertStrictEquals(25, $result->getAge());
  76. $this->assertStrictEquals('john@example.com', $result->getEmail());
  77. $this->assertInstanceOf(DateTime::class, $result->getDateOfBirth());
  78. $this->assertInstanceOf(DateTime::class, $result->getCreatedAt());
  79. $this->assertStrictEquals(null, $result->getAddress());
  80. $this->assertStrictEquals(false, $result->isActive());
  81. $this->assertStrictEquals([], $result->getAddresses());
  82. $data = [
  83. 'name' => 'John Doe',
  84. 'age' => 25,
  85. 'email' => 'JOHN@EXAMPLE.COM',
  86. 'date_of_birth' => '1990-01-01',
  87. 'created_at' => '2023-01-01 12:00:00',
  88. 'active' => true,
  89. 'address' => null,
  90. 'addresses' => [
  91. [
  92. 'street' => '10 rue de la paix',
  93. 'city' => 'Paris',
  94. 'tags' => [
  95. 'tag1',
  96. 'tag2',
  97. 1
  98. ],
  99. ],
  100. [
  101. 'street' => 'Marsupilami',
  102. 'city' => 'Paris',
  103. ],
  104. ],
  105. ];
  106. $result = $this->schema->process($data);
  107. $result = $result->toObject();
  108. $this->assertInstanceOf(UserModelTest::class, $result);
  109. $this->assertStrictEquals('John Doe', $result->getName());
  110. $this->assertStrictEquals(25, $result->getAge());
  111. $this->assertStrictEquals('john@example.com', $result->getEmail());
  112. $this->assertInstanceOf(DateTime::class, $result->getDateOfBirth());
  113. $this->assertInstanceOf(DateTime::class, $result->getCreatedAt());
  114. $this->assertStrictEquals(null, $result->getAddress());
  115. $this->assertStrictEquals(2, count($result->getAddresses()));
  116. $this->assertStrictEquals('10 rue de la paix', $result->getAddresses()[0]->getStreet());
  117. $this->assertStrictEquals('Paris', $result->getAddresses()[0]->getCity());
  118. $this->assertStrictEquals(['tag1', 'tag2', '1'], $result->getAddresses()[0]->getTags());
  119. $this->assertStrictEquals('Marsupilami', $result->getAddresses()[1]->getStreet());
  120. $this->assertStrictEquals('Paris', $result->getAddresses()[1]->getCity());
  121. $this->assertStrictEquals([], $result->getAddresses()[1]->getTags());
  122. }
  123. public function testAddingNewProperty(): void
  124. {
  125. $data = [
  126. 'phone' => '0606060606',
  127. ];
  128. $result = $this->schema->process($data);
  129. $result = $result->toArray();
  130. $this->assertTrue(!isset($result['phone']));
  131. }
  132. public function testForceNullOnDefaultValue(): void
  133. {
  134. $data = [
  135. 'email' => null,
  136. ];
  137. $result = $this->schema->process($data);
  138. $result = $result->toObject();
  139. $this->assertNull($result->getEmail()); // Attendu : null ou "John Doe 3" si l'hydrateur ignore les nulls
  140. }
  141. public function testMissingNestedProperty(): void
  142. {
  143. $data = [
  144. 'address' => [
  145. 'street' => '10 rue de la paix',
  146. // 'city' est manquant
  147. ],
  148. ];
  149. $this->expectException(InvalidDataException::class, function () use ($data) {
  150. try {
  151. $this->schema->process($data);
  152. } catch (InvalidDataException $e) {
  153. $this->assertNotEmpty($e->getErrors());
  154. $this->assertEquals(1, count($e->getErrors()));
  155. $this->assertNotEmpty($e->getError('address.city'));
  156. throw $e;
  157. }
  158. });
  159. }
  160. public function testEmptyArrayForAddresses(): void
  161. {
  162. $data = [
  163. 'addresses' => [], // Devrait être une liste d'adresses, mais on met un tableau vide
  164. ];
  165. $result = $this->schema->process($data);
  166. $result = $result->toObject();
  167. $this->assertTrue(is_array($result->getAddresses()));
  168. $this->assertStrictEquals(0, count($result->getAddresses())); // Doit retourner un tableau vide
  169. }
  170. public function testInvalidTypeForName(): void
  171. {
  172. $data = [
  173. 'name' => ['John', 'Doe'], // Mauvais type (tableau au lieu de string)
  174. ];
  175. $this->expectException(InvalidDataException::class, function () use ($data) {
  176. try {
  177. $this->schema->process($data);
  178. } catch (InvalidDataException $e) {
  179. $this->assertNotEmpty($e->getErrors());
  180. $this->assertEquals(1, count($e->getErrors()));
  181. $this->assertNotEmpty($e->getError('name'));
  182. throw $e;
  183. }
  184. });
  185. }
  186. public function testInvalidDate(): void
  187. {
  188. $data = [
  189. 'date_of_birth' => '99-99-9999', // Date invalide
  190. ];
  191. $this->expectException(InvalidDataException::class, function () use ($data) {
  192. try {
  193. $this->schema->process($data);
  194. } catch (InvalidDataException $e) {
  195. $this->assertNotEmpty($e->getErrors());
  196. $this->assertEquals(1, count($e->getErrors()));
  197. $this->assertNotEmpty($e->getError('date_of_birth'));
  198. throw $e;
  199. }
  200. });
  201. }
  202. }