PageRenderTime 25ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/library/vendors/doctrine/odm/tests/Doctrine/ODM/MongoDB/Tests/Functional/EmbeddedTest.php

https://bitbucket.org/paulscott56/c4-framework
PHP | 426 lines | 298 code | 92 blank | 36 comment | 0 complexity | ced93bb3d1d935dfcc479ed7b19f3796 MD5 | raw file
  1. <?php
  2. namespace Doctrine\ODM\MongoDB\Tests\Functional;
  3. use Documents\Address,
  4. Documents\Profile,
  5. Documents\Phonenumber,
  6. Documents\Account,
  7. Documents\Group,
  8. Documents\User,
  9. Documents\Functional\EmbeddedTestLevel0,
  10. Documents\Functional\EmbeddedTestLevel0b,
  11. Documents\Functional\EmbeddedTestLevel1,
  12. Documents\Functional\EmbeddedTestLevel2,
  13. Documents\Functional\VirtualHost,
  14. Documents\Functional\VirtualHostDirective,
  15. Doctrine\ODM\MongoDB\PersistentCollection;
  16. class EmbeddedTest extends \Doctrine\ODM\MongoDB\Tests\BaseTest
  17. {
  18. public function testFlushEmbedded()
  19. {
  20. $test = new EmbeddedTestLevel0();
  21. $test->name = 'test';
  22. $this->dm->persist($test);
  23. $this->dm->flush();
  24. $this->dm->clear();
  25. $test = $this->dm->getRepository('Documents\Functional\EmbeddedTestLevel0')->findOneBy(array('name' => 'test'));
  26. $this->assertInstanceOf('Documents\Functional\EmbeddedTestLevel0', $test);
  27. // Adding this flush here makes level1 not to be inserted.
  28. $this->dm->flush();
  29. $level1 = new EmbeddedTestLevel1();
  30. $level1->name = 'test level1 #1';
  31. $test->level1[] = $level1;
  32. $this->dm->flush();
  33. $this->dm->clear();
  34. $test = $this->dm->find('Documents\Functional\EmbeddedTestLevel0', $test->id);
  35. $this->assertInstanceOf('Documents\Functional\EmbeddedTestLevel0', $test);
  36. $this->assertInstanceOf('Documents\Functional\EmbeddedTestLevel1', $test->level1[0]);
  37. $test->level1[0]->name = 'changed';
  38. $level1 = new EmbeddedTestLevel1();
  39. $level1->name = 'testing';
  40. $test->level1->add($level1);
  41. $this->dm->flush();
  42. $this->dm->clear();
  43. $test = $this->dm->find('Documents\Functional\EmbeddedTestLevel0', $test->id);
  44. $this->assertEquals(2, count($test->level1));
  45. $this->assertEquals('changed', $test->level1[0]->name);
  46. $this->assertEquals('testing', $test->level1[1]->name);
  47. unset($test->level1[0]);
  48. $this->dm->flush();
  49. $this->dm->clear();
  50. $this->assertEquals(1, count($test->level1));
  51. }
  52. public function testOneEmbedded()
  53. {
  54. $address = new Address();
  55. $address->setAddress('6512 Mercomatic Ct.');
  56. $address->setCity('Nashville');
  57. $address->setState('TN');
  58. $address->setZipcode('37209');
  59. $addressClone = clone $address;
  60. $user = new User();
  61. $user->setUsername('jwage');
  62. $this->dm->persist($user);
  63. $this->dm->flush();
  64. $user->setAddress($address);
  65. $this->dm->flush();
  66. $this->dm->clear();
  67. $user = $this->dm->createQueryBuilder('Documents\User')
  68. ->field('id')->equals($user->getId())
  69. ->getQuery()
  70. ->getSingleResult();
  71. $this->assertNotNull($user);
  72. $this->assertEquals($addressClone, $user->getAddress());
  73. }
  74. public function testRemoveOneEmbedded()
  75. {
  76. $address = new Address();
  77. $address->setAddress('6512 Mercomatic Ct.');
  78. $user = new User();
  79. $user->setUsername('jwage');
  80. $user->setAddress($address);
  81. $this->dm->persist($user);
  82. $this->dm->flush();
  83. $user->removeAddress();
  84. $this->assertNull($user->getAddress());
  85. $this->dm->flush();
  86. $this->dm->clear();
  87. $user = $this->dm->createQueryBuilder('Documents\User')
  88. ->field('id')->equals($user->getId())
  89. ->getQuery()
  90. ->getSingleResult();
  91. $this->assertNotNull($user);
  92. $this->assertNull($user->getAddress());
  93. }
  94. public function testManyEmbedded()
  95. {
  96. $user = new \Documents\User();
  97. $user->addPhonenumber(new Phonenumber('6155139185'));
  98. $user->addPhonenumber(new Phonenumber('6153303769'));
  99. $this->dm->persist($user);
  100. $this->dm->flush();
  101. $this->dm->clear();
  102. $user2 = $this->dm->createQueryBuilder('Documents\User')
  103. ->field('id')->equals($user->getId())
  104. ->getQuery()
  105. ->getSingleResult();
  106. $this->assertNotNull($user2);
  107. $this->assertEquals($user->getPhonenumbers()->toArray(), $user2->getPhonenumbers()->toArray());
  108. }
  109. public function testPostRemoveEventOnEmbeddedManyDocument()
  110. {
  111. // create a test document
  112. $test = new EmbeddedTestLevel0b();
  113. $test->name = 'embedded test';
  114. // embed one level1 in test
  115. $level1 = new EmbeddedTestLevel1();
  116. $level1->name = 'test level1 #1';
  117. $test->level1[] = $level1;
  118. // persist test
  119. $this->dm->persist($test);
  120. $this->dm->flush();
  121. $this->dm->clear();
  122. // retrieve test
  123. $test = $this->dm->createQueryBuilder(get_class($test))
  124. ->field('id')->equals($test->id)
  125. ->getQuery()
  126. ->getSingleResult();
  127. $level1 = $test->level1[0];
  128. // $test->level1[0] is available
  129. $this->assertEquals('test level1 #1', $level1->name);
  130. // remove all level1 from test
  131. $test->level1->clear();
  132. $this->dm->flush();
  133. // verify that level1 lifecycle callbacks have been called
  134. $this->assertTrue($level1->preRemove, 'the removed embedded document executed the PreRemove lifecycle callback');
  135. $this->assertTrue($level1->postRemove, 'the removed embedded document executed the PostRemove lifecycle callback');
  136. }
  137. public function testRemoveEmbeddedManyDocument()
  138. {
  139. // create a test document
  140. $test = new EmbeddedTestLevel0b();
  141. $test->name = 'embedded test';
  142. // embed one level1 in test
  143. $level1 = new EmbeddedTestLevel1();
  144. $level1->name = 'test level1 #1';
  145. $test->level1[] = $level1;
  146. // persist test
  147. $this->dm->persist($test);
  148. $this->dm->flush();
  149. $this->dm->clear();
  150. // retrieve test
  151. $test = $this->dm->createQueryBuilder(get_class($test))
  152. ->field('id')->equals($test->id)
  153. ->getQuery()
  154. ->getSingleResult();
  155. // $test->level1[0] is available
  156. $this->assertEquals('test level1 #1', $test->level1[0]->name);
  157. // remove all level1 from test
  158. $test->level1->clear();
  159. $this->dm->flush();
  160. $this->dm->clear();
  161. // verify that test has no more level1
  162. $this->assertEquals(0, $test->level1->count());
  163. // retrieve test
  164. $test = $this->dm->createQueryBuilder(get_class($test))
  165. ->field('id')->equals($test->id)
  166. ->getQuery()
  167. ->getSingleResult();
  168. $this->assertInstanceOf('Doctrine\ODM\MongoDB\PersistentCollection', $test->level1);
  169. // verify that test has no more level1
  170. $this->assertEquals(0, $test->level1->count());
  171. }
  172. public function testRemoveDeepEmbeddedManyDocument()
  173. {
  174. // create a test document
  175. $test = new EmbeddedTestLevel0b();
  176. $test->name = 'embedded test';
  177. // embed one level1 in test
  178. $level1 = new EmbeddedTestLevel1();
  179. $level1->name = 'test level1 #1';
  180. $test->oneLevel1 = $level1;
  181. // embed one level2 in level1
  182. $level2 = new EmbeddedTestLevel2();
  183. $level2->name = 'test level2 #1';
  184. $level1->level2[] = $level2;
  185. // persist test
  186. $this->dm->persist($test);
  187. $this->dm->flush();
  188. $this->dm->clear();
  189. // retrieve test
  190. $test = $this->dm->createQueryBuilder(get_class($test))
  191. ->field('id')->equals($test->id)
  192. ->getQuery()
  193. ->getSingleResult();
  194. $level1 = $test->oneLevel1;
  195. $level2 = $level1->level2[0];
  196. // $test->oneLevel1->level2[0] is available
  197. $this->assertEquals('test level2 #1', $level2->name);
  198. // remove all level2 from level1
  199. $level1->level2->clear();
  200. $this->dm->flush();
  201. $this->dm->clear();
  202. // verify that level1 has no more level2
  203. $this->assertEquals(0, $level1->level2->count());
  204. // retrieve test
  205. $test = $this->dm->createQueryBuilder(get_class($test))
  206. ->field('id')->equals($test->id)
  207. ->getQuery()
  208. ->getSingleResult();
  209. $level1 = $test->oneLevel1;
  210. // verify that level1 has no more level2
  211. $this->assertEquals(0, $level1->level2->count());
  212. }
  213. public function testPostRemoveEventOnDeepEmbeddedManyDocument()
  214. {
  215. // create a test document
  216. $test = new EmbeddedTestLevel0b();
  217. $test->name = 'embedded test';
  218. // embed one level1 in test
  219. $level1 = new EmbeddedTestLevel1();
  220. $level1->name = 'test level1 #1';
  221. $test->oneLevel1 = $level1;
  222. // embed one level2 in level1
  223. $level2 = new EmbeddedTestLevel2();
  224. $level2->name = 'test level2 #1';
  225. $level1->level2[] = $level2;
  226. // persist test
  227. $this->dm->persist($test);
  228. $this->dm->flush();
  229. $this->dm->clear();
  230. // retrieve test
  231. $test = $this->dm->createQueryBuilder(get_class($test))
  232. ->field('id')->equals($test->id)
  233. ->getQuery()
  234. ->getSingleResult();
  235. $level1 = $test->oneLevel1;
  236. $level2 = $level1->level2[0];
  237. // $test->oneLevel1->level2[0] is available
  238. $this->assertEquals('test level2 #1', $level2->name);
  239. // remove all level2 from level1
  240. $level1->level2->clear();
  241. $this->dm->flush();
  242. // verify that level2 lifecycle callbacks have been called
  243. $this->assertTrue($level2->preRemove, 'the removed embedded document executed the PreRemove lifecycle callback');
  244. $this->assertTrue($level2->postRemove, 'the removed embedded document executed the PostRemove lifecycle callback');
  245. }
  246. public function testEmbeddedLoadEvents()
  247. {
  248. // create a test document
  249. $test = new EmbeddedTestLevel0b();
  250. $test->name = 'embedded test';
  251. $level1 = new EmbeddedTestLevel1();
  252. $level1->name = 'test level1 #1';
  253. $test->oneLevel1 = $level1;
  254. $level2 = new EmbeddedTestLevel2();
  255. $level2->name = 'test level2 #1';
  256. $level1->level2[] = $level2;
  257. $this->dm->persist($test);
  258. $this->dm->flush();
  259. $this->dm->clear();
  260. $test = $this->dm->createQueryBuilder(get_class($test))
  261. ->field('id')->equals($test->id)
  262. ->getQuery()
  263. ->getSingleResult();
  264. $level1 = $test->oneLevel1;
  265. $level2 = $level1->level2[0];
  266. $this->assertTrue($level1->preLoad);
  267. $this->assertTrue($level1->postLoad);
  268. $this->assertTrue($level2->preLoad);
  269. $this->assertTrue($level2->postLoad);
  270. }
  271. public function testEmbeddedDocumentChangesParent()
  272. {
  273. $address = new Address();
  274. $address->setAddress('6512 Mercomatic Ct.');
  275. $user = new User();
  276. $user->setUsername('jwagettt');
  277. $user->setAddress($address);
  278. $this->dm->persist($user);
  279. $this->dm->flush();
  280. $this->dm->clear();
  281. $user = $this->dm->find('Documents\User', $user->getId());
  282. $this->assertNotNull($user);
  283. $address = $user->getAddress();
  284. $address->setAddress('changed');
  285. $this->dm->flush();
  286. $this->dm->clear();
  287. $user = $this->dm->find('Documents\User', $user->getId());
  288. $this->assertEquals('changed', $user->getAddress()->getAddress());
  289. }
  290. public function testRemoveEmbeddedDocument()
  291. {
  292. $address = new Address();
  293. $address->setAddress('6512 Mercomatic Ct.');
  294. $user = new User();
  295. $user->setUsername('jwagettt');
  296. $user->setAddress($address);
  297. $user->addPhonenumber(new Phonenumber('6155139185'));
  298. $user->addPhonenumber(new Phonenumber('6155139185'));
  299. $this->dm->persist($user);
  300. $this->dm->flush();
  301. $user->removeAddress();
  302. $user->getPhonenumbers()->remove(0);
  303. $user->getPhonenumbers()->remove(1);
  304. $this->dm->flush();
  305. $check = $this->dm->getDocumentCollection('Documents\User')->findOne();
  306. $this->assertEmpty($check['phonenumbers']);
  307. $this->assertFalse(isset($check['address']));
  308. }
  309. public function testRemoveAddDeepEmbedded()
  310. {
  311. $vhost = new VirtualHost();
  312. $directive1 = new VirtualHostDirective('DirectoryIndex', 'index.php');
  313. $vhost->getVHostDirective()->addDirective($directive1);
  314. $directive2 = new VirtualHostDirective('Directory', '/var/www/html');
  315. $directive2->addDirective(new VirtualHostDirective('AllowOverride','All'));
  316. $vhost->getVHostDirective()->addDirective($directive2);
  317. $directive3 = new VirtualHostDirective('Directory', '/var/www/html');
  318. $directive3->addDirective(new VirtualHostDirective('RewriteEngine','on'));
  319. $vhost->getVHostDirective()->addDirective($directive3);
  320. $this->dm->persist($vhost);
  321. $this->dm->flush();
  322. $vhost->getVHostDirective()->removeDirective($directive2);
  323. $directive4 = new VirtualHostDirective('Directory', '/var/www/html');
  324. $directive4->addDirective(new VirtualHostDirective('RewriteEngine','on'));
  325. $vhost->getVHostDirective()->addDirective($directive4);
  326. $this->dm->flush();
  327. $this->dm->clear();
  328. $vhost = $this->dm->find('Documents\Functional\VirtualHost', $vhost->getId());
  329. foreach($vhost->getVHostDirective()->getDirectives() as $directive)
  330. {
  331. $this->assertNotEmpty($directive->getName());
  332. }
  333. }
  334. }