Passed
Push — master ( 47ee87...b37b7e )
by Robbie
14:54 queued 11s
created

BaseElementTest::testGetEditLink()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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