Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Issues (990)

Branch: next

tests/Unit/CrudPanel/CrudPanelValidationTest.php (10 issues)

1
<?php
2
3
namespace Backpack\CRUD\Tests\Unit\CrudPanel;
4
5
use Backpack\CRUD\app\Library\Validation\Rules\ValidUpload;
6
use Backpack\CRUD\app\Library\Validation\Rules\ValidUploadMultiple;
7
use Backpack\CRUD\Tests\config\Http\Requests\UserRequest;
8
use Backpack\CRUD\Tests\config\Models\User;
9
use Illuminate\Http\UploadedFile;
10
11
/**
12
 * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Validation
13
 * @covers Backpack\CRUD\app\Library\CrudPanel\Traits\Read
14
 * @covers Backpack\CRUD\app\Library\Validation\Rules\BackpackCustomRule
15
 * @covers Backpack\CRUD\app\Library\Validation\Rules\ValidUpload
16
 * @covers Backpack\CRUD\app\Library\Validation\Rules\ValidUploadMultiple
17
 * @covers Backpack\CRUD\app\Library\Validation\Rules\Support\HasFiles
18
 */
19
class CrudPanelValidationTest extends \Backpack\CRUD\Tests\config\CrudPanel\BaseCrudPanel
20
{
21
    public function testItThrowsValidationExceptions()
22
    {
23
        $this->crudPanel->setModel(User::class);
24
        $this->crudPanel->setValidation(UserRequest::class);
25
26
        $request = request()->create('users/', 'POST', [
27
            'email' => '[email protected]',
28
            'password' => 'test',
29
        ]);
30
31
        $this->crudPanel->setRequest($request);
32
        $this->expectException(\Illuminate\Validation\ValidationException::class);
33
        $validatedRequest = $this->crudPanel->validateRequest();
0 ignored issues
show
The assignment to $validatedRequest is dead and can be removed.
Loading history...
34
    }
35
36
    public function testItMergesFieldValidationWithRequestValidation()
37
    {
38
        $this->crudPanel->setModel(User::class);
39
        $this->crudPanel->setValidation(UserRequest::class);
40
41
        $request = request()->create('users/', 'POST', [
42
            'name' => 'test name',
43
            'email' => '[email protected]',
44
            'password' => 'test',
45
        ]);
46
47
        $request->setRouteResolver(function () use ($request) {
48
            return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
0 ignored issues
show
The type Backpack\CRUD\Tests\Unit\CrudPanel\Route was not found. Did you mean Route? If so, make sure to prefix the type with \.
Loading history...
49
        });
50
51
        $this->crudPanel->addFields([
52
            [
53
                'name' => 'email',
54
                'validationRules' => 'required',
55
            ],
56
            [
57
                'name' => 'name',
58
            ],
59
            [
60
                'name' => 'password',
61
            ],
62
        ]);
63
64
        $this->crudPanel->setRequest($request);
65
66
        $this->crudPanel->validateRequest();
67
68
        $this->assertEquals(['email'], array_keys($this->crudPanel->getOperationSetting('validationRules')));
0 ignored issues
show
It seems like $this->crudPanel->getOpe...ting('validationRules') can also be of type null; however, parameter $array of array_keys() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

68
        $this->assertEquals(['email'], array_keys(/** @scrutinizer ignore-type */ $this->crudPanel->getOperationSetting('validationRules')));
Loading history...
69
    }
70
71
    public function testItCanGetTheValidationAttributesFromFields()
72
    {
73
        $this->crudPanel->addField([
74
            'name' => 'email',
75
            'validationAttribute' => 'emailed',
76
        ]);
77
78
        $this->crudPanel->setValidation();
79
80
        $this->assertEquals(['email' => 'emailed'], $this->crudPanel->getOperationSetting('validationAttributes'));
81
    }
82
83
    public function testItCanGetTheValidationAttributesFromSubfields()
84
    {
85
        $this->crudPanel->addField([
86
            'name' => 'email',
87
            'subfields' => [
88
                [
89
                    'name' => 'test',
90
                    'validationAttribute' => 'emailed',
91
                ],
92
            ],
93
        ]);
94
95
        $this->crudPanel->setValidation();
96
97
        $this->assertEquals(['email.*.test' => 'emailed'], $this->crudPanel->getOperationSetting('validationAttributes'));
98
    }
99
100
    public function testItMergesAllKindsOfValidation()
101
    {
102
        $this->crudPanel->setModel(User::class);
103
104
        $this->crudPanel->setOperation('create');
105
        $this->crudPanel->setValidation([
106
            'password' => 'required',
107
        ]);
108
        $this->crudPanel->setValidation(UserRequest::class);
109
110
        $request = request()->create('users/', 'POST', [
111
            'name' => '',
112
            'password' => '',
113
            'email' => '',
114
        ]);
115
116
        $request->setRouteResolver(function () use ($request) {
117
            return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
118
        });
119
120
        $this->crudPanel->addFields([
121
            [
122
                'name' => 'email',
123
                'validationRules' => 'required',
124
            ],
125
            [
126
                'name' => 'name',
127
            ],
128
            [
129
                'name' => 'password',
130
            ],
131
        ]);
132
133
        $this->crudPanel->setRequest($request);
134
135
        $this->expectException(\Illuminate\Validation\ValidationException::class);
136
137
        try {
138
            $this->crudPanel->validateRequest();
139
        } catch (\Illuminate\Validation\ValidationException $e) {
140
            $this->assertEquals(['password', 'email', 'name'], array_keys($e->errors()));
141
            throw $e;
142
        }
143
    }
144
145
    public function testItCanGetTheValidationFromFields()
146
    {
147
        $this->crudPanel->setModel(User::class);
148
        $this->crudPanel->setOperation('create');
149
150
        $request = request()->create('users/', 'POST', [
151
            'name' => 'test name',
152
            'email' => '[email protected]',
153
            'password' => 'test',
154
        ]);
155
156
        $request->setRouteResolver(function () use ($request) {
157
            return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
158
        });
159
160
        $this->crudPanel->addField([
161
            'name' => 'email',
162
            'validationRules' => 'required',
163
        ]);
164
165
        $this->crudPanel->addField([
166
            'name' => 'name',
167
            'validationRules' => 'required',
168
            'validationMessages' => [
169
                'required' => 'required ma friend',
170
            ],
171
        ]);
172
173
        $this->crudPanel->addField([
174
            'name' => 'password',
175
            'subfields' => [
176
                [
177
                    'name' => 'test',
178
                    'validationRules' => 'required',
179
                    'validationMessages' => [
180
                        'required' => 'required ma friend',
181
                    ],
182
                ],
183
            ],
184
        ]);
185
186
        $this->crudPanel->setRequest($request);
187
188
        $this->crudPanel->setValidation();
189
190
        $validatedRequest = $this->crudPanel->validateRequest();
0 ignored issues
show
The assignment to $validatedRequest is dead and can be removed.
Loading history...
191
192
        $this->assertEquals(['email', 'name', 'password.*.test'], array_keys($this->crudPanel->getOperationSetting('validationRules')));
0 ignored issues
show
It seems like $this->crudPanel->getOpe...ting('validationRules') can also be of type null; however, parameter $array of array_keys() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

192
        $this->assertEquals(['email', 'name', 'password.*.test'], array_keys(/** @scrutinizer ignore-type */ $this->crudPanel->getOperationSetting('validationRules')));
Loading history...
193
    }
194
195
    public function testItThrowsExceptionWithInvalidValidationClass()
196
    {
197
        $this->crudPanel->setModel(User::class);
198
        $this->crudPanel->setOperation('create');
199
200
        try {
201
            $this->crudPanel->setValidation('\Backpack\CRUD\Tests\config\Models\User');
202
        } catch (\Throwable $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
203
        }
204
        $this->assertEquals(
205
            new \Symfony\Component\HttpKernel\Exception\HttpException(500, 'Please pass setValidation() nothing, a rules array or a FormRequest class.', null, ['developer-error-exception']),
206
            $e
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $e does not seem to be defined for all execution paths leading up to this point.
Loading history...
207
        );
208
    }
209
210
    public function testItCanDisableTheValidation()
211
    {
212
        $this->crudPanel->setModel(User::class);
213
        $this->crudPanel->setOperation('create');
214
        $this->crudPanel->setValidation([
215
            'name' => 'required',
216
            'password' => 'required',
217
        ]);
218
        $this->crudPanel->setValidation(UserRequest::class);
219
        $this->assertEquals(['name', 'password'], array_keys($this->crudPanel->getOperationSetting('validationRules')));
0 ignored issues
show
It seems like $this->crudPanel->getOpe...ting('validationRules') can also be of type null; however, parameter $array of array_keys() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

219
        $this->assertEquals(['name', 'password'], array_keys(/** @scrutinizer ignore-type */ $this->crudPanel->getOperationSetting('validationRules')));
Loading history...
220
221
        $this->crudPanel->disableValidation();
222
        $this->assertEquals([], $this->crudPanel->getOperationSetting('validationRules'));
223
        $this->assertEquals([], $this->crudPanel->getOperationSetting('validationMessages'));
224
        $this->assertEquals([], $this->crudPanel->getOperationSetting('requiredFields'));
225
        $this->assertEquals(false, $this->crudPanel->getFormRequest());
226
    }
227
228
    public function testItCanGetTheRequiredFields()
229
    {
230
        $this->crudPanel->setModel(User::class);
231
        $this->crudPanel->setOperation('create');
232
        $this->assertFalse($this->crudPanel->isRequired('test'));
233
        $this->crudPanel->setValidation([
234
            'email' => 'required',
235
            'password.*.test' => 'required',
236
        ]);
237
238
        $this->crudPanel->setValidation(UserRequest::class);
239
        $this->assertEquals(['email', 'password[test]', 'name'], array_values($this->crudPanel->getOperationSetting('requiredFields')));
0 ignored issues
show
It seems like $this->crudPanel->getOpe...tting('requiredFields') can also be of type null; however, parameter $array of array_values() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

239
        $this->assertEquals(['email', 'password[test]', 'name'], array_values(/** @scrutinizer ignore-type */ $this->crudPanel->getOperationSetting('requiredFields')));
Loading history...
240
        $this->assertTrue($this->crudPanel->isRequired('email'));
241
        $this->assertTrue($this->crudPanel->isRequired('password.test'));
242
        $this->assertTrue($this->crudPanel->isRequired('name'));
243
    }
244
245
    public function testItCanGetTheRequiredFieldsFromCustomRules()
246
    {
247
        $this->crudPanel->setModel(User::class);
248
249
        $this->crudPanel->setValidation([
250
            'email' => ValidUpload::field('required'),
251
            'password' => ValidUploadMultiple::field('required'),
252
        ]);
253
254
        $this->assertEquals(['email', 'password'], array_values($this->crudPanel->getOperationSetting('requiredFields')));
0 ignored issues
show
It seems like $this->crudPanel->getOpe...tting('requiredFields') can also be of type null; however, parameter $array of array_values() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

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

254
        $this->assertEquals(['email', 'password'], array_values(/** @scrutinizer ignore-type */ $this->crudPanel->getOperationSetting('requiredFields')));
Loading history...
255
        $this->assertTrue($this->crudPanel->isRequired('email'));
256
        $this->assertTrue($this->crudPanel->isRequired('password'));
257
    }
258
259
    public function testItCanValidateCustomRules()
260
    {
261
        $this->crudPanel->setModel(User::class);
262
263
        $pdf1 = UploadedFile::fake()->create('test1.pdf', 1000);
264
        $pdf2 = UploadedFile::fake()->create('test2.pdf', 1000);
265
266
        $request = request()->create('users/', 'POST', [
267
            'email' => $pdf1,
268
            'password' => [$pdf1, $pdf2],
269
            'name' => 'test',
270
        ]);
271
272
        $request->setRouteResolver(function () use ($request) {
273
            return (new Route('POST', 'users', ['Backpack\CRUD\Tests\Config\Http\Controllers\UserCrudController', 'create']))->bind($request);
274
        });
275
276
        $this->crudPanel->addFields([
277
            [
278
                'name' => 'password',
279
                'validationRules' => ValidUploadMultiple::field('required')->file('file|mimes:pdf|max:500'),
280
            ],
281
            [
282
                'name' => 'email',
283
                'validationRules' => ValidUpload::field('required')->file('file|mimes:jpg'),
284
            ],
285
        ]);
286
287
        $this->crudPanel->setRequest($request);
288
289
        $this->expectException(\Illuminate\Validation\ValidationException::class);
290
291
        try {
292
            $this->crudPanel->validateRequest();
293
        } catch (\Illuminate\Validation\ValidationException $e) {
294
            $this->assertEquals([
295
                'password' => ['The password field must not be greater than 500 kilobytes.'],
296
                'email' => ['The email field must be a file of type: jpg.'],
297
            ], $e->errors());
298
            throw $e;
299
        }
300
    }
301
}
302