2
0

PersistAndFlushTest.php 5.0 KB

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