We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.
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
![]() |
|||
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 |