Source of file PublishableSiteTreeTest.php
Size: 9,188 Bytes - Last Modified: 2021-12-23T10:34:48+00:00
/var/www/docs.ssmods.com/process/src/tests/php/PublishableSiteTreeTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 | <?php namespace SilverStripe\StaticPublishQueue\Test; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Core\Injector\Injector; use SilverStripe\Dev\SapphireTest; use SilverStripe\ORM\ArrayList; use SilverStripe\StaticPublishQueue\Extension\Engine\SiteTreePublishingEngine; use SilverStripe\StaticPublishQueue\Extension\Publishable\PublishableSiteTree; use SilverStripe\StaticPublishQueue\Test\PublishableSiteTreeTest\Model\PublishablePage; class PublishableSiteTreeTest extends SapphireTest { protected $usesDatabase = true; protected static $required_extensions = [ SiteTree::class => [ PublishableSiteTree::class, ], ]; protected static $extra_dataobjects = [ PublishablePage::class, ]; public function testObjectsToUpdateOnURLSegmentChange() { $this->setExpectedFlushChangesOutput([ [[], ['stub/']], [['stub/'], []], [[], ['stub-a-lub-a-dub-dub/']], ]); $page = new PublishablePage; $page->URLSegment = 'stub'; // publish the page $page->write(); $page->publishRecursive(); // change the URL and go again $page->URLSegment = 'stub-a-lub-a-dub-dub'; $page->write(); $page->publishRecursive(); } public function testObjectsToUpdateOnURLSegmentChangeWithParents() { $this->setExpectedFlushChangesOutput([ [[], ['parent/']], [[], ['parent/stub/', 'parent/']], [['parent/stub/'], ['parent/']], [[], ['parent/stub-a-lub-a-dub-dub/', 'parent/']] ]); $parent = new PublishablePage; $parent->URLSegment = 'parent'; $parent->write(); $parent->publishRecursive(); $page = new PublishablePage; $page->URLSegment = 'stub'; $page->ParentID = $parent->ID; // publish the page $page->write(); $page->publishRecursive(); // change the URL and go again $page->URLSegment = 'stub-a-lub-a-dub-dub'; $page->write(); $page->publishRecursive(); } public function testObjectsToUpdateOnSiteTreeRearrange() { $this->setExpectedFlushChangesOutput([ [[], ['parent/']], [[], ['parent/stub/', 'parent/']], [['parent/stub/'], ['parent/']], [[], ['stub/']], [['stub/'], []], [[], ['parent/stub/', 'parent/']], ]); $parent = new PublishablePage; $parent->URLSegment = 'parent'; $parent->write(); $parent->publishRecursive(); $page = new PublishablePage; $page->URLSegment = 'stub'; $page->ParentID = $parent->ID; // publish the page $page->write(); $page->publishRecursive(); // move to root $page->ParentID = 0; $page->write(); $page->publishRecursive(); // move back $page->ParentID = $parent->ID; $page->write(); $page->publishRecursive(); } public function testObjectsToUpdateOnPublish() { $parent = new PublishablePage; $stub = $this->getMockBuilder(PublishablePage::class) ->setMethods( [ 'getParentID', 'Parent', ] )->getMock(); $stub->expects($this->once()) ->method('getParentID') ->will($this->returnValue('2')); $stub->expects($this->once()) ->method('Parent') ->will($this->returnValue($parent)); $objects = $stub->objectsToUpdate(['action' => 'publish']); $this->assertContains($stub, $objects); $this->assertContains($parent, $objects); $this->assertCount(2, $objects); } public function testObjectsToUpdateOnUnpublish() { $parent = new PublishablePage; $stub = $this->getMockBuilder(PublishablePage::class) ->setMethods( [ 'getParentID', 'Parent', ] )->getMock(); $stub->expects($this->once()) ->method('getParentID') ->will($this->returnValue('2')); $stub->expects($this->once()) ->method('Parent') ->will($this->returnValue($parent)); $updates = $stub->objectsToUpdate(['action' => 'unpublish']); $deletions = $stub->objectsToDelete(['action' => 'unpublish']); $this->assertContains($stub, $deletions); $this->assertNotContains($parent, $deletions); $this->assertContains($parent, $updates); $this->assertNotContains($stub, $updates); $this->assertCount(1, $deletions); $this->assertCount(1, $updates); } public function testObjectsToDeleteOnPublish() { $stub = new PublishablePage; $objects = $stub->objectsToDelete(['action' => 'publish']); $this->assertEmpty($objects); } public function testObjectsToDeleteOnUnpublish() { $stub = new PublishablePage; $stub->Title = 'stub'; $objects = $stub->objectsToDelete(['action' => 'unpublish']); $this->assertContains($stub, $objects); $this->assertCount(1, $objects); } public function testObjectsToUpdateOnPublishIfVirtualExists() { $redir = new PublishablePage; $stub = $this->getMockBuilder(PublishablePage::class) ->setMethods(['getMyVirtualPages']) ->getMock(); $stub->expects($this->once()) ->method('getMyVirtualPages') ->will( $this->returnValue( new ArrayList([$redir]) ) ); $objects = $stub->objectsToUpdate(['action' => 'publish']); $this->assertContains($stub, $objects); $this->assertContains($redir, $objects); $this->assertCount(2, $objects); } public function testObjectsToDeleteOnUnpublishIfVirtualExists() { $redir = new PublishablePage; $stub = $this->getMockBuilder(PublishablePage::class) ->setMethods(['getMyVirtualPages']) ->getMock(); $stub->Title = 'stub'; $stub->expects($this->once()) ->method('getMyVirtualPages') ->will( $this->returnValue( new ArrayList([$redir]) ) ); $objects = $stub->objectsToDelete(['action' => 'unpublish']); $this->assertContains($stub, $objects); $this->assertContains($redir, $objects); $this->assertCount(2, $objects); } /** * Takes in a map of urls we expect to be deleted and updated on each successive flushChanges call * [ * [['deleted'], ['updated']], // first time its called * [['deleted'], ['updated']], // second time its called * ] * @param $map */ protected function setExpectedFlushChangesOutput($map) { // build a mock of the extension overriding flushChanges to prevent writing to the queue $mockExtension = $this->getMockBuilder(SiteTreePublishingEngine::class) ->setMethods(['flushChanges']) ->getMock(); // IF YOU'RE OF A NERVOUS DISPOSITION, LOOK AWAY NOW // stub the flushChanges method and make sure that each call is able to assert the correct items are in the $mockExtension ->expects($this->exactly(count($map))) ->method('flushChanges') ->willReturnOnConsecutiveCalls(...$this->transformMapToCallback($map, $mockExtension)); // register our extension instance so it's applied to all SiteTree objects Injector::inst()->registerService($mockExtension, SiteTreePublishingEngine::class); } /** * Transforms the array [['deleted'], ['updated']] into callbacks with assertions * @param $map * @param $mockExtension * @return array */ protected function transformMapToCallback($map, $mockExtension) { $getURL = function ($value) { return $value->RelativeLink(); }; $callbacks = []; $count = 0; foreach ($map as $urls) { ++$count; list($toDelete, $toUpdate) = $urls; $callbacks[] = new \PHPUnit_Framework_MockObject_Stub_ReturnCallback( function () use ($toDelete, $toUpdate, $mockExtension, $getURL, $count) { $this->assertSame( $toDelete, array_map($getURL, $mockExtension->getToDelete()), 'Failed on delete, iteration ' . $count ); $mockExtension->setToDelete([]); $this->assertSame( $toUpdate, array_map($getURL, $mockExtension->getToUpdate()), 'Failed on update, iteration ' . $count ); $mockExtension->setToUpdate([]); } ); } return $callbacks; } } |