Passed
Push — 4 ( 529852...87c3e3 )
by Steve
10:18
created

BaseElementTest::testUpdateContentForSearchIndex()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 4
nc 1
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace DNADesign\Elemental\Tests;
4
5
use DNADesign\Elemental\Controllers\ElementController;
6
use DNADesign\Elemental\Extensions\ElementalPageExtension;
7
use DNADesign\Elemental\Models\BaseElement;
8
use DNADesign\Elemental\Models\ElementalArea;
9
use DNADesign\Elemental\Models\ElementContent;
10
use DNADesign\Elemental\Tests\Src\TestContentForSearchIndexExtension;
11
use DNADesign\Elemental\Tests\Src\TestElement;
12
use DNADesign\Elemental\Tests\Src\TestPage;
13
use Page;
0 ignored issues
show
Bug introduced by
The type Page was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
14
use SilverStripe\Control\Director;
15
use SilverStripe\Core\Config\Config;
16
use SilverStripe\Dev\FunctionalTest;
17
use SilverStripe\Forms\FieldList;
18
use SilverStripe\VersionedAdmin\Forms\HistoryViewerField;
19
20
class BaseElementTest extends FunctionalTest
21
{
22
    protected static $fixture_file = 'ElementalPageExtensionTest.yml';
23
24
    protected static $required_extensions = [
25
        Page::class => [
26
            ElementalPageExtension::class,
27
        ],
28
    ];
29
30
    protected static $extra_dataobjects = [
31
        TestPage::class,
32
        TestElement::class,
33
    ];
34
35
    public function testSimpleClassName()
36
    {
37
        $element = $this->objFromFixture(ElementContent::class, 'content1');
38
39
        $this->assertEquals('dnadesign__elemental__models__elementcontent', $element->getSimpleClassName());
40
    }
41
42
    /**
43
     * Test to ensure backwards compatibility with old Anchor IDs.
44
     */
45
    public function testDisablePrettyAnchor()
46
    {
47
        Config::modify()->set(BaseElement::class, 'disable_pretty_anchor_name', true);
48
49
        $area = ElementalArea::create();
50
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 1)));
51
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 2)));
52
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 3)));
53
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 4)));
54
        $area->write();
55
56
        $recordSet = $area->Elements()->toArray();
57
        $this->assertEquals('e'.$recordSet[0]->ID, $recordSet[0]->getAnchor());
58
        $this->assertEquals('e'.$recordSet[1]->ID, $recordSet[1]->getAnchor());
59
        $this->assertEquals('e'.$recordSet[2]->ID, $recordSet[2]->getAnchor());
60
        $this->assertEquals('e'.$recordSet[3]->ID, $recordSet[3]->getAnchor());
61
    }
62
63
    /**
64
     * Test the stop-clashing logic if two BaseElement classes have the same $Title.
65
     */
66
    public function testSameTitle()
67
    {
68
        Config::modify()->set(BaseElement::class, 'enable_title_in_template', true);
69
70
        $area = ElementalArea::create();
71
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 1)));
72
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 2)));
73
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 3)));
74
        $area->Elements()->add(BaseElement::create(array('Title' => 'Element 1', 'Sort' => 4)));
75
        $area->write();
76
77
        $recordSet = $area->Elements()->toArray();
78
        foreach ($recordSet as $record) {
79
            // NOTE: This puts it into the $_anchor protected variable
80
            //       and caches it.
81
            $record->getAnchor();
82
        }
83
        $this->assertEquals('element-1', $recordSet[0]->getAnchor());
84
        $this->assertEquals('element-1-2', $recordSet[1]->getAnchor());
85
        $this->assertEquals('element-1-3', $recordSet[2]->getAnchor());
86
        $this->assertEquals('element-1-4', $recordSet[3]->getAnchor());
87
    }
88
89
    public function testGetCmsFields()
90
    {
91
        $element = $this->objFromFixture(ElementContent::class, 'content1');
92
93
        $this->assertInstanceOf(FieldList::class, $element->getCMSFields());
94
    }
95
96
    public function testGetController()
97
    {
98
        $element = $this->objFromFixture(ElementContent::class, 'content1');
99
        $controller = $element->getController();
100
101
        $this->assertInstanceOf(ElementController::class, $controller);
102
103
        $this->assertEquals($element, $controller->getElement(), 'Controller has element');
104
        $this->assertEquals('Test Content', $controller->Title, 'Controller fallbacks to element');
105
    }
106
107
    public function testLink()
108
    {
109
        $element = $this->objFromFixture(ElementContent::class, 'content1');
110
111
        $this->assertStringContainsString($element->getPage()->Link(), $element->Link());
112
    }
113
114
    public function testGetEditLink()
115
    {
116
        Director::config()->set('alternate_base_url', 'http://example.com');
117
118
        /** @var ElementContent $element */
119
        $element = $this->objFromFixture(ElementContent::class, 'content1');
120
        $editLink = $element->getEditLink();
121
122
        $this->assertStringContainsString('http://example.com', $editLink, 'Link should be absolute');
123
        $this->assertStringContainsString('pages/edit', $editLink, 'Link should contain reference to the page');
124
    }
125
126
    public function testGetIcon()
127
    {
128
        $element = new ElementContent();
129
        $this->assertStringContainsString('class="font-icon-block-content"', $element->getIcon());
130
131
        Config::modify()->set(ElementContent::class, 'icon', '');
132
        $this->assertEmpty($element->getIcon());
133
    }
134
135
    public function testNoHistoryForUnsavedElements()
136
    {
137
        $newElement = new ElementContent();
138
        $newElementHistory = $newElement->getCMSFields()->dataFieldByName('ElementHistory');
139
        $this->assertNull($newElementHistory, 'Unsaved elements should not have history yet');
140
    }
141
142
    public function testGetHistoryViewerField()
143
    {
144
        $this->logInWithPermission();
145
146
        /** @var ElementContent $element */
147
        $element = $this->objFromFixture(ElementContent::class, 'content1');
148
149
        $history = $element->getCMSFields()->dataFieldByName('ElementHistory');
150
        $this->assertInstanceOf(HistoryViewerField::class, $history, 'History should be added');
151
    }
152
153
    public function testStyleVariants()
154
    {
155
        $styles = [
156
            'option1' => 'Option 1',
157
            'option2' => 'Option 2'
158
        ];
159
160
        Config::modify()->set(ElementContent::class, 'styles', $styles);
161
        $element = $this->objFromFixture(ElementContent::class, 'content1');
162
163
        $this->assertEquals($styles, $element->getCMSFields()->dataFieldByName('Style')->getSource());
164
165
        $element->Style = 'option1';
166
        $this->assertEquals('option1', $element->getStyleVariant());
167
168
        // set a outdated style, should not add.
169
        $element->Style = 'old';
170
        $this->assertEquals('', $element->getStyleVariant());
171
    }
172
173
    public function testFirst()
174
    {
175
        $element = $this->objFromFixture(ElementContent::class, 'content1');
176
        $element2 = $this->objFromFixture(ElementContent::class, 'content2');
177
178
        $this->assertTrue($element->First());
179
        $this->assertFalse($element2->First());
180
    }
181
182
    public function testLast()
183
    {
184
        $element = $this->objFromFixture(ElementContent::class, 'content1');
185
        $element2 = $this->objFromFixture(ElementContent::class, 'content2');
186
187
        $this->assertFalse($element->Last());
188
        $this->assertTrue($element2->Last());
189
    }
190
191
    public function testTotalItems()
192
    {
193
        $element = $this->objFromFixture(ElementContent::class, 'content1');
194
        $element3 = $this->objFromFixture(ElementContent::class, 'content3');
195
196
        $this->assertEquals(2, $element->TotalItems());
197
        $this->assertEquals(1, $element3->TotalItems());
198
    }
199
200
    public function testEvenOdd()
201
    {
202
        $element = $this->objFromFixture(ElementContent::class, 'content1');
203
        $element2 = $this->objFromFixture(ElementContent::class, 'content2');
204
        $element3 = $this->objFromFixture(ElementContent::class, 'content3');
205
206
        $this->assertEquals('odd', $element->EvenOdd());
207
        $this->assertEquals('even', $element2->EvenOdd());
208
        $this->assertEquals('odd', $element3->EvenOdd());
209
    }
210
211
    public function testOnBeforeWrite()
212
    {
213
        /** @var ElementalArea $area */
214
        $area = $this->objFromFixture(ElementalArea::class, 'area51');
215
216
        $element1 = new ElementContent();
217
        $element1->ParentID = $area->ID;
218
        $element1->write();
219
        $baselineSort = $element1->Sort;
220
221
        $element2 = new ElementContent();
222
        $element2->ParentID = $area->ID;
223
        $element2->write();
224
        $this->assertEquals($baselineSort + 1, $element2->Sort, 'Sort order should be higher than the max');
225
226
        // Use a different element type, ensuring that sort orders are relative to the BaseElement
227
        $element3 = new TestElement();
228
        $element3->ParentID = $area->ID;
229
        $element3->write();
230
        $this->assertEquals($baselineSort + 2, $element3->Sort, 'Sort order should be higher than the max');
231
    }
232
233
    public function testOnBeforeWriteNoParent()
234
    {
235
        $element1 = new ElementContent();
236
        $element1->write();
237
238
        $this->assertEquals(0, (int) $element1->Sort);
239
    }
240
241
    public function testGetContentForSearchIndex()
242
    {
243
        $element = $this->objFromFixture(ElementContent::class, 'content4');
244
        // Content should have tags stripped with a space before what were the < characters
245
        // One closing tag plus one opening tag means there should be two spaced between paragraphs
246
        $this->assertEquals('One paragraph  And another one', $element->getContentForSearchIndex());
247
    }
248
249
    public function testUpdateContentForSearchIndex()
250
    {
251
        ElementContent::add_extension(TestContentForSearchIndexExtension::class);
252
        $element = $this->objFromFixture(ElementContent::class, 'content4');
253
        // Content should be updated by the extension
254
        $this->assertEquals('This is the updated content.', $element->getContentForSearchIndex());
255
        ElementContent::remove_extension(TestContentForSearchIndexExtension::class);
256
    }
257
}
258