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 (969)

Branch: add-name-parameter-to-form

tests/Feature/UploadersValidationTest.php (1 issue)

Labels
Severity
1
<?php
2
3
namespace Backpack\CRUD\Tests\Feature;
4
5
use Backpack\CRUD\Tests\config\CrudPanel\BaseDBCrudPanel;
6
use Backpack\CRUD\Tests\config\Http\Controllers\UploaderValidationCrudController;
7
use Backpack\CRUD\Tests\config\Models\Uploader;
8
use Backpack\CRUD\Tests\config\Models\User;
9
use Backpack\CRUD\Tests\config\Uploads\HasUploadedFiles;
10
use Illuminate\Http\UploadedFile;
11
use Illuminate\Support\Facades\Storage;
12
13
/**
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
 */
18
class UploadersValidationTest extends BaseDBCrudPanel
19
{
20
    use HasUploadedFiles;
21
22
    protected string $testBaseUrl;
23
24
    protected function defineRoutes($router)
25
    {
26
        $router->crud(config('backpack.base.route_prefix').'/uploader-validation', UploaderValidationCrudController::class);
27
    }
28
29
    protected function setUp(): void
30
    {
31
        parent::setUp();
32
33
        $this->testBaseUrl = config('backpack.base.route_prefix').'/uploader-validation';
34
35
        Storage::fake('uploaders');
36
        $this->actingAs(User::find(1));
0 ignored issues
show
It seems like Backpack\CRUD\Tests\config\Models\User::find(1) can also be of type Illuminate\Database\Eloq...gHasThroughRelationship and null; however, parameter $user of Orchestra\Testbench\TestCase::actingAs() does only seem to accept Illuminate\Contracts\Auth\Authenticatable, 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

36
        $this->actingAs(/** @scrutinizer ignore-type */ User::find(1));
Loading history...
37
    }
38
39
    public function test_it_can_access_the_uploaders_create_page()
40
    {
41
        $response = $this->get($this->testBaseUrl.'/create');
42
        $response->assertStatus(200);
43
    }
44
45
    public function test_it_can_store_uploaded_files()
46
    {
47
        $response = $this->post($this->testBaseUrl, [
48
            'upload' => $this->getUploadedFile('avatar1.jpg'),
49
            'upload_multiple' => $this->getUploadedFiles(['avatar2.jpg', 'avatar3.jpg']),
50
        ]);
51
52
        $response->assertStatus(302);
53
54
        $response->assertRedirect($this->testBaseUrl);
55
56
        $this->assertDatabaseCount('uploaders', 1);
57
58
        $files = Storage::disk('uploaders')->allFiles();
59
60
        $this->assertEquals(3, count($files));
61
62
        $this->assertDatabaseHas('uploaders', [
63
            'upload' => 'avatar1.jpg',
64
            'upload_multiple' => json_encode(['avatar2.jpg',  'avatar3.jpg']),
65
        ]);
66
67
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar1.jpg'));
68
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar2.jpg'));
69
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar3.jpg'));
70
    }
71
72
    public function test_it_display_the_edit_page_without_files()
73
    {
74
        self::initUploader();
75
76
        $response = $this->get($this->testBaseUrl.'/1/edit');
77
        $response->assertStatus(200);
78
    }
79
80
    public function test_it_display_the_upload_page_with_files()
81
    {
82
        self::initUploaderWithImages();
83
84
        $response = $this->get($this->testBaseUrl.'/1/edit');
85
86
        $response->assertStatus(200);
87
88
        $response->assertSee('avatar1.jpg');
89
        $response->assertSee('avatar2.jpg');
90
        $response->assertSee('avatar3.jpg');
91
    }
92
93
    public function test_it_can_update_uploaded_files()
94
    {
95
        self::initUploaderWithFiles();
96
97
        $response = $this->put($this->testBaseUrl.'/1', [
98
            'upload' => $this->getUploadedFile('avatar4.jpg'),
99
            'upload_multiple' => $this->getUploadedFiles(['avatar5.jpg',  'avatar6.jpg']),
100
            'clear_upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'],
101
            'id' => 1,
102
        ]);
103
104
        $response->assertStatus(302);
105
106
        $response->assertRedirect($this->testBaseUrl);
107
108
        $this->assertDatabaseCount('uploaders', 1);
109
110
        $this->assertDatabaseHas('uploaders', [
111
            'upload' => 'avatar4.jpg',
112
            'upload_multiple' => json_encode(['avatar5.jpg',  'avatar6.jpg']),
113
        ]);
114
115
        $files = Storage::disk('uploaders')->allFiles();
116
117
        $this->assertEquals(3, count($files));
118
119
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar4.jpg'));
120
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar5.jpg'));
121
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar6.jpg'));
122
    }
123
124
    public function test_it_can_delete_uploaded_files()
125
    {
126
        self::initUploaderWithImages();
127
128
        $response = $this->delete($this->testBaseUrl.'/1');
129
130
        $response->assertStatus(200);
131
132
        $this->assertDatabaseCount('uploaders', 0);
133
134
        $files = Storage::disk('uploaders')->allFiles();
135
136
        $this->assertEquals(0, count($files));
137
    }
138
139
    public function test_it_keeps_previous_values_unchaged_when_not_deleted()
140
    {
141
        self::initUploaderWithFiles();
142
143
        $response = $this->put($this->testBaseUrl.'/1', [
144
            'upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'],
145
            'id' => 1,
146
        ]);
147
148
        $response->assertStatus(302);
149
150
        $response->assertRedirect($this->testBaseUrl);
151
152
        $this->assertDatabaseCount('uploaders', 1);
153
154
        $this->assertDatabaseHas('uploaders', [
155
            'upload' => 'avatar1.jpg',
156
            'upload_multiple' => json_encode(['avatar2.jpg',  'avatar3.jpg']),
157
        ]);
158
159
        $files = Storage::disk('uploaders')->allFiles();
160
161
        $this->assertEquals(3, count($files));
162
163
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar1.jpg'));
164
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar2.jpg'));
165
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar3.jpg'));
166
    }
167
168
    public function test_upload_multiple_can_delete_uploaded_files_and_add_at_the_same_time()
169
    {
170
        self::initUploaderWithFiles();
171
172
        $response = $this->put($this->testBaseUrl.'/1', [
173
            'upload_multiple' => $this->getUploadedFiles(['avatar4.jpg',  'avatar5.jpg']),
174
            'clear_upload_multiple' => ['avatar2.jpg'],
175
            'id' => 1,
176
        ]);
177
178
        $response->assertStatus(302);
179
180
        $response->assertRedirect($this->testBaseUrl);
181
182
        $this->assertDatabaseCount('uploaders', 1);
183
184
        $this->assertDatabaseHas('uploaders', [
185
            'upload' => 'avatar1.jpg',
186
            'upload_multiple' => json_encode(['avatar3.jpg', 'avatar4.jpg',  'avatar5.jpg']),
187
        ]);
188
189
        $files = Storage::disk('uploaders')->allFiles();
190
191
        $this->assertEquals(4, count($files));
192
193
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar1.jpg'));
194
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar3.jpg'));
195
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar4.jpg'));
196
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar5.jpg'));
197
    }
198
199
    public function test_it_validates_files_on_a_single_upload()
200
    {
201
        $response = $this->post($this->testBaseUrl, [
202
            'upload' => 'not-a-file',
203
            'upload_multiple' => $this->getUploadedFiles(['avatar1.jpg', 'avatar2.jpg']),
204
        ]);
205
206
        $response->assertStatus(302);
207
        $response->assertSessionHasErrors('upload');
208
209
        $this->assertDatabaseCount('uploaders', 0);
210
    }
211
212
    public function test_it_validates_files_on_multiple_uploader()
213
    {
214
        $response = $this->post($this->testBaseUrl, [
215
            'upload' => $this->getUploadedFile('avatar1.jpg'),
216
            'upload_multiple' => array_merge($this->getUploadedFiles(['avatar1.jpg']), ['not-a-file']),
217
        ]);
218
219
        $response->assertStatus(302);
220
        $response->assertSessionHasErrors('upload_multiple');
221
222
        $this->assertDatabaseCount('uploaders', 0);
223
    }
224
225
    public function test_it_validates_mime_types_on_single_and_multi_uploads()
226
    {
227
        $response = $this->post($this->testBaseUrl, [
228
            'upload' => $this->getUploadedFile('avatar1.pdf', 'application/pdf'),
229
            'upload_multiple' => $this->getUploadedFiles(['avatar1.pdf', 'avatar1.pdf'], 'application/pdf'),
230
        ]);
231
232
        $response->assertStatus(302);
233
234
        $response->assertSessionHasErrors('upload_multiple');
235
        $response->assertSessionHasErrors('upload');
236
237
        // assert the error content
238
        $this->assertEquals('The upload multiple field must be a file of type: jpg.', session('errors')->get('upload_multiple')[0]);
239
        $this->assertEquals('The upload field must be a file of type: jpg.', session('errors')->get('upload')[0]);
240
241
        $this->assertDatabaseCount('uploaders', 0);
242
    }
243
244
    public function test_it_validates_file_size_on_single_and_multi_uploads()
245
    {
246
        $response = $this->post($this->testBaseUrl, [
247
            'upload' => $this->getUploadedFile('avatar1_big.jpg'),
248
            'upload_multiple' => $this->getUploadedFiles(['avatar2_big.jpg', 'avatar3_big.jpg']),
249
        ]);
250
251
        $response->assertStatus(302);
252
253
        $response->assertSessionHasErrors('upload_multiple');
254
        $response->assertSessionHasErrors('upload');
255
256
        // assert the error content
257
        $this->assertEquals('The upload multiple field must not be greater than 100 kilobytes.', session('errors')->get('upload_multiple')[0]);
258
        $this->assertEquals('The upload field must not be greater than 100 kilobytes.', session('errors')->get('upload')[0]);
259
260
        $this->assertDatabaseCount('uploaders', 0);
261
    }
262
263
    public function test_it_validates_min_files_on_multi_uploads()
264
    {
265
        $response = $this->post($this->testBaseUrl, [
266
            'upload' => $this->getUploadedFile('avatar1.jpg'),
267
            'upload_multiple' => $this->getUploadedFiles(['avatar2.jpg']),
268
        ]);
269
270
        $response->assertStatus(302);
271
272
        $response->assertSessionHasErrors('upload_multiple');
273
274
        // assert the error content
275
        $this->assertEquals('The upload multiple field must have at least 2 items.', session('errors')->get('upload_multiple')[0]);
276
277
        $this->assertDatabaseCount('uploaders', 0);
278
    }
279
280
    public function test_it_validates_required_files_on_single_and_multi_uploads()
281
    {
282
        $response = $this->post($this->testBaseUrl, [
283
            'upload' => null,
284
            'upload_multiple' => null,
285
        ]);
286
287
        $response->assertStatus(302);
288
289
        $response->assertSessionHasErrors('upload');
290
        $response->assertSessionHasErrors('upload_multiple');
291
292
        // assert the error content
293
        $this->assertEquals('The upload field is required.', session('errors')->get('upload')[0]);
294
        $this->assertEquals('The upload multiple field is required.', session('errors')->get('upload_multiple')[0]);
295
296
        $this->assertDatabaseCount('uploaders', 0);
297
    }
298
299
    public function test_it_validates_required_when_not_present_in_request()
300
    {
301
        $response = $this->post($this->testBaseUrl, []);
302
303
        $response->assertStatus(302);
304
305
        $response->assertSessionHasErrors('upload');
306
        $response->assertSessionHasErrors('upload_multiple');
307
308
        $this->assertEquals('The upload field is required.', session('errors')->get('upload')[0]);
309
        $this->assertEquals('The upload multiple field is required.', session('errors')->get('upload_multiple')[0]);
310
311
        $this->assertDatabaseCount('uploaders', 0);
312
    }
313
314
    public function test_it_validates_required_files_on_single_and_multi_uploads_when_updating()
315
    {
316
        self::initUploader();
317
318
        $response = $this->put($this->testBaseUrl.'/1', [
319
            'upload' => null,
320
            'upload_multiple' => null,
321
            'id' => 1,
322
        ]);
323
324
        $response->assertStatus(302);
325
326
        $response->assertSessionHasErrors('upload');
327
        $response->assertSessionHasErrors('upload_multiple');
328
329
        // assert the error content
330
        $this->assertEquals('The upload field is required.', session('errors')->get('upload')[0]);
331
        $this->assertEquals('The upload multiple field is required.', session('errors')->get('upload_multiple')[0]);
332
333
        $this->assertDatabaseCount('uploaders', 1);
334
    }
335
336
    public function test_it_validates_required_files_on_single_and_multi_uploads_when_updating_with_files()
337
    {
338
        self::initUploaderWithFiles();
339
340
        $response = $this->put($this->testBaseUrl.'/1', [
341
            'upload' => null,
342
            'upload_multiple' => null,
343
            'clear_upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'],
344
            'id' => 1,
345
        ]);
346
347
        $response->assertStatus(302);
348
349
        $response->assertSessionHasErrors('upload');
350
        $response->assertSessionHasErrors('upload_multiple');
351
352
        // assert the error content
353
        $this->assertEquals('The upload field is required.', session('errors')->get('upload')[0]);
354
        $this->assertEquals('The upload multiple field is required.', session('errors')->get('upload_multiple')[0]);
355
356
        $this->assertDatabaseCount('uploaders', 1);
357
    }
358
359
    public function test_it_validates_min_files_on_multi_uploads_when_updating()
360
    {
361
        self::initUploaderWithFiles();
362
363
        $response = $this->put($this->testBaseUrl.'/1', [
364
            'upload_multiple' => $this->getUploadedFiles(['avatar2.jpg']),
365
            'clear_upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'],
366
            'id' => 1,
367
        ]);
368
369
        $response->assertStatus(302);
370
371
        $response->assertSessionHasErrors('upload_multiple');
372
373
        // assert the error content
374
        $this->assertEquals('The upload multiple field must have at least 2 items.', session('errors')->get('upload_multiple')[0]);
375
376
        $this->assertDatabaseCount('uploaders', 1);
377
    }
378
379
    protected static function initUploaderWithImages()
380
    {
381
        UploadedFile::fake()->image('avatar1.jpg')->storeAs('', 'avatar1.jpg', ['disk' => 'uploaders']);
382
        UploadedFile::fake()->image('avatar2.jpg')->storeAs('', 'avatar2.jpg', ['disk' => 'uploaders']);
383
        UploadedFile::fake()->image('avatar3.jpg')->storeAs('', 'avatar3.jpg', ['disk' => 'uploaders']);
384
385
        Uploader::create([
386
            'upload' => 'avatar1.jpg',
387
            'upload_multiple' => json_encode(['avatar2.jpg',  'avatar3.jpg']),
388
        ]);
389
    }
390
391
    protected static function initUploaderWithFiles()
392
    {
393
        UploadedFile::fake()->create('avatar1.jpg')->storeAs('', 'avatar1.jpg', ['disk' => 'uploaders']);
394
        UploadedFile::fake()->create('avatar2.jpg')->storeAs('', 'avatar2.jpg', ['disk' => 'uploaders']);
395
        UploadedFile::fake()->create('avatar3.jpg')->storeAs('', 'avatar3.jpg', ['disk' => 'uploaders']);
396
397
        Uploader::create([
398
            'upload' => 'avatar1.jpg',
399
            'upload_multiple' => json_encode(['avatar2.jpg',  'avatar3.jpg']),
400
        ]);
401
    }
402
403
    protected static function initUploader()
404
    {
405
        Uploader::create([
406
            'upload' => null,
407
            'upload_multiple' => null,
408
        ]);
409
    }
410
}
411