Completed
Pull Request — master (#16)
by Simon
01:15
created

testSavePartialSubmissionFileField()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace Firesphere\PartialUserforms\Tests;
4
5
use Firesphere\PartialUserforms\Controllers\PartialSubmissionController;
6
use Firesphere\PartialUserforms\Models\PartialFieldSubmission;
7
use Firesphere\PartialUserforms\Models\PartialFileFieldSubmission;
8
use Firesphere\PartialUserforms\Models\PartialFormSubmission;
9
use SilverStripe\Control\Director;
10
use SilverStripe\Core\Injector\Injector;
11
use SilverStripe\Dev\FunctionalTest;
12
use SilverStripe\ORM\DataList;
13
use SilverStripe\UserForms\Model\EditableFormField\EditableFileField;
14
use SilverStripe\UserForms\Model\UserDefinedForm;
15
16
/**
17
 * Class PartialSubmissionControllerTest
18
 * @package Firesphere\PartialUserforms\Tests
19
 */
20
class PartialSubmissionControllerTest extends FunctionalTest
21
{
22
    protected static $fixture_file = '../fixtures/partialformtest.yml';
23
24
    /**
25
     * @var PartialSubmissionController
26
     */
27
    protected $controller;
28
29
    public function testClassExists()
30
    {
31
        $this->assertInstanceOf(PartialSubmissionController::class, $this->controller);
32
    }
33
34
    public function testSavePartialSubmissionExists()
35
    {
36
        $this->assertTrue(method_exists($this->controller, 'savePartialSubmission'));
37
    }
38
39
    public function testSavePartialSubmissionFormCreated()
40
    {
41
        // If successful, will return the SubmittedFormID from the session
42
        $id = $this->savePartial(['Field1' => 'Value1']);
43
        $this->assertInternalType('int', $id);
44
45
        $partial = PartialFormSubmission::get()->byID($id);
46
        $this->assertNotNull($partial);
47
    }
48
49
    public function testSavePartialSubmissionFieldCreated()
50
    {
51
        // If successful, will return the SubmittedFormID from the session
52
        $id = $this->savePartial(['Field1' => 'Value1']);
53
        $this->assertInternalType('int', $id);
54
55
        $fields = PartialFieldSubmission::get()->filter(['SubmittedFormID' => $id]);
56
        $this->assertCount(1, $fields);
57
    }
58
59
    public function testSavePartialSubmissionFileField()
60
    {
61
        $form = $this->objFromFixture(UserDefinedForm::class, 'form1');
62
        $form->publishRecursive();
63
        $field = $this->objFromFixture(EditableFileField::class, 'filefield1');
64
        $field->write();
65
        $multipart = [
66
            'name'     => 'file1',
67
            'contents' => fopen(__DIR__ . '/../fixtures/Hans-fullsize-sqr.png', 'rb'),
68
            'filename' => 'Hans-fullsize-sqr.png'
69
        ];
70
71
        $response = Director::test('/partialuserform/save', ['File' => $multipart], [], 'POST');
72
        $this->assertNotNull(PartialFileFieldSubmission::get()->filter(['Name' => 'File']));
73
        $this->assertEquals(201, $response->getStatusCode());
74
    }
75
76
    public function testPartialFormSubmissionExists()
77
    {
78
        // If successful, will return the SubmittedFormID from the session
79
        $id = $this->savePartial(['Field1' => 'Value1', 'Field2' => 'Value2']);
80
81
        // Second submission
82
        $secondId = $this->savePartial(['Field2' => 'Value2']);
83
84
        $this->assertEquals($id, $secondId);
85
    }
86
87
    public function testPartialFormSubmissionExistingField()
88
    {
89
        $values = [
90
            'Field1' => 'Value1',
91
            'Field2' => 'Value2',
92
            'Field3' => 'null'
93
        ];
94
        $id = $this->savePartial($values);
95
        $field3 = PartialFieldSubmission::get()
96
            ->filter([
97
                'Name'            => 'Field3',
98
                'SubmittedFormID' => $id
99
            ])
100
            ->first();
101
102
        $this->assertEquals('null', $field3->Value);
103
104
        // Update the values
105
        $values['Field3'] = 'Value3';
106
        $id = $this->savePartial($values);
107
        $field3 = PartialFieldSubmission::get()
108
            ->filter([
109
                'Name'            => 'Field3',
110
                'SubmittedFormID' => $id
111
            ])
112
            ->first();
113
        $this->assertEquals('Value3', $field3->Value);
114
    }
115
116
    public function testSubmittedFieldName()
117
    {
118
        $values = [
119
            'Field1' => 'Value1',
120
            'Field2' => 'Value2',
121
            'Field3' => 'null'
122
        ];
123
        $id = $this->savePartial($values);
124
        /** @var DataList|PartialFieldSubmission[] $fields */
125
        $fields = PartialFieldSubmission::get()->filter(['SubmittedFormID' => $id]);
126
        $this->assertCount(3, $fields);
127
128
        foreach ($fields as $key => $field) {
129
            $this->assertEquals('Field' . ($key + 1), $field->Name, 'Test field ' . $field->Name);
130
        }
131
    }
132
133
    public function testParent()
134
    {
135
        $values = [
136
            'Field1' => 'Value1',
137
            'Field2' => 'Value2',
138
            'Field3' => 'null'
139
        ];
140
        $id = $this->savePartial($values);
141
        /** @var DataList|PartialFieldSubmission[] $fields */
142
        $partialForm = PartialFormSubmission::get()->byID($id);
143
144
        // No parent class
145
        $this->assertNotEquals(UserDefinedForm::class, $partialForm->ParentClass);
146
147
        $form = UserDefinedForm::create(['Title' => 'Test']);
148
        $formID = $form->write();
149
150
        // With parent class
151
        $partialForm->ParentID = $formID;
152
        $partialForm->ParentClass = get_class($form);
153
154
        $this->assertEquals(UserDefinedForm::class, $partialForm->ParentClass);
155
    }
156
157
    public function testUnwantedFields()
158
    {
159
        $values = [
160
            'Field1'         => 'Value1',
161
            'Field2'         => 'Value2',
162
            'Field3'         => 'null',
163
            'SecurityID'     => '123456789aoeu',
164
            'action_process' => 'Submit'
165
        ];
166
        $id = $this->savePartial($values);
167
        /** @var DataList|PartialFieldSubmission[] $fields */
168
        $fields = PartialFieldSubmission::get()->filter(['SubmittedFormID' => $id]);
169
170
        $items = $fields->column('Name');
171
        $this->assertFalse(in_array('SecurityID', $items, true));
172
        $this->assertFalse(in_array('action_process', $items, true));
173
    }
174
175
    public function testArrayData()
176
    {
177
        $values = [
178
            'Field1' => 'Value1',
179
            'Field2' => 'Value2',
180
            'Field3' => ['Value1', 'Value2']
181
        ];
182
        $id = $this->savePartial($values);
183
        $field3 = PartialFieldSubmission::get()
184
            ->filter([
185
                'Name'            => 'Field3',
186
                'SubmittedFormID' => $id
187
            ])
188
            ->first();
189
        $this->assertEquals('Value1, Value2', $field3->Value);
190
    }
191
192
    /**
193
     * @todo Remove skip test after implementation
194
     */
195
    public function testSaveDataWithExpiredSession()
196
    {
197
        $this->markTestSkipped('Remove skip test once implementation is complete');
198
199
        $values = [
200
            'Field1' => 'Value1',
201
            'Field2' => 'Value2',
202
            'Field3' => ['Value1', 'Value2']
203
        ];
204
205
        $id = $this->savePartial($values);
206
        $this->assertInternalType('int', $id);
207
208
        $partial = PartialFormSubmission::get()->byID($id);
209
        $this->assertNotNull($partial);
210
211
        // Now clear session and save
212
        $this->session()->clear(PartialSubmissionController::SESSION_KEY);
213
        $values['Field1'] = 'NEW VALUE';
214
        $newId = $this->savePartial($values);
215
        $this->assertEquals($id, $newId);
216
    }
217
218
    /**
219
     * Helper function for saving partial submission
220
     * @param array $values
221
     * @return mixed Returns SubmittedFormID on success, otherwise null
222
     */
223
    private function savePartial($values)
224
    {
225
        $response = $this->post('/partialuserform/save', $values);
226
        $this->assertEquals(201, $response->getStatusCode());
227
228
        return $this->session()->get(PartialSubmissionController::SESSION_KEY);
229
    }
230
231
    public function setUp()
232
    {
233
        parent::setUp();
234
        $this->controller = Injector::inst()->get(PartialSubmissionController::class);
235
    }
236
}
237