2
0

RepositoryTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <?php
  2. namespace Test\PhpDevCommunity\PaperORM;
  3. use PhpDevCommunity\PaperORM\EntityManager;
  4. use PhpDevCommunity\UniTester\TestCase;
  5. use Test\PhpDevCommunity\PaperORM\Entity\PostTest;
  6. use Test\PhpDevCommunity\PaperORM\Entity\UserTest;
  7. use Test\PhpDevCommunity\PaperORM\Helper\DataBaseHelperTest;
  8. class RepositoryTest extends TestCase
  9. {
  10. private EntityManager $em;
  11. protected function setUp(): void
  12. {
  13. $this->em = new EntityManager([
  14. 'driver' => 'sqlite',
  15. 'user' => null,
  16. 'password' => null,
  17. 'memory' => true,
  18. ]);
  19. $this->setUpDatabaseSchema();
  20. }
  21. protected function tearDown(): void
  22. {
  23. $this->em->getConnection()->close();
  24. }
  25. protected function execute(): void
  26. {
  27. $this->testSelectWithoutJoin();
  28. $this->testSelectInnerJoin();
  29. $this->testSelectLeftJoin();
  30. }
  31. public function testSelectWithoutJoin(): void
  32. {
  33. $userRepository = $this->em->getRepository(UserTest::class);
  34. $user = $userRepository->findBy()
  35. ->first()->orderBy('id')->toArray();
  36. $this->assertStrictEquals( 1, $user['id'] );
  37. $this->assertStrictEquals( 'John0', $user['firstname'] );
  38. $this->assertStrictEquals( 'Doe0', $user['lastname'] );
  39. $this->assertStrictEquals( '0bqQpB@example.com', $user['email'] );
  40. $this->assertStrictEquals( 'password123', $user['password'] );
  41. $user = $userRepository->find(1)->toArray();
  42. $this->assertStrictEquals( 1, $user['id'] );
  43. $this->assertStrictEquals( 'John0', $user['firstname'] );
  44. $this->assertStrictEquals( 'Doe0', $user['lastname'] );
  45. $this->assertStrictEquals( '0bqQpB@example.com', $user['email'] );
  46. $this->assertStrictEquals( 'password123', $user['password'] );
  47. /**
  48. * @var UserTest $user
  49. */
  50. $user = $userRepository->find(1)->toObject();
  51. $this->assertStrictEquals( 1, $user->getId() );
  52. $this->assertStrictEquals( 'John0', $user->getFirstname() );
  53. $this->assertStrictEquals( 'Doe0', $user->getLastname() );
  54. $this->assertStrictEquals( '0bqQpB@example.com', $user->getEmail() );
  55. $this->assertStrictEquals( 'password123', $user->getPassword() );
  56. $this->assertInstanceOf( \DateTimeInterface::class, $user->getCreatedAt() );
  57. $this->assertEmpty($user->getPosts()->toArray());
  58. $this->assertNull($user->getLastPost());
  59. $users = $userRepository->findBy()->orderBy('id')->toArray();
  60. $this->assertStrictEquals( 1, $users[0]['id'] );
  61. $this->assertStrictEquals(5, count($users));
  62. $users = $userRepository->findBy()->orderBy('id')->toObject();
  63. $this->assertStrictEquals(5, count($users));
  64. foreach ($users as $user) {
  65. $this->assertInstanceOf(UserTest::class, $user);
  66. }
  67. }
  68. public function testSelectInnerJoin(): void
  69. {
  70. $userRepository = $this->em->getRepository(UserTest::class);
  71. $user = $userRepository->findBy()
  72. ->first()
  73. ->orderBy('id', 'DESC')
  74. ->has(PostTest::class)
  75. ->toArray();
  76. $this->assertStrictEquals( 4, $user['id'] );
  77. $this->assertTrue(is_array( $user['posts'] ));
  78. $this->assertNotEmpty($user['posts']);
  79. $this->assertTrue(is_array( $user['lastPost'] ));
  80. $this->assertNotEmpty($user['lastPost']);
  81. $this->em->clear();
  82. /**
  83. * @var UserTest $user
  84. */
  85. $user = $userRepository->findBy()
  86. ->first()
  87. ->orderBy('id', 'DESC')
  88. ->has(PostTest::class)
  89. ->toObject();
  90. $this->assertStrictEquals( 4, $user->getId() );
  91. $this->assertNotEmpty($user->getPosts()->toArray());
  92. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  93. $this->em->clear();
  94. $users = $userRepository->findBy()->orderBy('id', 'DESC')->has(PostTest::class)->toArray();
  95. $this->assertStrictEquals( 4, $users[0]['id'] );
  96. $this->assertStrictEquals(4, count($users));
  97. $this->em->clear();
  98. $users = $userRepository->findBy()->orderBy('id', 'DESC')->has(PostTest::class)->toObject();
  99. $this->assertStrictEquals( 4, $users[0]->getId() );
  100. $this->assertStrictEquals(4, count($users));
  101. foreach ($users as $user) {
  102. $this->assertInstanceOf(UserTest::class, $user);
  103. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  104. $this->assertEmpty($user->getLastPost()->getTags()->toArray());
  105. $this->assertNotEmpty($user->getPosts()->toArray());
  106. foreach ($user->getPosts() as $post) {
  107. $this->assertInstanceOf(PostTest::class, $post);
  108. $this->assertNull($post->getUser());
  109. $this->assertEmpty($post->getTags()->toArray());
  110. }
  111. }
  112. $this->em->clear();
  113. $users = $userRepository->findBy()
  114. ->orderBy('id', 'DESC')
  115. ->has('posts.tags')
  116. ->toObject();
  117. foreach ($users as $user) {;
  118. $this->assertInstanceOf(UserTest::class, $user);
  119. $this->assertNull($user->getLastPost());
  120. $this->assertNotEmpty($user->getPosts()->toArray());
  121. foreach ($user->getPosts() as $post) {
  122. $this->assertInstanceOf(PostTest::class, $post);
  123. $this->assertNull($post->getUser());
  124. $this->assertNotEmpty($post->getTags()->toArray());
  125. }
  126. }
  127. $this->em->clear();
  128. $users = $userRepository->findBy()
  129. ->orderBy('id', 'DESC')
  130. ->has('posts.tags')
  131. ->has('lastPost.tags')
  132. ->toObject();
  133. foreach ($users as $user) {
  134. $this->assertInstanceOf(UserTest::class, $user);
  135. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  136. $this->assertNotEmpty($user->getPosts()->toArray());
  137. $this->assertNotEmpty($user->getLastPost()->getTags()->toArray());
  138. foreach ($user->getPosts() as $post) {
  139. $this->assertInstanceOf(PostTest::class, $post);
  140. $this->assertNull($post->getUser());
  141. $this->assertNotEmpty($post->getTags()->toArray());
  142. }
  143. }
  144. $this->em->clear();
  145. $users = $userRepository->findBy()
  146. ->orderBy('id', 'DESC')
  147. ->has('posts.tags')
  148. ->has('posts.user')
  149. ->has('lastPost.tags')
  150. ->toObject();
  151. foreach ($users as $user) {
  152. $this->assertInstanceOf(UserTest::class, $user);
  153. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  154. $this->assertNotEmpty($user->getPosts()->toArray());
  155. $this->assertNotEmpty($user->getLastPost()->getTags()->toArray());
  156. $this->assertStrictEquals($user, $user->getLastPost()->getUser());
  157. foreach ($user->getPosts() as $post) {
  158. $this->assertStrictEquals($user, $post->getUser());
  159. $this->assertInstanceOf(PostTest::class, $post);
  160. $this->assertInstanceOf(UserTest::class, $post->getUser());
  161. $this->assertNotEmpty($post->getTags()->toArray());
  162. }
  163. }
  164. $this->em->clear();
  165. $users = $userRepository->findBy()
  166. ->orderBy('id', 'DESC')
  167. ->has('posts.tags')
  168. ->has('posts.comments')
  169. ->toArray();
  170. $this->assertStrictEquals(4, count($users));
  171. foreach ($users as $user) {
  172. $this->assertTrue(is_array( $user['posts'] ));
  173. $this->assertNotEmpty($user['posts']);
  174. foreach ($user['posts'] as $post) {
  175. $this->assertTrue(!array_key_exists('user', $post));
  176. $this->assertNotEmpty($post['comments']);
  177. $this->assertNotEmpty($post['tags']);
  178. $this->assertStrictEquals(2, count($post['comments']));
  179. }
  180. };
  181. $this->em->clear();
  182. $users = $userRepository->findBy()
  183. ->orderBy('id', 'DESC')
  184. ->has('posts.tags')
  185. ->has('posts.comments')
  186. ->toObject();
  187. $this->assertStrictEquals(4, count($users));
  188. foreach ($users as $user) {
  189. $this->assertInstanceOf(UserTest::class, $user);
  190. $this->assertNull($user->getLastPost());
  191. $this->assertNotEmpty($user->getPosts()->toArray());
  192. foreach ($user->getPosts() as $post) {
  193. $this->assertInstanceOf(PostTest::class, $post);
  194. $this->assertNull($post->getUser());
  195. $this->assertNotEmpty($post->getTags()->toArray());
  196. $this->assertNotEmpty($post->getComments()->toArray());
  197. }
  198. };
  199. $this->em->clear();
  200. $users = $userRepository->findBy()
  201. ->orderBy('id', 'DESC')
  202. ->has('lastPost.comments')
  203. ->toObject();
  204. $this->assertStrictEquals(3, count($users));
  205. foreach ($users as $user) {
  206. $this->assertInstanceOf(UserTest::class, $user);
  207. $this->assertEmpty($user->getPosts()->toArray());
  208. $post = $user->getLastPost();
  209. $this->assertInstanceOf(PostTest::class, $post);
  210. $this->assertNull($post->getUser());
  211. $this->assertEmpty($post->getTags()->toArray());
  212. $this->assertNotEmpty($post->getComments()->toArray());
  213. }
  214. $users = $userRepository->findBy()
  215. ->has('lastPost.user')
  216. ->limit(2)
  217. ->toObject();
  218. $this->assertStrictEquals(2, count($users));
  219. foreach ($users as $user) {
  220. $this->assertInstanceOf(UserTest::class, $user);
  221. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  222. $this->assertStrictEquals($user, $user->getLastPost()->getUser());
  223. $this->assertEmpty($user->getPosts()->toArray());
  224. }
  225. }
  226. public function testSelectLeftJoin(): void
  227. {
  228. $userRepository = $this->em->getRepository(UserTest::class);
  229. $user = $userRepository->findBy()
  230. ->first()
  231. ->orderBy('id', 'DESC')
  232. ->with(PostTest::class)
  233. ->toArray();
  234. $this->assertStrictEquals( 5, $user['id'] );
  235. $this->assertTrue(is_array( $user['posts'] ));
  236. $this->assertEmpty($user['posts']);
  237. $this->assertNull($user['lastPost']);
  238. $this->em->clear();
  239. /**
  240. * @var UserTest $user
  241. */
  242. $user = $userRepository->findBy()
  243. ->first()
  244. ->orderBy('id', 'DESC')
  245. ->with(PostTest::class)
  246. ->toObject();
  247. $this->assertStrictEquals( 5, $user->getId() );
  248. $this->assertEmpty($user->getPosts()->toArray());
  249. $this->assertNull($user->getLastPost());
  250. $this->em->clear();
  251. $users = $userRepository->findBy()->orderBy('id', 'DESC')->with(PostTest::class)->toArray();
  252. $this->assertStrictEquals( 5, $users[0]['id'] );
  253. $this->assertStrictEquals(5, count($users));
  254. $this->em->clear();
  255. $users = $userRepository->findBy()->orderBy('id', 'DESC')->with(PostTest::class)->toObject();
  256. $this->assertStrictEquals( 5, $users[0]->getId() );
  257. $this->assertStrictEquals(5, count($users));
  258. foreach ($users as $user) {
  259. $this->assertInstanceOf(UserTest::class, $user);
  260. if ($user->getId() === 5) {
  261. $this->assertNull($user->getLastPost());
  262. $this->assertEmpty($user->getPosts()->toArray());
  263. continue;
  264. }
  265. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  266. $this->assertEmpty($user->getLastPost()->getTags()->toArray());
  267. $this->assertNotEmpty($user->getPosts()->toArray());
  268. foreach ($user->getPosts() as $post) {
  269. $this->assertInstanceOf(PostTest::class, $post);
  270. $this->assertNull($post->getUser());
  271. $this->assertEmpty($post->getTags()->toArray());
  272. }
  273. }
  274. $this->em->clear();
  275. $users = $userRepository->findBy()
  276. ->orderBy('id', 'DESC')
  277. ->with('posts.tags')
  278. ->toObject();
  279. foreach ($users as $user) {
  280. $this->assertInstanceOf(UserTest::class, $user);
  281. if ($user->getId() === 5) {
  282. $this->assertEmpty($user->getPosts()->toArray());
  283. }else {
  284. $this->assertNotEmpty($user->getPosts()->toArray());
  285. }
  286. $this->assertNull($user->getLastPost());
  287. foreach ($user->getPosts() as $post) {
  288. $this->assertInstanceOf(PostTest::class, $post);
  289. $this->assertNull($post->getUser());
  290. $this->assertNotEmpty($post->getTags()->toArray());
  291. }
  292. }
  293. $this->em->clear();
  294. $users = $userRepository->findBy()
  295. ->orderBy('id', 'DESC')
  296. ->with('posts.tags')
  297. ->with('lastPost.tags')
  298. ->toObject();
  299. foreach ($users as $user) {
  300. $this->assertInstanceOf(UserTest::class, $user);
  301. if ($user->getId() === 5) {
  302. $this->assertNull($user->getLastPost());
  303. $this->assertEmpty($user->getPosts()->toArray());
  304. }else {
  305. $this->assertInstanceOf(PostTest::class, $user->getLastPost());
  306. $this->assertNotEmpty($user->getPosts()->toArray());
  307. $this->assertNotEmpty($user->getLastPost()->getTags()->toArray());
  308. }
  309. foreach ($user->getPosts() as $post) {
  310. $this->assertInstanceOf(PostTest::class, $post);
  311. $this->assertNull($post->getUser());
  312. $this->assertNotEmpty($post->getTags()->toArray());
  313. }
  314. }
  315. }
  316. protected function setUpDatabaseSchema(): void
  317. {
  318. DataBaseHelperTest::init($this->em);
  319. }
  320. }