CMSTreeTest::testUpdateTreeNodes()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 42
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 32
nc 1
nop 0
dl 0
loc 42
rs 9.408
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\CMS\Tests\Controllers;
4
5
use SilverStripe\CMS\Model\SiteTree;
6
use SilverStripe\Dev\FunctionalTest;
7
use SilverStripe\ORM\DataObject;
8
9
/**
10
 * Tests for tree-operations refactored out of LeftAndMain
11
 */
12
class CMSTreeTest extends FunctionalTest
13
{
14
    protected static $fixture_file = 'CMSTreeTest.yml';
15
16
    public function testSaveTreeNodeSorting()
17
    {
18
        $this->logInWithPermission('ADMIN');
19
20
        // forcing sorting for non-MySQL
21
        $rootPages = SiteTree::get()
22
            ->filter("ParentID", 0)
23
            ->sort('"ID"');
24
        $siblingIDs = $rootPages->column('ID');
25
        $page1 = $rootPages->offsetGet(0);
26
        $page2 = $rootPages->offsetGet(1);
27
        $page3 = $rootPages->offsetGet(2);
28
29
        // Move page2 before page1
30
        $siblingIDs[0] = $page2->ID;
31
        $siblingIDs[1] = $page1->ID;
32
        $data = [
33
            'SiblingIDs' => $siblingIDs,
34
            'ID' => $page2->ID,
35
            'ParentID' => 0,
36
        ];
37
38
        $response = $this->post('admin/pages/edit/savetreenode', $data);
39
        $this->assertEquals(200, $response->getStatusCode());
40
        /** @var SiteTree $page1 */
41
        $page1 = SiteTree::get()->byID($page1->ID);
42
        /** @var SiteTree $page2 */
43
        $page2 = SiteTree::get()->byID($page2->ID);
44
        /** @var SiteTree $page3 */
45
        $page3 = SiteTree::get()->byID($page3->ID);
46
47
        $this->assertEquals(2, $page1->Sort, 'Page1 is sorted after Page2');
48
        $this->assertEquals(1, $page2->Sort, 'Page2 is sorted before Page1');
49
        $this->assertEquals(3, $page3->Sort, 'Sort order for other pages is unaffected');
50
    }
51
52
    public function testSaveTreeNodeParentID()
53
    {
54
        $this->logInWithPermission('ADMIN');
55
56
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
57
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
58
        $page31 = $this->objFromFixture(SiteTree::class, 'page31');
59
        $page32 = $this->objFromFixture(SiteTree::class, 'page32');
60
61
        // Move page2 into page3, between page3.1 and page 3.2
62
        $siblingIDs = [
63
            $page31->ID,
64
            $page2->ID,
65
            $page32->ID,
66
        ];
67
        $data = [
68
            'SiblingIDs' => $siblingIDs,
69
            'ID' => $page2->ID,
70
            'ParentID' => $page3->ID,
71
        ];
72
        $response = $this->post('admin/pages/edit/savetreenode', $data);
73
        $this->assertEquals(200, $response->getStatusCode());
74
        $page2 = DataObject::get_by_id(SiteTree::class, $page2->ID, false);
75
        $page31 = DataObject::get_by_id(SiteTree::class, $page31->ID, false);
76
        $page32 = DataObject::get_by_id(SiteTree::class, $page32->ID, false);
77
78
        $this->assertEquals($page3->ID, $page2->ParentID, 'Moved page gets new parent');
79
        $this->assertEquals(1, $page31->Sort, 'Children pages before insertaion are unaffected');
80
        $this->assertEquals(2, $page2->Sort, 'Moved page is correctly sorted');
81
        $this->assertEquals(3, $page32->Sort, 'Children pages after insertion are resorted');
82
    }
83
84
85
    /**
86
     * Test {@see CMSMain::updatetreenodes}
87
     */
88
    public function testUpdateTreeNodes()
89
    {
90
        $page1 = $this->objFromFixture(SiteTree::class, 'page1');
91
        $page2 = $this->objFromFixture(SiteTree::class, 'page2');
92
        $page3 = $this->objFromFixture(SiteTree::class, 'page3');
93
        $page31 = $this->objFromFixture(SiteTree::class, 'page31');
94
        $page32 = $this->objFromFixture(SiteTree::class, 'page32');
95
        $this->logInWithPermission('ADMIN');
96
97
        // Check page
98
        $result = $this->get('admin/pages/edit/updatetreenodes?ids=' . $page1->ID);
99
        $this->assertEquals(200, $result->getStatusCode());
100
        $this->assertEquals('application/json', $result->getHeader('Content-Type'));
101
        $data = json_decode($result->getBody(), true);
102
        $pageData = $data[$page1->ID];
103
        $this->assertEquals(0, $pageData['ParentID']);
104
        $this->assertEquals($page2->ID, $pageData['NextID']);
105
        $this->assertEmpty($pageData['PrevID']);
106
107
        // check subpage
108
        $result = $this->get('admin/pages/edit/updatetreenodes?ids=' . $page31->ID);
109
        $this->assertEquals(200, $result->getStatusCode());
110
        $this->assertEquals('application/json', $result->getHeader('Content-Type'));
111
        $data = json_decode($result->getBody(), true);
112
        $pageData = $data[$page31->ID];
113
        $this->assertEquals($page3->ID, $pageData['ParentID']);
114
        $this->assertEquals($page32->ID, $pageData['NextID']);
115
        $this->assertEmpty($pageData['PrevID']);
116
117
        // Multiple pages
118
        $result = $this->get('admin/pages/edit/updatetreenodes?ids=' . $page1->ID . ',' . $page2->ID);
119
        $this->assertEquals(200, $result->getStatusCode());
120
        $this->assertEquals('application/json', $result->getHeader('Content-Type'));
121
        $data = json_decode($result->getBody(), true);
122
        $this->assertEquals(2, count($data));
123
124
        // Invalid IDs
125
        $result = $this->get('admin/pages/edit/updatetreenodes?ids=-3');
126
        $this->assertEquals(200, $result->getStatusCode());
127
        $this->assertEquals('application/json', $result->getHeader('Content-Type'));
128
        $data = json_decode($result->getBody(), true);
129
        $this->assertEquals(0, count($data));
130
    }
131
}
132