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

Test Setup Failed
Pull Request — main (#5725)
by Pedro
25:49 queued 10:59
created

test_it_can_update_uploaded_files()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 1
eloc 17
c 1
b 1
f 0
nc 1
nop 0
dl 0
loc 29
rs 9.7
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
Bug introduced by
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