BaseElementTest   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 211
Duplicated Lines 0 %

Importance

Changes 4
Bugs 1 Features 0
Metric Value
eloc 102
c 4
b 1
f 0
dl 0
loc 211
rs 10
wmc 17

16 Methods

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