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
Push — add-uploaders-tests ( ce6830...a0b017 )
by Pedro
11:44
created

FakeUploadersTest::setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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