/**
  * Test setting pagination properties and returning the object
  */
 public function setUp()
 {
     parent::setUp();
     $page = new SiteTree(['Title' => "Test Page", 'URLSegment' => 'test']);
     $page->write();
     $page->publish('Stage', 'Live');
 }
	function testExternalBackUrlRedirectionDisallowed() {
		$page = new SiteTree();
		$page->URLSegment = 'testpage';
		$page->Title = 'Testpage';
		$page->write();
		$page->publish('Stage','Live');
		
		// Test internal relative redirect
		$response = $this->doTestLoginForm('*****@*****.**', '1nitialPassword', 'testpage');
		$this->assertEquals(302, $response->getStatusCode());
		$this->assertRegExp('/testpage/', $response->getHeader('Location'),
			"Internal relative BackURLs work when passed through to login form"
		);
		// Log the user out
		$this->session()->inst_set('loggedInAs', null);
		
		// Test internal absolute redirect
		$response = $this->doTestLoginForm('*****@*****.**', '1nitialPassword', Director::absoluteBaseURL() . 'testpage');
		// for some reason the redirect happens to a relative URL
		$this->assertRegExp('/^' . preg_quote(Director::absoluteBaseURL(), '/') . 'testpage/', $response->getHeader('Location'),
			"Internal absolute BackURLs work when passed through to login form"
		);
		// Log the user out
		$this->session()->inst_set('loggedInAs', null);
		
		// Test external redirect
		$response = $this->doTestLoginForm('*****@*****.**', '1nitialPassword', 'http://myspoofedhost.com');
		$this->assertNotRegExp('/^' . preg_quote('http://myspoofedhost.com', '/') . '/', $response->getHeader('Location'),
			"Redirection to external links in login form BackURL gets prevented as a measure against spoofing attacks"
		);
		// Log the user out
		$this->session()->inst_set('loggedInAs', null);
	}
 function testPagesInDifferentSubsitesCanShareURLSegment()
 {
     $subsiteMain = $this->objFromFixture('Subsite', 'main');
     $subsite1 = $this->objFromFixture('Subsite', 'subsite1');
     $pageMain = new SiteTree();
     $pageMain->URLSegment = 'testpage';
     $pageMain->write();
     $pageMain->publish('Stage', 'Live');
     $pageMainOther = new SiteTree();
     $pageMainOther->URLSegment = 'testpage';
     $pageMainOther->write();
     $pageMainOther->publish('Stage', 'Live');
     $this->assertNotEquals($pageMain->URLSegment, $pageMainOther->URLSegment, 'Pages in same subsite cant share the same URL');
     Subsite::changeSubsite($subsite1->ID);
     $pageSubsite1 = new SiteTree();
     $pageSubsite1->URLSegment = 'testpage';
     $pageSubsite1->write();
     $pageSubsite1->publish('Stage', 'Live');
     $this->assertEquals($pageMain->URLSegment, $pageSubsite1->URLSegment, 'Pages in different subsites can share the same URL');
 }
 /**
  * Test core Meta tag values
  */
 public function testMetaOutput()
 {
     SEO::init();
     $page = new SiteTree(['MetaTitle' => 'test_title', 'MetaDescription' => 'test_description', 'Canonical' => 'test_canonical', 'Robots' => 'test_index,follow', 'OGtype' => 'test_ogtype', 'OGlocale' => 'test_locale', 'TwitterCard' => 'test_summary']);
     $page->write();
     $page->publish('Stage', 'Live');
     SEO::setPage($page);
     $tags = SEO::HeadTags();
     $this->assertContains('<title>test_title</title>', $tags);
     $this->assertContains('<meta property="og:title" content="test_title">', $tags);
     $this->assertContains('<meta name="twitter:title" content="test_title">', $tags);
     $this->assertContains('<meta name="description" content="test_description">', $tags);
     $this->assertContains('<meta property="og:description" content="test_description">', $tags);
     $this->assertContains('<meta name="twitter:description" content="test_description">', $tags);
     $this->assertContains('<link rel="canonical" href="test_canonical">', $tags);
     $this->assertContains('<meta name="robots" content="test_index,follow">', $tags);
     $this->assertContains('<meta property="og:type" content="test_ogtype">', $tags);
     $this->assertContains('<meta property="og:locale" content="test_locale">', $tags);
     $this->assertContains('<meta name="twitter:card" content="test_summary">', $tags);
 }
 public function testPageTypeChangePropagatesToLive()
 {
     $page = new SiteTree();
     $page->MySharedNonVirtualField = 'original';
     $page->write();
     $page->publish('Stage', 'Live');
     $virtual = new VirtualPageTest_VirtualPageSub();
     $virtual->CopyContentFromID = $page->ID;
     $virtual->write();
     $virtual->publish('Stage', 'Live');
     $page->Title = 'original';
     // 'Title' is a virtual field
     // Publication would causes the virtual field to copy through onBeforeWrite(),
     // but we want to test that it gets copied on class name change instead
     $page->write();
     $nonVirtual = $virtual;
     $nonVirtual->ClassName = 'VirtualPageTest_ClassA';
     $nonVirtual->MySharedNonVirtualField = 'changed on new type';
     $nonVirtual->write();
     // not publishing the page type change here
     $this->assertEquals('original', $nonVirtual->Title, 'Copies virtual fields from original draft into new instance on type change ');
     $nonVirtualLive = Versioned::get_one_by_stage('SiteTree', 'Live', '"SiteTree_Live"."ID" = ' . $nonVirtual->ID);
     $this->assertNotNull($nonVirtualLive);
     $this->assertEquals('VirtualPageTest_ClassA', $nonVirtualLive->ClassName);
     $this->assertEquals('changed on new type', $nonVirtualLive->MySharedNonVirtualField);
     $page->MySharedNonVirtualField = 'changed only on original';
     $page->write();
     $page->publish('Stage', 'Live');
     $nonVirtualLive = Versioned::get_one_by_stage('SiteTree', 'Live', '"SiteTree_Live"."ID" = ' . $nonVirtual->ID, false);
     $this->assertEquals('changed on new type', $nonVirtualLive->MySharedNonVirtualField, 'No field copying from previous original after page type changed');
 }
 public function testLinkShortcodes()
 {
     $linkedPage = new SiteTree();
     $linkedPage->URLSegment = 'linked-page';
     $linkedPage->write();
     $linkedPage->publish('Stage', 'Live');
     $page = new SiteTree();
     $page->URLSegment = 'linking-page';
     $page->Content = sprintf('<a href="[sitetree_link,id=%s]">Testlink</a>', $linkedPage->ID);
     $page->write();
     $page->publish('Stage', 'Live');
     $this->assertContains(sprintf('<a href="%s">Testlink</a>', $linkedPage->Link()), $this->get($page->RelativeLink())->getBody(), '"sitetree_link" shortcodes get parsed properly');
 }
 public function testStageStates()
 {
     // newly created page
     $createdPage = new SiteTree();
     $createdPage->write();
     $this->assertFalse($createdPage->IsDeletedFromStage);
     $this->assertTrue($createdPage->IsAddedToStage);
     $this->assertTrue($createdPage->IsModifiedOnStage);
     // published page
     $publishedPage = new SiteTree();
     $publishedPage->write();
     $publishedPage->publish('Stage', 'Live');
     $this->assertFalse($publishedPage->IsDeletedFromStage);
     $this->assertFalse($publishedPage->IsAddedToStage);
     $this->assertFalse($publishedPage->IsModifiedOnStage);
     // published page, deleted from stage
     $deletedFromDraftPage = new SiteTree();
     $deletedFromDraftPage->write();
     $deletedFromDraftPageID = $deletedFromDraftPage->ID;
     $deletedFromDraftPage->publish('Stage', 'Live');
     $deletedFromDraftPage->deleteFromStage('Stage');
     $this->assertTrue($deletedFromDraftPage->IsDeletedFromStage);
     $this->assertFalse($deletedFromDraftPage->IsAddedToStage);
     $this->assertFalse($deletedFromDraftPage->IsModifiedOnStage);
     // published page, deleted from live
     $deletedFromLivePage = new SiteTree();
     $deletedFromLivePage->write();
     $deletedFromLivePage->publish('Stage', 'Live');
     $deletedFromLivePage->deleteFromStage('Stage');
     $deletedFromLivePage->deleteFromStage('Live');
     $this->assertTrue($deletedFromLivePage->IsDeletedFromStage);
     $this->assertFalse($deletedFromLivePage->IsAddedToStage);
     $this->assertFalse($deletedFromLivePage->IsModifiedOnStage);
     // published page, modified
     $modifiedOnDraftPage = new SiteTree();
     $modifiedOnDraftPage->write();
     $modifiedOnDraftPage->publish('Stage', 'Live');
     $modifiedOnDraftPage->Content = 'modified';
     $modifiedOnDraftPage->write();
     $this->assertFalse($modifiedOnDraftPage->IsDeletedFromStage);
     $this->assertFalse($modifiedOnDraftPage->IsAddedToStage);
     $this->assertTrue($modifiedOnDraftPage->IsModifiedOnStage);
 }
 public function testUnpublishedPage()
 {
     if (!class_exists('SiteTree')) {
         $this->markTestSkipped('Test skipped; CMS module required for testUnpublishedPage');
     }
     $orphanedPage = new SiteTree();
     $orphanedPage->ParentID = 999999;
     // missing parent id
     $orphanedPage->write();
     $orphanedPage->publish("Stage", "Live");
     $rootPage = new SiteTree();
     $rootPage->ParentID = 0;
     $rootPage->write();
     $rootPage->publish("Stage", "Live");
     $oldMode = Versioned::get_reading_mode();
     Versioned::reading_stage('Live');
     try {
         $this->assertEmpty($orphanedPage->hasPublishedParent());
         $this->assertEmpty($orphanedPage->canIncludeInGoogleSitemap());
         $this->assertNotEmpty($rootPage->hasPublishedParent());
         $this->assertNotEmpty($rootPage->canIncludeInGoogleSitemap());
     } catch (Exception $ex) {
         Versioned::set_reading_mode($oldMode);
         throw $ex;
     }
     // finally {
     Versioned::set_reading_mode($oldMode);
     // }
 }
 function testGetTranslationByStage()
 {
     $publishedPage = new SiteTree();
     $publishedPage->Locale = 'en_US';
     $publishedPage->Title = 'Published';
     $publishedPage->write();
     $publishedPage->publish('Stage', 'Live');
     $publishedPage->Title = 'Unpublished';
     $publishedPage->write();
     $publishedTranslatedPage = $publishedPage->createTranslation('de_DE');
     $publishedTranslatedPage->Title = 'Publiziert';
     $publishedTranslatedPage->write();
     $publishedTranslatedPage->publish('Stage', 'Live');
     $publishedTranslatedPage->Title = 'Unpubliziert';
     $publishedTranslatedPage->write();
     $compareStage = $publishedPage->getTranslation('de_DE', 'Stage');
     $this->assertNotNull($compareStage);
     $this->assertEquals($compareStage->Title, 'Unpubliziert');
     $compareLive = $publishedPage->getTranslation('de_DE', 'Live');
     $this->assertNotNull($compareLive);
     $this->assertEquals($compareLive->Title, 'Publiziert');
 }