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

Passed
Pull Request — fix-uploaders (#5518)
by Pedro
26:32 queued 11:35
created

FakeUploadersTest::getUploadedFiles()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 3
nc 1
nop 1
dl 0
loc 5
rs 10
c 1
b 0
f 1
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\FakeUploaderCrudController;
7
use Backpack\CRUD\Tests\config\Models\FakeUploader;
8
use Backpack\CRUD\Tests\config\Models\User;
9
use Illuminate\Http\UploadedFile;
10
use Illuminate\Support\Facades\Storage;
11
12
/**
13
 * @covers Backpack\CRUD\app\Library\Uploaders\Uploader
14
 * @covers Backpack\CRUD\app\Library\Uploaders\SingleFile
15
 * @covers Backpack\CRUD\app\Library\Uploaders\MultipleFiles
16
 */
17
class FakeUploadersTest extends BaseDBCrudPanel
18
{
19
    protected string $testBaseUrl;
20
21
    protected function defineRoutes($router)
22
    {
23
        $router->crud(config('backpack.base.route_prefix').'/fake-uploader', FakeUploaderCrudController::class);
24
    }
25
26
    protected function setUp(): void
27
    {
28
        parent::setUp();
29
        Storage::fake('uploaders');
30
        $this->actingAs(User::find(1));
31
        $this->testBaseUrl = config('backpack.base.route_prefix').'/fake-uploader';
32
    }
33
34
    public function test_it_can_access_the_uploaders_create_page()
35
    {
36
        $response = $this->get($this->testBaseUrl.'/create');
37
        $response->assertStatus(200);
38
    }
39
40
    public function test_it_can_store_uploaded_files()
41
    {
42
        $response = $this->post($this->testBaseUrl, [
43
            'upload' => $this->getUploadedFile('avatar1.jpg'),
44
            'upload_multiple' => $this->getUploadedFiles(['avatar2.jpg', 'avatar3.jpg']),
45
        ]);
46
47
        $response->assertStatus(302);
48
49
        $response->assertRedirect($this->testBaseUrl);
50
51
        $this->assertDatabaseCount('uploaders', 1);
52
53
        $files = Storage::disk('uploaders')->allFiles();
54
55
        $this->assertEquals(3, count($files));
56
57
        $this->assertDatabaseHas('uploaders', [
58
            'id' => 1,
59
            'extras' => json_encode(['upload' => 'avatar1.jpg', 'upload_multiple' => ['avatar2.jpg', 'avatar3.jpg']]),
60
        ]);
61
    }
62
63
    public function test_it_display_the_edit_page_without_files()
64
    {
65
        self::initUploader();
66
67
        $response = $this->get($this->testBaseUrl.'/1/edit');
68
        $response->assertStatus(200);
69
    }
70
71
    public function test_it_display_the_upload_page_with_files()
72
    {
73
        self::initUploaderWithFiles();
74
        $response = $this->get($this->testBaseUrl.'/1/edit');
75
76
        $response->assertStatus(200);
77
78
        $response->assertSee('avatar1.jpg');
79
        $response->assertSee('avatar2.jpg');
80
        $response->assertSee('avatar3.jpg');
81
    }
82
83
    public function test_it_can_update_uploaded_files()
84
    {
85
        self::initUploaderWithFiles();
86
87
        $response = $this->put($this->testBaseUrl.'/1', [
88
            '_method' => 'PUT',
89
            'upload' => $this->getUploadedFile('avatar4.jpg'),
90
            'upload_multiple' => $this->getUploadedFiles(['avatar5.jpg', 'avatar6.jpg']),
91
            'clear_upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'],
92
            'id' => 1,
93
        ]);
94
95
        $response->assertStatus(302);
96
97
        $response->assertRedirect($this->testBaseUrl);
98
99
        $this->assertDatabaseCount('uploaders', 1);
100
101
        $this->assertDatabaseHas('uploaders', [
102
            'extras' => json_encode(['upload' => 'avatar4.jpg', 'upload_multiple' => ['avatar5.jpg', 'avatar6.jpg']]),
103
        ]);
104
105
        $files = Storage::disk('uploaders')->allFiles();
106
107
        $this->assertEquals(3, count($files));
108
109
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar4.jpg'));
110
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar5.jpg'));
111
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar6.jpg'));
112
    }
113
114
    public function test_single_upload_deletes_files_when_updated_without_values()
115
    {
116
        self::initUploaderWithFiles();
117
118
        $response = $this->put($this->testBaseUrl.'/1', [
119
            'upload' => null,
120
            'id' => 1,
121
        ]);
122
123
        $response->assertStatus(302);
124
125
        $response->assertRedirect($this->testBaseUrl);
126
127
        $this->assertDatabaseCount('uploaders', 1);
128
129
        $this->assertDatabaseHas('uploaders', [
130
            'extras' => json_encode(['upload' => null, 'upload_multiple' => ['avatar2.jpg', 'avatar3.jpg']]),
131
        ]);
132
133
        $files = Storage::disk('uploaders')->allFiles();
134
135
        $this->assertEquals(2, count($files));
136
137
        $this->assertFalse(Storage::disk('uploaders')->exists('avatar1.jpg'));
138
    }
139
140
    public function test_it_can_delete_uploaded_files()
141
    {
142
        self::initUploaderWithFiles();
143
144
        $response = $this->delete($this->testBaseUrl.'/1');
145
146
        $response->assertStatus(200);
147
148
        $this->assertDatabaseCount('uploaders', 0);
149
150
        $files = Storage::disk('uploaders')->allFiles();
151
152
        $this->assertEquals(0, count($files));
153
    }
154
155
    public function test_it_keeps_previous_values_unchaged_when_not_deleted()
156
    {
157
        self::initUploaderWithFiles();
158
159
        $response = $this->put($this->testBaseUrl.'/1', [
160
            'upload_multiple' => [null],
161
            'id' => 1,
162
        ]);
163
164
        $response->assertStatus(302);
165
166
        $response->assertRedirect($this->testBaseUrl);
167
168
        $this->assertDatabaseCount('uploaders', 1);
169
170
        $this->assertDatabaseHas('uploaders', [
171
            'extras' => json_encode(['upload_multiple' => ['avatar2.jpg',  'avatar3.jpg'], 'upload' => 'avatar1.jpg']),
172
        ]);
173
174
        $files = Storage::disk('uploaders')->allFiles();
175
176
        $this->assertEquals(3, count($files));
177
178
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar1.jpg'));
179
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar2.jpg'));
180
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar3.jpg'));
181
    }
182
183
    public function test_upload_multiple_can_delete_uploaded_files_and_add_at_the_same_time()
184
    {
185
        self::initUploaderWithFiles();
186
187
        $response = $this->put($this->testBaseUrl.'/1', [
188
            'upload_multiple' => $this->getUploadedFiles(['avatar4.jpg',  'avatar5.jpg']),
189
            'clear_upload_multiple' => ['avatar2.jpg'],
190
            'id' => 1,
191
        ]);
192
193
        $response->assertStatus(302);
194
195
        $response->assertRedirect($this->testBaseUrl);
196
197
        $this->assertDatabaseCount('uploaders', 1);
198
199
        $this->assertDatabaseHas('uploaders', [
200
            'extras' => json_encode(['upload_multiple' => ['avatar3.jpg', 'avatar4.jpg',  'avatar5.jpg'], 'upload' => 'avatar1.jpg']),
201
        ]);
202
203
        $files = Storage::disk('uploaders')->allFiles();
204
205
        $this->assertEquals(4, count($files));
206
207
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar1.jpg'));
208
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar3.jpg'));
209
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar4.jpg'));
210
        $this->assertTrue(Storage::disk('uploaders')->exists('avatar5.jpg'));
211
    }
212
213
    protected static function initUploaderWithFiles()
214
    {
215
        UploadedFile::fake()->image('avatar1.jpg')->storeAs('', 'avatar1.jpg', ['disk' => 'uploaders']);
216
        UploadedFile::fake()->image('avatar2.jpg')->storeAs('', 'avatar2.jpg', ['disk' => 'uploaders']);
217
        UploadedFile::fake()->image('avatar3.jpg')->storeAs('', 'avatar3.jpg', ['disk' => 'uploaders']);
218
219
        FakeUploader::create([
220
            'extras' => ['upload' => 'avatar1.jpg', 'upload_multiple' => ['avatar2.jpg',  'avatar3.jpg']],
221
        ]);
222
    }
223
224
    protected static function initUploader()
225
    {
226
        FakeUploader::create([
227
            'extras' => ['upload' => null, 'upload_multiple' => null],
228
        ]);
229
    }
230
231
    protected function getUploadedFile(string $fileName)
232
    {
233
        return new UploadedFile(__DIR__.'/../config/assets/'.$fileName, $fileName, 'image/jpg', null, true);
234
    }
235
236
    protected function getUploadedFiles(array $fileNames)
237
    {
238
        return array_map(function ($fileName) {
239
            return new UploadedFile(__DIR__.'/../config/assets/'.$fileName, $fileName, 'image/jpg', null, true);
240
        }, $fileNames);
241
    }
242
}
243