Completed
Push — master ( a58aad...63ae86 )
by
unknown
11s
created

assertArrayEqualsInOrder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 2
dl 0
loc 13
rs 10
c 0
b 0
f 0
1
<?php
2
namespace SilverStripe\CKANRegistry\Tests\Forms\GridField\GridFieldDetailForm;
3
4
use SilverStripe\Admin\LeftAndMain;
5
use SilverStripe\CKANRegistry\Forms\GridField\GridFieldDetailForm\ResourceFieldItemRequest;
6
use SilverStripe\CKANRegistry\Model\Resource;
7
use SilverStripe\CKANRegistry\Model\ResourceField;
8
use SilverStripe\CKANRegistry\Page\CKANRegistryPage;
9
use SilverStripe\CKANRegistry\Service\ResourcePopulator;
10
use SilverStripe\CKANRegistry\Service\ResourcePopulatorInterface;
11
use SilverStripe\Control\Controller;
12
use SilverStripe\Control\HTTPRequest;
13
use SilverStripe\Core\Injector\Injector;
14
use SilverStripe\Dev\SapphireTest;
15
use SilverStripe\Forms\Form;
16
use SilverStripe\Forms\GridField\GridField;
17
use SilverStripe\Forms\GridField\GridFieldConfig;
18
use SilverStripe\Forms\GridField\GridFieldDetailForm;
19
use SilverStripe\Security\SecurityToken;
20
21
class ResourceFieldItemRequestTest extends SapphireTest
22
{
23
    protected static $fixture_file = 'ResourceFieldItemRequest.yml';
24
25
    protected function setUp()
26
    {
27
        $populator = $this->createMock(ResourcePopulator::class);
28
        Injector::inst()->registerService($populator, ResourcePopulatorInterface::class);
29
30
        $populator->method('populateFields')->willReturnSelf();
31
        $populator->method('populateMetadata')->willReturnSelf();
32
33
        parent::setUp();
34
    }
35
36
    public function testSortingOnResourceSave()
37
    {
38
        $this->moveFieldFixture('subject', 1);
39
40
        /** @var Resource $resource */
41
        $resource = $this->objFromFixture(Resource::class, 'teachers');
42
43
        $this->assertArrayEqualsInOrder(
44
            [
45
                'Subject' => '1',
46
                'First name' => '2',
47
                'Last name' => '3',
48
                'City' => '4',
49
                'School' => '5',
50
                'Gender' => '6',
51
            ],
52
            $resource->Fields()->sort('Position', 'ASC')->map('OriginalLabel', 'Position')->toArray()
53
        );
54
55
        $this->moveFieldFixture('firstname', 5);
56
57
        $this->assertArrayEqualsInOrder(
58
            [
59
                'Subject' => '1',
60
                'Last name' => '2',
61
                'City' => '3',
62
                'School' => '4',
63
                'First name' => '5',
64
                'Gender' => '6',
65
            ],
66
            $resource->Fields()->sort('Position', 'ASC')->map('OriginalLabel', 'Position')->toArray()
67
        );
68
69
        $this->moveFieldFixture('subject', 9);
70
71
        $this->assertArrayEqualsInOrder(
72
            [
73
                'Last name' => '1',
74
                'City' => '2',
75
                'School' => '3',
76
                'First name' => '4',
77
                'Gender' => '5',
78
                'Subject' => '9',
79
            ],
80
            $resource->Fields()->sort('Position', 'ASC')->map('OriginalLabel', 'Position')->toArray()
81
        );
82
83
        $this->moveFieldFixture('gender', 1);
84
85
        $this->assertArrayEqualsInOrder(
86
            [
87
                'Gender' => '1',
88
                'Last name' => '2',
89
                'City' => '3',
90
                'School' => '4',
91
                'First name' => '5',
92
                'Subject' => '9',
93
            ],
94
            $resource->Fields()->sort('Position', 'ASC')->map('OriginalLabel', 'Position')->toArray()
95
        );
96
    }
97
98
    protected function moveFieldFixture($fixture, $newPosition)
99
    {
100
        // Locate the resource fixture and the specified fixture
101
        /** @var Resource $resource */
102
        $resource = $this->objFromFixture(Resource::class, 'teachers');
103
        $field = $this->objFromFixture(ResourceField::class, $fixture);
104
105
        // Form a request
106
        $token = SecurityToken::create();
107
        $request = new HTTPRequest('POST', 'ItemEditForm', [], [
108
            'Position' => $newPosition,
109
            'action_doSave' => 1,
110
            $token->getName() => $token->getValue(),
111
        ]);
112
        $request->setSession(Controller::curr()->getRequest()->getSession());
113
114
        // Build the gridfield and component
115
        $config = GridFieldConfig::create();
116
        $detailForm = new GridFieldDetailForm;
117
        $config->addComponent($detailForm->setItemRequestClass(ResourceFieldItemRequest::class));
118
        $gridField = new GridField('Test', 'Test', $resource->Fields(), $config);
119
        $formMock = $this->createMock(Form::class);
120
        $formMock->method('FormAction')->willReturn('test');
121
        $gridField->setForm($formMock);
122
        $controllerMock = $this->createMock(Controller::class);
123
        $controllerMock->method('Link')->willReturn('test');
124
        $controllerMock->method('getRequest')->willReturn($request);
125
126
        // Create an item request
127
        $itemRequest = new ResourceFieldItemRequest(
128
            $gridField,
129
            $detailForm,
130
            $field,
131
            $controllerMock,
132
            'Test'
133
        );
134
135
        // Handle our request
136
        $itemRequest->handleRequest($request);
137
    }
138
139
    protected function assertArrayEqualsInOrder($expected, $actual)
140
    {
141
        $message = 'Failed asserting array in order. Expected '.print_r($expected, true).
142
            '. Actual: '.print_r($actual, true);
143
144
        foreach ($actual as $key => $value) {
145
            $expectedKey = key($expected);
146
            $expectedValue = array_shift($expected);
147
            $this->assertSame($expectedKey, $key, $message);
148
            $this->assertEquals($expectedValue, $value, $message);
149
        }
150
151
        $this->assertEmpty($expected, $message);
152
    }
153
}
154