Source of file ContentControllerTest.php
Size: 8,477 Bytes - Last Modified: 2021-12-23T10:28:18+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Controllers/ContentControllerTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 | <?php namespace SilverStripe\CMS\Tests\Controllers; use SilverStripe\CMS\Controllers\ContentController; use SilverStripe\CMS\Controllers\RootURLController; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPResponse_Exception; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\FunctionalTest; use SilverStripe\Versioned\Versioned; use Page; class ContentControllerTest extends FunctionalTest { protected static $fixture_file = 'ContentControllerTest.yml'; protected static $disable_themes = true; protected static $extra_dataobjects = [ ContentControllerTest_Page::class, ContentControllerTestPage::class, ContentControllerTestPageWithoutController::class, ]; protected function setUp(): void { parent::setUp(); Config::modify()->set(SiteTree::class, 'nested_urls', true); // Ensure all pages are published /** @var Page $page */ foreach (Page::get() as $page) { $page->publishSingle(); } } /** * Test that nested pages, basic actions, and nested/non-nested URL switching works properly */ public function testNestedPages() { Config::modify()->set(SiteTree::class, 'nested_urls', true); $this->assertEquals('Home Page', $this->get('/')->getBody()); $this->assertEquals('Home Page', $this->get('/home/index/')->getBody()); $this->assertEquals('Home Page', $this->get('/home/second-index/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/home/second-level/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/home/second-level/index/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/home/second-level/second-index/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/home/second-level/third-level/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/home/second-level/third-level/index/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/home/second-level/third-level/second-index/')->getBody()); RootURLController::reset(); Config::modify()->set(SiteTree::class, 'nested_urls', false); $this->assertEquals('Home Page', $this->get('/')->getBody()); $this->assertEquals('Home Page', $this->get('/home/')->getBody()); $this->assertEquals('Home Page', $this->get('/home/second-index/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/second-level/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/second-level/index/')->getBody()); $this->assertEquals('Second Level Page', $this->get('/second-level/second-index/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/third-level/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/third-level/index/')->getBody()); $this->assertEquals('Third Level Page', $this->get('/third-level/second-index/')->getBody()); } /** * Tests {@link ContentController::ChildrenOf()} */ public function testChildrenOf() { $controller = new ContentController(); $this->assertEquals(1, $controller->ChildrenOf('/')->Count()); $this->assertEquals(1, $controller->ChildrenOf('/home/')->Count()); $this->assertEquals(2, $controller->ChildrenOf('/home/second-level/')->Count()); $this->assertEquals(0, $controller->ChildrenOf('/home/second-level/third-level/')->Count()); SiteTree::config()->set('nested_urls', false); $this->assertEquals(1, $controller->ChildrenOf('/')->Count()); $this->assertEquals(1, $controller->ChildrenOf('/home/')->Count()); $this->assertEquals(2, $controller->ChildrenOf('/second-level/')->Count()); $this->assertEquals(0, $controller->ChildrenOf('/third-level/')->Count()); } public function testDeepNestedURLs() { $page = new Page(); $page->URLSegment = 'base-page'; $page->write(); $page->publishSingle(); for ($i = 0; $i < 10; $i++) { $parentID = $page->ID; $page = new ContentControllerTest_Page(); $page->ParentID = $parentID; $page->Title = "Page Level $i"; $page->URLSegment = "level-$i"; $page->write(); $page->publishSingle(); $relativeLink = Director::makeRelative($page->Link()); $this->assertEquals($page->Title, $this->get($relativeLink)->getBody()); } } public function testViewDraft() { // test when user does not have permission, should get login form $this->logInWithPermission('EDITOR'); try { $response = $this->get('/contact/?stage=Stage'); } catch (HTTPResponse_Exception $responseException) { $response = $responseException->getResponse(); } $this->assertEquals('403', $response->getstatusCode()); // test when user does have permission, should show page title and header ok. $this->logInWithPermission('ADMIN'); $this->assertEquals('200', $this->get('contact/?stage=Stage')->getstatusCode()); } public function testLinkShortcodes() { $linkedPage = new SiteTree(); $linkedPage->URLSegment = 'linked-page'; $linkedPage->write(); $linkedPage->publishSingle(); $page = new SiteTree(); $page->URLSegment = 'linking-page'; $page->Content = sprintf('<a href="[sitetree_link,id=%s]">Testlink</a>', $linkedPage->ID); $page->write(); $page->publishSingle(); $link = $page->RelativeLink(); $response = $this->get($link); $this->assertStringContainsString( sprintf('<a href="%s">Testlink</a>', $linkedPage->Link()), $response->getBody(), '"sitetree_link" shortcodes get parsed properly' ); } /** * Tests that {@link ContentController::getViewer()} chooses the correct templates. * * @covers \SilverStripe\CMS\Controllers\ContentController::getViewer() **/ public function testGetViewer() { $this->useTestTheme(__DIR__, 'controllertest', function () { // Test a page without a controller (ContentControllerTest_PageWithoutController.ss) $page = new ContentControllerTestPageWithoutController(); $page->URLSegment = "test"; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get($page->RelativeLink()); $this->assertEquals("ContentControllerTestPageWithoutController", trim($response->getBody())); // // This should fall over to user Page.ss $page = new ContentControllerTestPage(); $page->URLSegment = "test"; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get($page->RelativeLink()); $this->assertEquals("Page", trim($response->getBody())); // Test that the action template is rendered. $page = new ContentControllerTestPage(); $page->URLSegment = "page-without-controller"; $page->write(); $page->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE); $response = $this->get($page->RelativeLink("test")); $this->assertEquals("ContentControllerTestPage_test", trim($response->getBody())); // Test that an action without a template will default to the index template, which is // to say the default Page.ss template $response = $this->get($page->RelativeLink("testwithouttemplate")); $this->assertEquals("Page", trim($response->getBody())); // Test that an action with a template will render the both action template *and* the // correct parent template $controller = new ContentController($page); $viewer = $controller->getViewer('test'); $this->assertEquals( __DIR__ . '/themes/controllertest/templates/SilverStripe/CMS/Tests/Controllers/' . 'ContentControllerTestPage_test.ss', $viewer->templates()['main'] ); }); } } |