Example #1
0
 /**
  * @dataProvider entityManagerDataProvider
  * @param EntityManager $em
  */
 public function testQuery(EntityManager $em)
 {
     $a = new SluggedArticle();
     $a->setId(1)->setName("Article A")->setSlug("article-alpha");
     $b = new SluggedArticle();
     $b->setId(2)->setName("Article B")->setSlug("article-bravo");
     $c = new SluggedArticle();
     $c->setId(3)->setName("Document C")->setSlug("article-charlie");
     $d = new SluggedArticle();
     $d->setId(4)->setName("Document D")->setSlug("article-almost-alpha");
     $em->persist($a)->persist($b)->persist($c)->persist($d)->flush();
     $result = $em->indexedQuery(new IndexedQuery(SluggedArticle::class, ['slug' => 'article-al*']));
     $this->assertCount(2, $result);
     $names = ['Article A', 'Document D'];
     $count = 0;
     foreach ($result as $entity) {
         $this->assertContains($entity->getName(), $names);
         $count++;
         $names = array_diff($names, [$entity->getName()]);
     }
     $this->assertEquals(2, $count);
     $result = $em->indexedQuery(new IndexedQuery(SluggedArticle::class, ['slug' => 'article-al*', 'name' => 'Docu*']));
     $this->assertCount(1, $result);
     $ids = $result->getIdList();
     $this->assertCount(1, $ids);
     $this->assertEquals('4', $ids[0]);
     $entity = $result->getEntityById('4');
     $this->assertEquals('Document D', $entity->getName());
 }
Example #2
0
 /**
  * @dataProvider entityManagerDataProvider
  * @param EntityManager $em
  */
 public function testIndexDeletion(EntityManager $em)
 {
     $article = new SluggedArticle();
     $article->setId(94)->setName('Mr Article')->setSlug('mr-article');
     $em->persist($article)->flush();
     /** @var SluggedArticle $mr_article */
     $mr_article = $em->retrieveByIndex(SluggedArticle::class, 'slug', 'mr-article');
     $this->assertEquals('Mr Article', $mr_article->getName());
     $mr_article->setSlug('mrarticle');
     $em->persist($mr_article)->flush();
     // Index should no longer exist
     $this->setExpectedException(NotFoundException::class);
     $em->retrieveByIndex(SluggedArticle::class, 'slug', 'mr-article');
 }
Example #3
0
 /**
  * @dataProvider entityManagerDataProvider
  * @param EntityManager $em
  */
 public function testDeleteIndices(EntityManager $em)
 {
     $article = new SluggedArticle();
     $article->setId(401)->setName('slugged article')->setSlug('some-slug');
     $em->persist($article)->flush();
     $this->assertTrue($this->exists($em, 'slugged_article', '401'));
     $this->assertEquals('401', $em->getDriver()->getSingleValueIndex($this->getIndexKey($em, 'slugged_article', 'slug', 'some-slug')));
     $this->assertEquals('401', $em->getDriver()->getSingleValueIndex($this->getIndexKey($em, 'slugged_article', 'name', 'slugged article')));
     $em->delete($article)->flush();
     $this->assertFalse($this->exists($em, 'slugged_article', '401'));
     $key = $this->getIndexKey($em, 'slugged_article', 'slug', 'some-slug');
     $this->assertNull($em->getDriver()->getSingleValueIndex($key));
     $key = $this->getIndexKey($em, 'slugged_article', 'name', 'slugged article');
     $this->assertNull($em->getDriver()->getSingleValueIndex($key));
 }
Example #4
0
 /**
  * @dataProvider entityManagerDataProvider
  * @param EntityManager $em
  */
 public function testRebuildIndex(EntityManager $em)
 {
     // Create an article with a slug
     $article = new SluggedArticle();
     $article->setId(8343)->setName('foo')->setSlug('bar');
     $em->persist($article)->flush();
     // Confirm slug works
     /** @var SluggedArticle $article */
     $article = $em->retrieveByIndex(SluggedArticle::class, 'slug', 'bar', false);
     $this->assertEquals('foo', $article->getName());
     $index = $em->getMapper()->getEntityMetadata($article)->getIndexByName('slug');
     // Corrupt the slug, two steps required:
     // 1. Set a new slug
     $em->getDriver()->setSingleValueIndex($em->getKeyScheme()->getIndexKey($index, 'evil'), $article->getId());
     // 2. Remove the correct slug
     $em->getDriver()->clearSingleValueIndex($em->getKeyScheme()->getIndexKey($index, 'bar'));
     $em->getDriver()->flush();
     // Confirm old slug no longer works
     try {
         $em->retrieveByIndex(SluggedArticle::class, 'slug', 'bar', false);
         $this->fail('Old index succeeded');
     } catch (NotFoundException $e) {
     }
     // Confirm new slug does work
     $article = $em->retrieveByIndex(SluggedArticle::class, 'slug', 'evil', false);
     $this->assertEquals('foo', $article->getName());
     // Run maintenance over the table, this should correct the slug
     $maintenance = new Maintenance($em);
     $maintenance->rebuild(SluggedArticle::class);
     // Confirm correct slug works
     $article = $em->retrieveByIndex(SluggedArticle::class, 'slug', 'bar', false);
     $this->assertEquals('foo', $article->getName());
     // The corrupted slug should still work, this is unideal, but there is no reference to it for the maintenance
     // service to know to remove it
     $article = $em->retrieveByIndex(SluggedArticle::class, 'slug', 'evil', false);
     $this->assertEquals('foo', $article->getName());
 }