Source of file ModelAsControllerTest.php
Size: 12,062 Bytes - Last Modified: 2021-12-23T10:28:18+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Controllers/ModelAsControllerTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 | <?php namespace SilverStripe\CMS\Tests\Controllers; use SilverStripe\Versioned\Versioned; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\CMS\Controllers\OldPageRedirector; use SilverStripe\CMS\Controllers\RootURLController; use SilverStripe\Core\Config\Config; use SilverStripe\Control\Director; use SilverStripe\Control\Controller; use SilverStripe\Dev\FunctionalTest; use Page; use SilverStripe\View\Parsers\URLSegmentFilter; class ModelAsControllerTest extends FunctionalTest { protected $usesDatabase = true; protected $autoFollowRedirection = false; /** * New tests require nested urls to be enabled, but the site might not * support nested URLs. * This setup will enable nested-urls for this test and resets the state * after the tests have been performed. */ protected function setUp(): void { parent::setUp(); Config::modify()->set(SiteTree::class, 'nested_urls', true); } protected function generateNestedPagesFixture() { $level1 = new Page(); $level1->Title = 'First Level'; $level1->URLSegment = 'level1'; $level1->write(); $level1->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $level1->URLSegment = 'newlevel1'; $level1->write(); $level1->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $level2 = new Page(); $level2->Title = 'Second Level'; $level2->URLSegment = 'level2'; $level2->ParentID = $level1->ID; $level2->write(); $level2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $level2->URLSegment = 'newlevel2'; $level2->write(); $level2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $level3 = new Page(); $level3->Title = "Level 3"; $level3->URLSegment = 'level3'; $level3->ParentID = $level2->ID; $level3->write(); $level3->copyVersionToStage('Stage', 'Live'); $level3->URLSegment = 'newlevel3'; $level3->write(); $level3->copyVersionToStage('Stage', 'Live'); } /** * We're building up a page hierarchy ("nested URLs") and rename * all the individual pages afterwards. The assumption is that * all pages will be found by their old segments. * * NOTE: This test requires nested_urls * * Original: level1/level2/level3 * Republished as: newlevel1/newlevel2/newlevel3 */ public function testRedirectsNestedRenamedPages() { $this->generateNestedPagesFixture(); // check a first level URLSegment $response = $this->get('level1/action'); $this->assertEquals($response->getStatusCode(), 301); $this->assertEquals( Controller::join_links(Director::baseURL() . 'newlevel1/action'), $response->getHeader('Location') ); // check second level URLSegment $response = $this->get('newlevel1/level2'); $this->assertEquals($response->getStatusCode(), 301); $this->assertEquals( Controller::join_links(Director::baseURL() . 'newlevel1/newlevel2/'), $response->getHeader('Location') ); // check third level URLSegment $response = $this->get('newlevel1/newlevel2/level3'); $this->assertEquals($response->getStatusCode(), 301); $this->assertEquals( Controller::join_links(Director::baseURL() . 'newlevel1/newlevel2/newlevel3/'), $response->getHeader('Location') ); $response = $this->get('newlevel1/newlevel2/level3'); } /** * Test that the redirect works even with a lot of nested pages * Original: /oldurl/level2/level3/level4/level5 * New: /newurl/level2/level3/level4/level5 */ public function testHeavilyNestedRenamedRedirectedPages() { $page = new Page(); $page->Title = 'First Level'; $page->URLSegment = 'oldurl'; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page->URLSegment = 'newurl'; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page2 = new Page(); $page2->Title = 'Second Level Page'; $page2->URLSegment = 'level2'; $page2->ParentID = $page->ID; $page2->write(); $page2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page3 = new Page(); $page3->Title = 'Third Level Page'; $page3->URLSegment = 'level3'; $page3->ParentID = $page2->ID; $page3->write(); $page3->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page4 = new Page(); $page4->Title = 'Fourth Level Page'; $page4->URLSegment = 'level4'; $page4->ParentID = $page3->ID; $page4->write(); $page4->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page5 = new Page(); $page5->Title = 'Fifth Level Page'; $page5->URLSegment = 'level5'; $page5->ParentID = $page4->ID; $page5->write(); $page5->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); // Test that the redirect still works fine when trying to access the most nested page $response = $this->get('oldurl/level2/level3/level4/level5/'); $this->assertEquals($response->getStatusCode(), 301); $this->assertEquals( Controller::join_links(Director::baseURL() . 'newurl/level2/level3/level4/level5/'), $response->getHeader('Location') ); } public function testRedirectionForPreNestedurlsBookmarks() { $this->generateNestedPagesFixture(); // Up-to-date URLs will be redirected to the appropriate subdirectory $response = $this->get('newlevel3'); $this->assertEquals(301, $response->getStatusCode()); $this->assertEquals( Director::baseURL() . 'newlevel1/newlevel2/newlevel3/', $response->getHeader("Location") ); // So will the legacy ones $response = $this->get('level3'); $this->assertEquals(301, $response->getStatusCode()); $this->assertEquals( Director::baseURL() . 'newlevel1/newlevel2/newlevel3/', $response->getHeader("Location") ); } public function testDoesntRedirectToNestedChildrenOutsideOfOwnHierarchy() { $this->generateNestedPagesFixture(); $otherParent = new Page([ 'URLSegment' => 'otherparent' ]); $otherParent->write(); $otherParent->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get('level1/otherparent'); $this->assertEquals($response->getStatusCode(), 301); $response = $this->get('newlevel1/otherparent'); $this->assertEquals( $response->getStatusCode(), 404, 'Requesting an unrelated page on a renamed parent should be interpreted as a missing action, not a redirect' ); } /** * * NOTE: This test requires nested_urls * */ public function testRedirectsNestedRenamedPagesWithGetParameters() { $this->generateNestedPagesFixture(); // check third level URLSegment $response = $this->get('newlevel1/newlevel2/level3/?foo=bar&test=test'); $this->assertEquals($response->getStatusCode(), 301); $this->assertEquals( Controller::join_links(Director::baseURL() . 'newlevel1/newlevel2/newlevel3/', '?foo=bar&test=test'), $response->getHeader('Location') ); } /** * * NOTE: This test requires nested_urls * */ public function testDoesntRedirectToNestedRenamedPageWhenNewExists() { $this->generateNestedPagesFixture(); $otherLevel1 = new Page([ 'Title' => "Other Level 1", 'URLSegment' => 'level1' ]); $otherLevel1->write(); $otherLevel1->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get('level1'); $this->assertEquals( $response->getStatusCode(), 200 ); $response = $this->get('level1/newlevel2'); $this->assertEquals( $response->getStatusCode(), 404, 'The old newlevel2/ URLSegment is checked as an action on the new page, which shouldnt exist.' ); } /** * * NOTE: This test requires nested_urls * */ public function testFindOldPage() { $page = new Page(); $page->Title = 'First Level'; $page->URLSegment = 'oldurl'; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page->URLSegment = 'newurl'; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $url = OldPageRedirector::find_old_page('oldurl'); $matchedPage = SiteTree::get_by_link($url); $this->assertEquals('First Level', $matchedPage->Title); $page2 = new Page(); $page2->Title = 'Second Level Page'; $page2->URLSegment = 'oldpage2'; $page2->ParentID = $page->ID; $page2->write(); $page2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $page2->URLSegment = 'newpage2'; $page2->write(); $page2->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $url = OldPageRedirector::find_old_page('oldpage2', $page2->ParentID); $matchedPage = SiteTree::get_by_link($url); $this->assertEquals('Second Level Page', $matchedPage->Title); $url = OldPageRedirector::find_old_page('oldpage2', $page2->ID); $matchedPage = SiteTree::get_by_link($url); $this->assertEquals(false, $matchedPage); } /** * go to a page that's been published but is child of an unpublished page * * NOTE: This test requires nested_urls */ public function testChildOfDraft() { RootURLController::reset(); Config::modify()->set(SiteTree::class, 'nested_urls', true); $draft = new Page(); $draft->Title = 'Root Leve Draft Page'; $draft->URLSegment = 'root'; $draft->write(); $published = new Page(); $published->Title = 'Published Page Under Draft Page'; $published->URLSegment = 'sub-root'; $published->write(); $published->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get('root/sub-root'); $this->assertEquals( $response->getStatusCode(), 404, 'The page should not be found since its parent has not been published, in this case http://<yousitename>/root/sub-root or http://<yousitename>/sub-root' ); } public function testAllowMultibyte() { Config::modify()->set(URLSegmentFilter::class, 'default_allow_multibyte', true); $parent = new Page(); $parent->Title = 'Multibyte test'; $parent->URLSegment = 'بلاگ'; $parent->write(); $parent->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $child = new Page(); $child->Title = 'Multibyte test'; $child->URLSegment = 'فضة'; $child->ParentID = $parent->ID; $child->write(); $child->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); // Emulate browser behaviour around multibyte URL encodings $response = $this->get(rawurlencode('بلاگ')); $this->assertEquals( $response->getStatusCode(), 200, 'Routes toplevel paths' ); $response = $this->get(join('/', [rawurlencode('بلاگ'), rawurlencode('فضة')])); $this->assertEquals( $response->getStatusCode(), 200, 'Routes nested paths' ); } } |