PersistAndFlushTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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->testUpdate($em);
  25. $this->testUpdateJoinColumn($em);
  26. $this->testDelete($em);
  27. $em->getConnection()->close();
  28. }
  29. }
  30. private function testInsert(EntityManager $em): void
  31. {
  32. $user = new UserTest();
  33. $this->assertNull($user->getId());
  34. $user->setFirstname('John');
  35. $user->setLastname('Doe');
  36. $user->setPassword('secret');
  37. $user->setEmail('Xq5qI@example.com');
  38. $user->setActive(true);
  39. $em->persist($user);
  40. $em->flush();
  41. $this->assertNotNull($user->getId());
  42. $em->clear();
  43. }
  44. private function testUpdate(EntityManager $em): void
  45. {
  46. $userRepository = $em->getRepository(UserTest::class);
  47. $user = $userRepository->findBy()->first()->orderBy('id')->toObject();
  48. $this->assertInstanceOf(ProxyInterface::class, $user);
  49. $this->assertInstanceOf(UserTest::class, $user);
  50. /**
  51. * @var ProxyInterface|UserTest $user
  52. */
  53. $user->setActive(false);
  54. $user->setLastname('TOTO');
  55. $this->assertStrictEquals(2, count($user->__getPropertiesModified()));
  56. $em->persist($user);
  57. $em->flush();
  58. $user = null;
  59. $em->clear();
  60. $user = $userRepository->findBy()->first()->orderBy('id')->toObject();
  61. $this->assertInstanceOf(ProxyInterface::class, $user);
  62. $this->assertInstanceOf(UserTest::class, $user);
  63. /**
  64. * @var ProxyInterface|UserTest $user
  65. */
  66. $this->assertStrictEquals(0, count($user->__getPropertiesModified()));
  67. $this->assertFalse($user->isActive());
  68. $this->assertStrictEquals('TOTO', $user->getLastname());
  69. }
  70. private function testUpdateJoinColumn(EntityManager $em)
  71. {
  72. $userRepository = $em->getRepository(UserTest::class);
  73. $postRepository = $em->getRepository(PostTest::class);
  74. $post = $postRepository->findBy()->first()
  75. ->where(Expr::isNotNull('user'))
  76. ->with(UserTest::class)
  77. ->toObject();
  78. $this->assertInstanceOf(ProxyInterface::class, $post);
  79. $this->assertInstanceOf(PostTest::class, $post);
  80. $this->assertInstanceOf(UserTest::class, $post->getUser());
  81. $this->assertStrictEquals(1, $post->getUser()->getId());
  82. $user2 = $userRepository->find(2)
  83. ->with(PostTest::class)
  84. ->toObject();
  85. $this->assertStrictEquals(2, count($user2->getPosts()->toArray()));
  86. foreach ($user2->getPosts()->toArray() as $postItem) {
  87. $this->assertInstanceOf(ProxyInterface::class, $postItem);
  88. $this->assertInstanceOf(PostTest::class, $postItem);
  89. }
  90. $post->setUser($user2);
  91. $em->persist($post);
  92. $em->flush();
  93. $user2 = $userRepository->find(2)
  94. ->with(PostTest::class)
  95. ->toObject();
  96. $this->assertStrictEquals(3, count($user2->getPosts()->toArray()));
  97. $user1 = $userRepository->find(1)->with(PostTest::class)->toObject();
  98. $this->assertStrictEquals(1, count($user1->getPosts()->toArray()));
  99. }
  100. private function testDelete(EntityManager $em)
  101. {
  102. $user = $em->getRepository(UserTest::class)->find(1)->toObject();
  103. $this->assertInstanceOf(ProxyInterface::class, $user);
  104. $this->assertInstanceOf(UserTest::class, $user);
  105. $em->remove($user);
  106. $em->flush();
  107. $this->assertFalse($user->__isInitialized());
  108. $posts = $user->getPosts();
  109. $ids = [];
  110. foreach ($posts as $post) {
  111. $ids[] = $post->getId();
  112. $em->remove($post);
  113. $em->flush();
  114. $this->assertFalse($post->__isInitialized());
  115. }
  116. $user = $em->getRepository(UserTest::class)->find(1)->toObject();
  117. $this->assertNull($user);
  118. foreach ($ids as $idPost) {
  119. $postToDelete = $em->getRepository(PostTest::class)->find($idPost)->toObject();
  120. $this->assertNull($postToDelete);
  121. }
  122. }
  123. }