Source of file TopPageTest.php
Size: 10,885 Bytes - Last Modified: 2021-12-24T06:44:48+00:00
/var/www/docs.ssmods.com/process/src/tests/TopPage/TopPageTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333 | <?php namespace DNADesign\Elemental\Tests\TopPage; use DNADesign\Elemental\Extensions\ElementalAreasExtension; use DNADesign\Elemental\Extensions\ElementalPageExtension; use DNADesign\Elemental\Models\BaseElement; use DNADesign\Elemental\Models\ElementalArea; use DNADesign\Elemental\TopPage; use Page; use SilverStripe\Dev\SapphireTest; use SilverStripe\ORM\DataObject; class TopPageTest extends SapphireTest { /** * @var string */ protected static $fixture_file = 'TopPageTest.yml'; /** * @var array */ protected static $required_extensions = [ TestBlockPage::class => [ ElementalPageExtension::class, ], TestChildPage::class => [ ElementalPageExtension::class, ], Page::class => [ TopPage\SiteTreeExtension::class, ], ElementalArea::class => [ TopPage\DataExtension::class, ], BaseElement::class => [ TopPage\DataExtension::class, ], TestList::class => [ ElementalAreasExtension::class, ], ]; /** * @var array */ protected static $extra_dataobjects = [ TestContent::class, TestList::class, TestBlockPage::class, TestChildPage::class, ]; /** * @param string $pageIdentifier * @param string $pageClass * @param string $objectIdentifier * @param string $objectClass * @dataProvider objectsProvider */ public function testTestGetTopPage( string $pageIdentifier, string $pageClass, string $objectIdentifier, string $objectClass ): void { /** @var Page|TopPage\SiteTreeExtension $content */ $page = $this->objFromFixture($pageClass, $pageIdentifier); /** @var DataObject|TopPage\DataExtension $object */ $object = $this->objFromFixture($objectClass, $objectIdentifier); $topPage = $object->getTopPage(); $this->assertNotNull($topPage); $this->assertEquals((int) $page->ID, (int) $topPage->ID); } /** * @param string $pageIdentifier * @param string $pageClass * @param string $objectIdentifier * @param string $objectClass * @dataProvider objectsProvider */ public function testTestUpdateTopPageEmptyCache( string $pageIdentifier, string $pageClass, string $objectIdentifier, string $objectClass ): void { /** @var TopPage\DataExtension $extension */ $extension = singleton(TopPage\DataExtension::class); $extension->withTopPageUpdate( true, function () use ($pageIdentifier, $pageClass, $objectIdentifier, $objectClass): void { /** @var Page|TopPage\SiteTreeExtension $content */ $page = $this->objFromFixture($pageClass, $pageIdentifier); /** @var DataObject|TopPage\DataExtension $object */ $object = $this->objFromFixture($objectClass, $objectIdentifier); $this->assertEquals(0, (int) $object->TopPageID); $object->forceChange(); $id = $object->write(); $object = DataObject::get($object->ClassName)->byID($id); $this->assertEquals((int) $page->ID, (int) $object->TopPageID); // do a second write to make sure that we won't override existing top page $object->forceChange(); $id = $object->write(); $object = DataObject::get($object->ClassName)->byID($id); $this->assertEquals((int) $page->ID, (int) $object->TopPageID); } ); } public function testNewPage(): void { /** @var TopPage\DataExtension $extension */ $extension = singleton(TopPage\DataExtension::class); $extension->withTopPageUpdate( true, function (): void { $page = TestBlockPage::create(); $page->Title = 'New page test'; $page->write(); /** @var ElementalArea|TopPage\DataExtension $area */ $area = $page->ElementalArea(); $this->assertEquals((int) $page->ID, (int) $area->TopPageID); } ); } /** * @param bool $populateTopPage * @dataProvider populateTopPageProvider */ public function testNewBlock(bool $populateTopPage): void { /** @var TopPage\DataExtension $extension */ $extension = singleton(TopPage\DataExtension::class); $extension->withTopPageUpdate( true, function () use ($populateTopPage): void { if ($populateTopPage) { $this->populateTopPageForAllObjects(); } /** @var TestBlockPage $page */ $page = $this->objFromFixture(TestBlockPage::class, 'block-page1'); /** @var ElementalArea $area */ $area = $this->objFromFixture(ElementalArea::class, 'area3'); /** @var TestContent|TopPage\DataExtension $content */ $content = TestContent::create(); $content->Title = 'Fresh block'; $area->Elements()->add($content); $content = DataObject::get($content->ClassName)->byID($content->ID); $this->assertEquals((int) $page->ID, (int) $content->TopPageID); } ); } /** * This test is checking for page duplication in two cases * Case 1: standard duplication * Case 2: duplication with a fixed page setting * The seconds case shows that it's possible to use the withFixedTopPage to set the top page to arbitrary value * and completely bypass page determination logic * This is needed in some edge cases were automatic determination is not possible due to the object not being * assigned to the parent object at the time of duplication but rather later * * @param int $fixedPageID * @dataProvider fixedPagesProvider */ public function testPageDuplication(int $fixedPageID): void { /** @var TopPage\DataExtension $extension */ $extension = singleton(TopPage\DataExtension::class); $extension->withFixedTopPage($fixedPageID, function () use ($extension, $fixedPageID) { $extension->withTopPageUpdate( true, function () use ($fixedPageID): void { $this->populateTopPageForAllObjects(); /** @var TestBlockPage $page */ $page = $this->objFromFixture(TestBlockPage::class, 'block-page1'); /** @var TestChildPage $childPage */ $childPage = $this->objFromFixture(TestChildPage::class, 'child-page1'); $page->duplicate(); $pages = TestBlockPage::get()->filter(['Title' => 'BlockPage1'])->sort('ID', 'DESC'); $this->assertCount(2, $pages); $pageClone = $pages->first(); $childPages = TestChildPage::get()->filter(['Title' => 'ChildPage1'])->sort('ID', 'DESC'); $this->assertCount(2, $childPages); $childClone = $childPages->first(); $this->assertNotEquals((int) $childPage->ID, (int) $childClone->ID); $objects = [ [TestList::class, 'List1', $pageClone], [TestContent::class, 'Content1', $pageClone], [TestList::class, 'List2', $childClone], [TestContent::class, 'Content2', $childClone], ]; foreach ($objects as $objectData) { $class = array_shift($objectData); $title = array_shift($objectData); $page = array_shift($objectData); $items = DataObject::get($class)->filter(['Title' => $title])->sort('ID', 'DESC'); $this->assertCount(2, $items); /** @var DataObject|TopPage\DataExtension $objectClone */ $objectClone = $items->first(); $expected = $fixedPageID ?: (int) $page->ID; $this->assertEquals($expected, (int) $objectClone->TopPageID); /** @var ElementalArea|TopPage\DataExtension $area */ $area = $objectClone->Parent(); $this->assertEquals($expected, (int) $area->TopPageID); } } ); }); } public function objectsProvider(): array { return [ [ 'block-page1', TestBlockPage::class, 'content1', TestContent::class, ], [ 'block-page1', TestBlockPage::class, 'list1', TestList::class, ], [ 'block-page1', TestBlockPage::class, 'area1', ElementalArea::class, ], [ 'block-page1', TestBlockPage::class, 'area3', ElementalArea::class, ], [ 'child-page1', TestChildPage::class, 'content2', TestContent::class, ], [ 'child-page1', TestChildPage::class, 'list2', TestList::class, ], [ 'child-page1', TestChildPage::class, 'area2', ElementalArea::class, ], [ 'child-page1', TestChildPage::class, 'area4', ElementalArea::class, ], ]; } public function populateTopPageProvider(): array { return [ [true], [false], ]; } public function fixedPagesProvider(): array { return [ [0], // feature is disabled [99], // obviously non-existent page ]; } private function populateTopPageForAllObjects(): void { $list = $this->objectsProvider(); foreach ($list as $objects) { array_shift($objects); array_shift($objects); $identifier = array_shift($objects); $class = array_shift($objects); $object = $this->objFromFixture($class, $identifier); $object->forceChange(); $object->write(); } } } |