PersistAndFlushTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace Test\PhpDevCommunity\PaperORM;
  3. use PhpDevCommunity\PaperORM\EntityManager;
  4. use PhpDevCommunity\PaperORM\Expression\Expr;
  5. use PhpDevCommunity\PaperORM\Proxy\ProxyInterface;
  6. use PhpDevCommunity\UniTester\TestCase;
  7. use Test\PhpDevCommunity\PaperORM\Entity\PostTest;
  8. use Test\PhpDevCommunity\PaperORM\Entity\UserTest;
  9. use Test\PhpDevCommunity\PaperORM\Helper\DataBaseHelperTest;
  10. class PersistAndFlushTest extends TestCase
  11. {
  12. protected function setUp(): void
  13. {
  14. }
  15. protected function tearDown(): void
  16. {
  17. }
  18. protected function execute(): void
  19. {
  20. foreach (DataBaseHelperTest::drivers() as $params) {
  21. $em = new EntityManager($params);
  22. DataBaseHelperTest::init($em);
  23. $this->testInsert($em);
  24. $this->testInsertAndUpdate($em);
  25. $this->testUpdate($em);
  26. $this->testUpdateJoinColumn($em);
  27. $this->testDelete($em);
  28. $em->getConnection()->close();
  29. }
  30. }
  31. private function testInsert(EntityManager $em): void
  32. {
  33. $user = new UserTest();
  34. $this->assertNull($user->getId());
  35. $user->setFirstname('John');
  36. $user->setLastname('Doe');
  37. $user->setPassword('secret');
  38. $user->setEmail('Xq5qI@example.com');
  39. $user->setActive(true);
  40. $em->persist($user);
  41. $em->flush();
  42. $this->assertNotNull($user->getId());
  43. $this->assertInstanceOf(\DateTimeInterface::class, $user->getCreatedAt());
  44. $this->assertInstanceOf(\DateTimeInterface::class, $user->getCreatedAt());
  45. $em->clear();
  46. }
  47. private function testInsertAndUpdate(EntityManager $em): void
  48. {
  49. $user = new UserTest();
  50. $user->setFirstname('John');
  51. $user->setLastname('Doe');
  52. $user->setPassword('secret');
  53. $user->setEmail('Xq5qI@example.com');
  54. $user->setActive(true);
  55. $em->persist($user);
  56. $em->flush();
  57. $this->assertNotNull($user->getId());
  58. $this->assertInstanceOf(\DateTimeInterface::class, $user->getCreatedAt());
  59. $user->setLastname('TOTO');
  60. $em->persist($user);
  61. $em->flush();
  62. $em->clear();
  63. }
  64. private function testUpdate(EntityManager $em): void
  65. {
  66. $userRepository = $em->getRepository(UserTest::class);
  67. $user = $userRepository->findBy()->first()->orderBy('id')->toObject();
  68. $this->assertInstanceOf(ProxyInterface::class, $user);
  69. $this->assertInstanceOf(UserTest::class, $user);
  70. $this->assertStrictEquals(UserTest::class, $user->__getParentClass());
  71. /**
  72. * @var ProxyInterface|UserTest $user
  73. */
  74. $user->setActive(false);
  75. $user->setLastname('TOTO');
  76. $this->assertStrictEquals(2, count($user->__getPropertiesModified()));
  77. $em->persist($user);
  78. $em->flush();
  79. $user = null;
  80. $em->clear();
  81. $user = $userRepository->findBy()->first()->orderBy('id')->toObject();
  82. $this->assertInstanceOf(ProxyInterface::class, $user);
  83. $this->assertInstanceOf(UserTest::class, $user);
  84. /**
  85. * @var ProxyInterface|UserTest $user
  86. */
  87. $this->assertStrictEquals(0, count($user->__getPropertiesModified()));
  88. $this->assertFalse($user->isActive());
  89. $this->assertStrictEquals('TOTO', $user->getLastname());
  90. }
  91. private function testUpdateJoinColumn(EntityManager $em)
  92. {
  93. $userRepository = $em->getRepository(UserTest::class);
  94. $postRepository = $em->getRepository(PostTest::class);
  95. $post = $postRepository->findBy()->first()
  96. ->where(Expr::isNotNull('user'))
  97. ->with(UserTest::class)
  98. ->toObject();
  99. $this->assertInstanceOf(ProxyInterface::class, $post);
  100. $this->assertInstanceOf(PostTest::class, $post);
  101. $this->assertInstanceOf(UserTest::class, $post->getUser());
  102. $this->assertStrictEquals(1, $post->getUser()->getId());
  103. $user2 = $userRepository->find(2)
  104. ->with(PostTest::class)
  105. ->toObject();
  106. $this->assertStrictEquals(2, count($user2->getPosts()->toArray()));
  107. foreach ($user2->getPosts()->toArray() as $postItem) {
  108. $this->assertInstanceOf(ProxyInterface::class, $postItem);
  109. $this->assertInstanceOf(PostTest::class, $postItem);
  110. }
  111. $post->setUser($user2);
  112. $em->persist($post);
  113. $em->flush();
  114. $user2 = $userRepository->find(2)
  115. ->with(PostTest::class)
  116. ->toObject();
  117. $this->assertStrictEquals(3, count($user2->getPosts()->toArray()));
  118. $user1 = $userRepository->find(1)->with(PostTest::class)->toObject();
  119. $this->assertStrictEquals(1, count($user1->getPosts()->toArray()));
  120. }
  121. private function testDelete(EntityManager $em)
  122. {
  123. $user = $em->getRepository(UserTest::class)->find(1)->toObject();
  124. $this->assertInstanceOf(ProxyInterface::class, $user);
  125. $this->assertInstanceOf(UserTest::class, $user);
  126. $em->remove($user);
  127. $em->flush();
  128. $this->assertFalse($user->__isInitialized());
  129. $posts = $user->getPosts();
  130. $ids = [];
  131. foreach ($posts as $post) {
  132. $ids[] = $post->getId();
  133. $em->remove($post);
  134. $em->flush();
  135. $this->assertFalse($post->__isInitialized());
  136. }
  137. $user = $em->getRepository(UserTest::class)->find(1)->toObject();
  138. $this->assertNull($user);
  139. foreach ($ids as $idPost) {
  140. $postToDelete = $em->getRepository(PostTest::class)->find($idPost)->toObject();
  141. $this->assertNull($postToDelete);
  142. }
  143. }
  144. }