/** * @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()); }
/** * @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'); }
/** * @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)); }
/** * @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()); }