pastebin

Paste Search Dynamic
Recent pastes
relationships manyHasMany
  1. <?php declare(strict_types = 1);
  2.  
  3. /**
  4.  * @testCase
  5.  * @dataProvider ../../../sections.ini
  6.  */
  7.  
  8. namespace NextrasTestsOrmIntegrationRelationships;
  9.  
  10. use NextrasOrmCollectionICollection;
  11. use NextrasTestsOrmBook;
  12. use NextrasTestsOrmDataTestCase;
  13. use NextrasTestsOrmHelper;
  14. use NextrasTestsOrmTag;
  15. use NextrasTestsOrmUser;
  16. use TesterAssert;
  17. use TesterEnvironment;
  18.  
  19.  
  20. $dic = require_once __DIR__ . '/../../../bootstrap.php';
  21.  
  22.  
  23. class RelationshipManyHasManyTest extends DataTestCase
  24. {
  25.         public function testCache()
  26.         {
  27.                 $book = $this->orm->books->getById(1);
  28.  
  29.                 $collection = $book->tags->get()->findBy(['name!=' => 'Tag 1'])->orderBy('id');
  30.                 assert::equal(1, $collection->count());
  31.                 assert::equal(1, $collection->countStored());
  32.                 assert::equal('Tag 2', $collection->fetch()->name);
  33.  
  34.                 $collection = $book->tags->get()->findBy(['name!=' => 'Tag 3'])->orderBy('id');
  35.                 assert::equal(2, $collection->count());
  36.                 assert::equal(2, $collection->countStored());
  37.                 assert::equal('Tag 1', $collection->fetch()->name);
  38.                 assert::equal('Tag 2', $collection->fetch()->name);
  39.         }
  40.  
  41.  
  42.         public function testLimit()
  43.         {
  44.                 $book = $this->orm->books->getById(1);
  45.                 $book->tags->add(3);
  46.                 $this->orm->books->persistAndFlush($book);
  47.  
  48.                 /** @var Book[] $books */
  49.                 $books = $this->orm->books->findAll()->orderBy('id');
  50.  
  51.                 $tags = [];
  52.                 $counts = [];
  53.                 $countsStored = [];
  54.                 foreach ($books as $book) {
  55.                         $limitedTags = $book->tags->get()->limitBy(2)->orderBy('name', ICollection::DESC);
  56.                         foreach ($limitedTags as $tag) {
  57.                                 $tags[] = $tag->id;
  58.                         }
  59.                         $counts[] = $limitedTags->count();
  60.                         $countsStored[] = $limitedTags->countStored();
  61.                 }
  62.  
  63.                 assert::same([3, 2, 3, 2, 3], $tags);
  64.                 assert::same([2, 2, 1, 0], $counts);
  65.                 assert::same([2, 2, 1, 0], $countsStored);
  66.         }
  67.  
  68.  
  69.         public function testEmptyPreloadContainer()
  70.         {
  71.                 /** @var Book[] $books */
  72.                 $books = $this->orm->books->findAll()->orderBy('id');
  73.                 $tags = [];
  74.  
  75.                 foreach ($books as $book) {
  76.                         $book->setPreloadContainer(null);
  77.                         foreach ($book->tags->get()->orderBy('name') as $tag) {
  78.                                 $tags[] = $tag->id;
  79.                         }
  80.                 }
  81.  
  82.                 assert::same([1, 2, 2, 3, 3], $tags);
  83.         }
  84.  
  85.  
  86.         public function testRemove()
  87.         {
  88.                 $book = $this->orm->books->getById(1);
  89.                 $tag = $this->orm->tags->getById(1);
  90.                 $book->tags->remove($tag);
  91.                 $this->orm->books->persistAndFlush($book);
  92.  
  93.                 assert::same(1, $book->tags->count());
  94.                 assert::same(1, $book->tags->countStored());
  95.         }
  96.  
  97.  
  98.         public function testCollectionCountWithLimit()
  99.         {
  100.                 $book = $this->orm->books->getById(1);
  101.                 $collection = $book->tags->get();
  102.                 $collection = $collection->orderBy('id')->limitBy(1, 1);
  103.                 assert::same(1, $collection->count());
  104.         }
  105.  
  106.  
  107.         public function testRawValue()
  108.         {
  109.                 $book = $this->orm->books->getById(1);
  110.                 assert::same([1, 2], $book->tags->getRawValue());
  111.  
  112.                 $book->tags->remove(1);
  113.                 assert::same([2], $book->tags->getRawValue());
  114.  
  115.                 $tag = new Tag();
  116.                 $tag->name = 'Test tag';
  117.                 $tag->books->add($book);
  118.  
  119.                 assert::same([2], $book->tags->getRawValue());
  120.  
  121.                 $this->orm->tags->persistAndFlush($tag);
  122.  
  123.                 assert::same([2, 4], $book->tags->getRawValue());
  124.  
  125.                 $book->tags->setRawValue([]);
  126.                 assert::same([], $book->tags->getRawValue());
  127.  
  128.                 $this->orm->tags->persistAndFlush($tag);
  129.  
  130.                 assert::same([], $book->tags->getRawValue());
  131.         }
  132.  
  133.  
  134.         public function testCaching()
  135.         {
  136.                 $book = $this->orm->books->getById(1);
  137.                 $tags = $book->tags->get()->findBy(['name' => 'Tag 1']);
  138.                 assert::same(1, $tags->count());
  139.  
  140.                 $tag = $tags->fetch();
  141.                 $tag->name = 'XXX';
  142.                 $this->orm->tags->persistAndFlush($tag);
  143.  
  144.                 $tags = $book->tags->get()->findBy(['name' => 'Tag 1']);
  145.                 assert::same(0, $tags->count());
  146.         }
  147.  
  148.  
  149.         public function testCachingPreload()
  150.         {
  151.                 // init caches
  152.                 $books = $this->orm->books->findAll();
  153.                 foreach ($books as $book) {
  154.                         iterator_to_array($book->tags);
  155.                 }
  156.  
  157.                 $book = $this->orm->books->getById(2);
  158.  
  159.                 assert::false($book->tags->has(1));
  160.                 assert::true($book->tags->has(2));
  161.                 assert::true($book->tags->has(3));
  162.                 assert::false($book->tags->has(4));
  163.         }
  164.  
  165.  
  166.         public function testIsModified()
  167.         {
  168.                 $tag = new Tag('A');
  169.                 $book = $this->orm->books->getById(1);
  170.                 $book->tags->add($tag);
  171.  
  172.                 assert::true($book->tags->isModified());
  173.                 assert::true($tag->books->isModified());
  174.  
  175.                 $tag = $this->orm->tags->getById(1);
  176.                 $book->tags->remove($tag);
  177.  
  178.                 assert::true($book->tags->isModified());
  179.                 assert::true($tag->books->isModified());
  180.         }
  181.  
  182.  
  183.         public function testSelfReferencing()
  184.         {
  185.                 if ($this->section === Helper::SECTION_MSSQL) {
  186.                         // An explicit value for the identity column in table 'users' can only be specified when a column list is used and IDENTITY_INSERT is ON.
  187.                         // http://stackoverflow.com/questions/2148091/syntax-for-inserting-into-a-table-with-no-values
  188.                         Environment::skip('Inserting dummy rows when no arguments are passed is not supported.');
  189.                 }
  190.  
  191.                 $userA = new User();
  192.                 $this->orm->persistAndFlush($userA);
  193.  
  194.                 $userB = new User();
  195.                 $userB->myFriends->add($userA);
  196.  
  197.                 $this->orm->persistAndFlush($userB);
  198.                 assert::same(1, $userA->friendsWithMe->count());
  199.                 assert::same(0, $userA->myFriends->count());
  200.         }
  201.  
  202.  
  203.         public function testRepeatedPersisting()
  204.         {
  205.                 $tagA = new Tag('A');
  206.                 $tagB = new Tag('B');
  207.  
  208.                 $book = $this->orm->books->getById(1);
  209.                 $book->tags->add($tagA);
  210.                 $book->tags->add($tagB);
  211.  
  212.                 $this->orm->persistAndFlush($book);
  213.                 assert::false($tagA->isModified());
  214.                 assert::false($tagB->isModified());
  215.  
  216.                 $tagA->name = 'X';
  217.                 $this->orm->persistAndFlush($book);
  218.                 assert::false($tagA->isModified());
  219.                 assert::false($tagB->isModified());
  220.         }
  221.  
  222.  
  223.         public function testCountStoredOnManyToManyCondition()
  224.         {
  225.                 $books = $this->orm->books->findBy(['this->tags->name' => 'Tag 2']);
  226.                 assert::same(2, $books->countStored());
  227.         }
  228. }
  229.  
  230.  
  231. $test = new RelationshipManyHasManyTest($dic);
  232. $test->run();
  233. ?>
Parsed in 0.256 seconds