Issues (50)

ResourceFieldItemRequestTest.php (2 issues)

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

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

142
        $message = 'Failed asserting array in order. Expected ' . /** @scrutinizer ignore-type */ print_r($expected, true) .
Loading history...
143
            '. Actual: ' . print_r($actual, true);
0 ignored issues
show
Are you sure print_r($actual, true) of type string|true can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

143
            '. Actual: ' . /** @scrutinizer ignore-type */ print_r($actual, true);
Loading history...
144
145
        foreach ($actual as $key => $value) {
146
            $expectedKey = key($expected);
147
            $expectedValue = array_shift($expected);
148
            $this->assertSame($expectedKey, $key, $message);
149
            $this->assertEquals($expectedValue, $value, $message);
150
        }
151
152
        $this->assertEmpty($expected, $message);
153
    }
154
}
155