CMSSiteTreeFilterTest   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 196
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 111
c 1
b 0
f 0
dl 0
loc 196
rs 10
wmc 9

9 Methods

Rating   Name   Duplication   Size   Complexity  
A testStatusDeletedFilter() 0 18 1
A testStatusDraftPagesFilter() 0 21 1
A testSearchFilterByTitle() 0 14 1
A testIncludesParentsForNestedMatches() 0 14 1
A testDateFromToLastSameDate() 0 13 1
A testDeletedPagesFilter() 0 18 1
A testSearchFilterEmpty() 0 10 1
A testStatusRemovedFromDraftFilter() 0 23 1
A testChangedPagesFilter() 0 42 1
1
<?php
2
3
namespace SilverStripe\CMS\Tests\Controllers;
4
5
use SilverStripe\CMS\Model\SiteTree;
6
use SilverStripe\Versioned\Versioned;
7
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_Search;
8
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_ChangedPages;
9
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_DeletedPages;
10
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusDraftPages;
11
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusRemovedFromDraftPages;
12
use SilverStripe\CMS\Controllers\CMSSiteTreeFilter_StatusDeletedPages;
13
use SilverStripe\Dev\SapphireTest;
14
15
class CMSSiteTreeFilterTest extends SapphireTest
16
{
17
    protected static $fixture_file = 'CMSSiteTreeFilterTest.yml';
18
19
    public function testSearchFilterEmpty()
20
    {
21
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
22
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
23
24
        $f = new CMSSiteTreeFilter_Search();
25
        $results = $f->pagesIncluded();
0 ignored issues
show
Unused Code introduced by
The assignment to $results is dead and can be removed.
Loading history...
26
27
        $this->assertTrue($f->isPageIncluded($page1));
28
        $this->assertTrue($f->isPageIncluded($page2));
29
    }
30
31
    public function testSearchFilterByTitle()
32
    {
33
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
34
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
35
36
        $f = new CMSSiteTreeFilter_Search(['Title' => 'Page 1']);
37
        $results = $f->pagesIncluded();
38
39
        $this->assertTrue($f->isPageIncluded($page1));
40
        $this->assertFalse($f->isPageIncluded($page2));
41
        $this->assertEquals(1, count($results));
42
        $this->assertEquals(
43
            ['ID' => $page1->ID, 'ParentID' => 0],
44
            $results[0]
45
        );
46
    }
47
48
    public function testIncludesParentsForNestedMatches()
49
    {
50
        $parent = $this->objFromFixture(SiteTree::class, 'page3');
51
        $child = $this->objFromFixture(SiteTree::class, 'page3b');
52
53
        $f = new CMSSiteTreeFilter_Search(['Title' => 'Page 3b']);
54
        $results = $f->pagesIncluded();
55
56
        $this->assertTrue($f->isPageIncluded($parent));
57
        $this->assertTrue($f->isPageIncluded($child));
58
        $this->assertEquals(1, count($results));
59
        $this->assertEquals(
60
            ['ID' => $child->ID, 'ParentID' => $parent->ID],
61
            $results[0]
62
        );
63
    }
64
65
    public function testChangedPagesFilter()
66
    {
67
        /** @var Page $unchangedPage */
68
        $unchangedPage = $this->objFromFixture(SiteTree::class, 'page1');
69
        $unchangedPage->publishRecursive();
70
71
        /** @var Page $changedPage */
72
        $changedPage = $this->objFromFixture(SiteTree::class, 'page2');
73
        $changedPage->Title = 'Original';
74
        $changedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
75
        $changedPage->Title = 'Changed';
76
        $changedPage->write();
77
        $changedPageVersion = $changedPage->Version;
78
79
        // Check that only changed pages are returned
80
        $f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'Changed']);
81
        $results = $f->pagesIncluded();
82
83
        $this->assertTrue($f->isPageIncluded($changedPage));
84
        $this->assertFalse($f->isPageIncluded($unchangedPage));
85
        $this->assertEquals(1, count($results));
86
        $this->assertEquals(
87
            ['ID' => $changedPage->ID, 'ParentID' => 0],
88
            $results[0]
89
        );
90
91
        // Check that only changed pages are returned
92
        $f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'No Matches']);
93
        $results = $f->pagesIncluded();
94
        $this->assertEquals(0, count($results));
95
96
        // If we roll back to an earlier version than what's on the published site, we should still show the changed
97
        $changedPage->Title = 'Changed 2';
98
        $changedPage->write();
99
        $changedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
100
        $changedPage->doRollbackTo($changedPageVersion);
101
102
        $f = new CMSSiteTreeFilter_ChangedPages(['Term' => 'Changed']);
103
        $results = $f->pagesIncluded();
104
105
        $this->assertEquals(1, count($results));
106
        $this->assertEquals(['ID' => $changedPage->ID, 'ParentID' => 0], $results[0]);
107
    }
108
109
    public function testDeletedPagesFilter()
110
    {
111
        $deletedPage = $this->objFromFixture(SiteTree::class, 'page2');
112
        $deletedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
113
        $deletedPageID = $deletedPage->ID;
114
        $deletedPage->delete();
115
        $deletedPage = Versioned::get_one_by_stage(
116
            SiteTree::class,
117
            'Live',
118
            ['"SiteTree_Live"."ID"' => $deletedPageID]
0 ignored issues
show
Bug introduced by
array('"SiteTree_Live"."ID"' => $deletedPageID) of type array<string,integer> is incompatible with the type string expected by parameter $filter of SilverStripe\Versioned\V...ned::get_one_by_stage(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

118
            /** @scrutinizer ignore-type */ ['"SiteTree_Live"."ID"' => $deletedPageID]
Loading history...
119
        );
120
121
        $f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'Page']);
122
        $this->assertTrue($f->isPageIncluded($deletedPage));
123
124
        // Check that only changed pages are returned
125
        $f = new CMSSiteTreeFilter_DeletedPages(['Term' => 'No Matches']);
126
        $this->assertFalse($f->isPageIncluded($deletedPage));
127
    }
128
129
    public function testStatusDraftPagesFilter()
130
    {
131
        $draftPage = $this->objFromFixture(SiteTree::class, 'page4');
132
        $draftPage = Versioned::get_one_by_stage(
133
            SiteTree::class,
134
            'Stage',
135
            sprintf('"SiteTree"."ID" = %d', $draftPage->ID)
136
        );
137
138
        // Check draft page is shown
139
        $f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'Page']);
140
        $this->assertTrue($f->isPageIncluded($draftPage));
141
142
        // Check filter respects parameters
143
        $f = new CMSSiteTreeFilter_StatusDraftPages(['Term' => 'No Match']);
144
        $this->assertEmpty($f->isPageIncluded($draftPage));
145
146
        // Ensures empty array returned if no data to show
147
        $f = new CMSSiteTreeFilter_StatusDraftPages();
148
        $draftPage->delete();
149
        $this->assertEmpty($f->isPageIncluded($draftPage));
150
    }
151
152
    public function testDateFromToLastSameDate()
153
    {
154
        $draftPage = $this->objFromFixture(SiteTree::class, 'page4');
155
        // Grab the date
156
        $date = substr($draftPage->LastEdited, 0, 10);
157
        // Filter with that date
158
        $filter = new CMSSiteTreeFilter_Search([
159
            'LastEditedFrom' => $date,
160
            'LastEditedTo' => $date,
161
        ]);
162
        $this->assertTrue(
163
            $filter->isPageIncluded($draftPage),
164
            'Using the same date for from and to should show find that page'
165
        );
166
    }
167
168
    public function testStatusRemovedFromDraftFilter()
169
    {
170
        $removedDraftPage = $this->objFromFixture(SiteTree::class, 'page6');
171
        $removedDraftPage->publishRecursive();
172
        $removedDraftPage->deleteFromStage('Stage');
173
        $removedDraftPage = Versioned::get_one_by_stage(
174
            SiteTree::class,
175
            'Live',
176
            sprintf('"SiteTree"."ID" = %d', $removedDraftPage->ID)
177
        );
178
179
        // Check live-only page is included
180
        $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedFrom' => '2000-01-01 00:00']);
181
        $this->assertTrue($f->isPageIncluded($removedDraftPage));
182
183
        // Check filter is respected
184
        $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages(['LastEditedTo' => '1999-01-01 00:00']);
185
        $this->assertEmpty($f->isPageIncluded($removedDraftPage));
186
187
        // Ensures empty array returned if no data to show
188
        $f = new CMSSiteTreeFilter_StatusRemovedFromDraftPages();
189
        $removedDraftPage->delete();
190
        $this->assertEmpty($f->isPageIncluded($removedDraftPage));
191
    }
192
193
    public function testStatusDeletedFilter()
194
    {
195
        $deletedPage = $this->objFromFixture(SiteTree::class, 'page7');
196
        $deletedPage->copyVersionToStage(Versioned::DRAFT, Versioned::LIVE);
197
        $deletedPageID = $deletedPage->ID;
198
199
        // Can't use straight $blah->delete() as that blows it away completely and test fails
200
        $deletedPage->deleteFromStage(Versioned::LIVE);
201
        $deletedPage->deleteFromStage(Versioned::DRAFT);
202
        $checkParentExists = Versioned::get_latest_version(SiteTree::class, $deletedPageID);
203
204
        // Check deleted page is included
205
        $f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Page']);
206
        $this->assertTrue($f->isPageIncluded($checkParentExists));
207
208
        // Check filter is respected
209
        $f = new CMSSiteTreeFilter_StatusDeletedPages(['Title' => 'Bobby']);
210
        $this->assertFalse($f->isPageIncluded($checkParentExists));
211
    }
212
}
213