silverstripe-cms/tests/php/Controllers/CMSSiteTreeFilterTest.php

212 lines
7.9 KiB
PHP
Raw Normal View History

<?php
2017-08-09 04:53:38 +02:00
namespace SilverStripe\CMS\Tests\Controllers;
2017-08-09 03:25:12 +02:00
use Page;
use SilverStripe\CMS\Model\SiteTree;
use SilverStripe\Versioned\Versioned;
2016-07-22 01:32:32 +02:00
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_Search;
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_ChangedPages;
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_DeletedPages;
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusDraftPages;
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusRemovedFromDraftPages;
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusDeletedPages;
use SilverStripe\Dev\SapphireTest;
2017-01-25 21:59:25 +01:00
class CMSSiteTreeFilterTest extends SapphireTest
{
protected static $fixture_file = 'CMSSiteTreeFilterTest.yml';
public function testSearchFilterEmpty()
{
$page1 = $this->objFromFixture('Page', 'page1');
$page2 = $this->objFromFixture('Page', 'page2');
$f = new CMSSiteTreeFilter_Search();
$results = $f->pagesIncluded();
$this->assertTrue($f->isPageIncluded($page1));
$this->assertTrue($f->isPageIncluded($page2));
}
public function testSearchFilterByTitle()
{
$page1 = $this->objFromFixture('Page', 'page1');
$page2 = $this->objFromFixture('Page', 'page2');
$f = new CMSSiteTreeFilter_Search(['Title' => 'Page 1']);
2017-01-25 21:59:25 +01:00
$results = $f->pagesIncluded();
$this->assertTrue($f->isPageIncluded($page1));
$this->assertFalse($f->isPageIncluded($page2));
$this->assertEquals(1, count($results));
$this->assertEquals(
['ID' => $page1->ID, 'ParentID' => 0],
2017-01-25 21:59:25 +01:00
$results[0]
);
}
public function testIncludesParentsForNestedMatches()
{
$parent = $this->objFromFixture('Page', 'page3');
$child = $this->objFromFixture('Page', 'page3b');
$f = new CMSSiteTreeFilter_Search(['Title' => 'Page 3b']);
2017-01-25 21:59:25 +01:00
$results = $f->pagesIncluded();
$this->assertTrue($f->isPageIncluded($parent));
$this->assertTrue($f->isPageIncluded($child));
$this->assertEquals(1, count($results));
$this->assertEquals(
['ID' => $child->ID, 'ParentID' => $parent->ID],
2017-01-25 21:59:25 +01:00
$results[0]
);
}
public function testChangedPagesFilter()
{
/** @var Page $unchangedPage */
2017-01-25 21:59:25 +01:00
$unchangedPage = $this->objFromFixture('Page', 'page1');
$unchangedPage->publishRecursive();
/** @var Page $changedPage */
2017-01-25 21:59:25 +01:00
$changedPage = $this->objFromFixture('Page', 'page2');
$changedPage->Title = 'Original';
$changedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
$changedPage->Title = 'Changed';
$changedPage->write();
$changedPageVersion = $changedPage->Version;
2017-01-25 21:59:25 +01:00
// Check that only changed pages are returned
$f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'Changed']);
2017-01-25 21:59:25 +01:00
$results = $f->pagesIncluded();
$this->assertTrue($f->isPageIncluded($changedPage));
$this->assertFalse($f->isPageIncluded($unchangedPage));
$this->assertEquals(1, count($results));
$this->assertEquals(
['ID' => $changedPage->ID, 'ParentID' => 0],
2017-01-25 21:59:25 +01:00
$results[0]
);
// Check that only changed pages are returned
$f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'No Matches']);
2017-01-25 21:59:25 +01:00
$results = $f->pagesIncluded();
$this->assertEquals(0, count($results));
// If we roll back to an earlier version than what's on the published site, we should still show the changed
$changedPage->Title = 'Changed 2';
$changedPage->write();
2017-01-25 21:59:25 +01:00
$changedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
$changedPage->doRollbackTo($changedPageVersion);
2017-01-25 21:59:25 +01:00
$f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'Changed']);
2017-01-25 21:59:25 +01:00
$results = $f->pagesIncluded();
$this->assertEquals(1, count($results));
$this->assertEquals(['ID' => $changedPage->ID, 'ParentID' => 0], $results[0]);
2017-01-25 21:59:25 +01:00
}
public function testDeletedPagesFilter()
{
$deletedPage = $this->objFromFixture('Page', 'page2');
$deletedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
$deletedPageID = $deletedPage->ID;
$deletedPage->delete();
$deletedPage = Versioned::get_one_by_stage(
2017-08-09 04:53:38 +02:00
SiteTree::class,
2017-01-25 21:59:25 +01:00
'Live',
['"SiteTree_Live"."ID"' => $deletedPageID]
2017-01-25 21:59:25 +01:00
);
$f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'Page']);
2017-01-25 21:59:25 +01:00
$this->assertTrue($f->isPageIncluded($deletedPage));
// Check that only changed pages are returned
$f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'No Matches']);
2017-01-25 21:59:25 +01:00
$this->assertFalse($f->isPageIncluded($deletedPage));
}
public function testStatusDraftPagesFilter()
{
$draftPage = $this->objFromFixture('Page', 'page4');
$draftPage = Versioned::get_one_by_stage(
2017-08-09 04:53:38 +02:00
SiteTree::class,
2017-01-25 21:59:25 +01:00
'Stage',
sprintf('"SiteTree"."ID" = %d', $draftPage->ID)
);
// Check draft page is shown
$f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'Page']);
2017-01-25 21:59:25 +01:00
$this->assertTrue($f->isPageIncluded($draftPage));
// Check filter respects parameters
$f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'No Match']);
2017-01-25 21:59:25 +01:00
$this->assertEmpty($f->isPageIncluded($draftPage));
// Ensures empty array returned if no data to show
$f = new CMSSiteTreeFilter_StatusDraftPages();
$draftPage->delete();
$this->assertEmpty($f->isPageIncluded($draftPage));
}
public function testDateFromToLastSameDate()
{
$draftPage = $this->objFromFixture('Page', 'page4');
// Grab the date
$date = substr($draftPage->LastEdited, 0, 10);
// Filter with that date
$filter = new CMSSiteTreeFilter_Search([
2017-01-25 21:59:25 +01:00
'LastEditedFrom' => $date,
'LastEditedTo' => $date
]);
2017-01-25 21:59:25 +01:00
$this->assertTrue($filter->isPageIncluded($draftPage), 'Using the same date for from and to should show find that page');
}
public function testStatusRemovedFromDraftFilter()
{
$removedDraftPage = $this->objFromFixture('Page', 'page6');
$removedDraftPage->publishRecursive();
$removedDraftPage->deleteFromStage('Stage');
$removedDraftPage = Versioned::get_one_by_stage(
2017-08-09 04:53:38 +02:00
SiteTree::class,
2017-01-25 21:59:25 +01:00
'Live',
sprintf('"SiteTree"."ID" = %d', $removedDraftPage->ID)
);
// Check live-only page is included
$f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedFrom' => '2000-01-01 00:00']);
2017-01-25 21:59:25 +01:00
$this->assertTrue($f->isPageIncluded($removedDraftPage));
// Check filter is respected
$f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedTo' => '1999-01-01 00:00']);
2017-01-25 21:59:25 +01:00
$this->assertEmpty($f->isPageIncluded($removedDraftPage));
// Ensures empty array returned if no data to show
$f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages();
$removedDraftPage->delete();
$this->assertEmpty($f->isPageIncluded($removedDraftPage));
}
public function testStatusDeletedFilter()
{
$deletedPage = $this->objFromFixture('Page', 'page7');
$deletedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
$deletedPageID = $deletedPage->ID;
// Can't use straight $blah->delete() as that blows it away completely and test fails
$deletedPage->deleteFromStage(Versioned::LIVE);
$deletedPage->deleteFromStage(Versioned::DRAFT);
$checkParentExists = Versioned::get_latest_version(SiteTree::class, $deletedPageID);
2017-01-25 21:59:25 +01:00
// Check deleted page is included
$f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Page']);
2017-01-25 21:59:25 +01:00
$this->assertTrue($f->isPageIncluded($checkParentExists));
// Check filter is respected
$f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Bobby']);
2017-01-25 21:59:25 +01:00
$this->assertFalse($f->isPageIncluded($checkParentExists));
}
}