/
cloudinary_test.go
428 lines (401 loc) · 16.1 KB
/
cloudinary_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
package cloudinary
import (
"context"
"crypto/rand"
"io"
"math/big"
"mime"
"net/http"
"os"
"regexp"
"testing"
"time"
"github.com/gookit/color"
configmocks "github.com/goravel/framework/contracts/config/mocks"
contractsfilesystem "github.com/goravel/framework/contracts/filesystem"
"github.com/goravel/framework/support/carbon"
"github.com/stretchr/testify/assert"
)
func TestStorage(t *testing.T) {
if os.Getenv("CLOUDINARY_ACCESS_KEY_ID") == "" {
color.Redln("No filesystem tests run, please add Cloudinary configuration: CLOUDINARY_ACCESS_KEY_ID= CLOUDINARY_ACCESS_KEY_SECRET= CLOUDINARY_CLOUD= go test ./...")
return
}
assert.Nil(t, os.WriteFile("test.txt", []byte("Goravel"), 0644))
mockConfig := &configmocks.Config{}
mockConfig.On("GetString", "filesystems.disks.cloudinary.key").Return(os.Getenv("CLOUDINARY_ACCESS_KEY_ID"))
mockConfig.On("GetString", "filesystems.disks.cloudinary.secret").Return(os.Getenv("CLOUDINARY_ACCESS_KEY_SECRET"))
mockConfig.On("GetString", "filesystems.disks.cloudinary.cloud").Return(os.Getenv("CLOUDINARY_CLOUD"))
var driver contractsfilesystem.Driver
randNum, err := rand.Int(rand.Reader, big.NewInt(1000))
rootFolder := randNum.String() + "/"
assert.Nil(t, err)
driver, err = NewCloudinary(context.Background(), mockConfig, "cloudinary")
assert.NotNil(t, driver)
assert.Nil(t, err)
tests := []struct {
name string
setup func()
}{
{
name: "AllDirectories",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"AllDirectories/1.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllDirectories/2.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllDirectories/3/3.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllDirectories/3/5/6/6.txt", "Goravel"))
assert.Nil(t, driver.MakeDirectory(rootFolder+"AllDirectories/3/4"))
assert.True(t, driver.Exists(rootFolder+"AllDirectories/1.txt"))
assert.True(t, driver.Exists(rootFolder+"AllDirectories/2.txt"))
assert.True(t, driver.Exists(rootFolder+"AllDirectories/3/3.txt"))
assert.True(t, driver.Exists(rootFolder+"AllDirectories/3/5/6/6.txt"))
files, err := driver.AllDirectories(rootFolder + "AllDirectories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllDirectories/3", rootFolder + "AllDirectories/3/4", rootFolder + "AllDirectories/3/5", rootFolder + "AllDirectories/3/5/6"}, files)
files, err = driver.AllDirectories("./" + rootFolder + "AllDirectories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllDirectories/3", rootFolder + "AllDirectories/3/4", rootFolder + "AllDirectories/3/5", rootFolder + "AllDirectories/3/5/6"}, files)
files, err = driver.AllDirectories("/" + rootFolder + "AllDirectories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllDirectories/3", rootFolder + "AllDirectories/3/4", rootFolder + "AllDirectories/3/5", rootFolder + "AllDirectories/3/5/6"}, files)
files, err = driver.AllDirectories("./" + rootFolder + "AllDirectories/")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllDirectories/3", rootFolder + "AllDirectories/3/4", rootFolder + "AllDirectories/3/5", rootFolder + "AllDirectories/3/5/6"}, files)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"AllDirectories"))
},
},
{
name: "AllFiles",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"AllFiles/1.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllFiles/2.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllFiles/3/3.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"AllFiles/3/4/4.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"AllFiles/1.txt"))
assert.True(t, driver.Exists(rootFolder+"AllFiles/2.txt"))
assert.True(t, driver.Exists(rootFolder+"AllFiles/3/3.txt"))
assert.True(t, driver.Exists(rootFolder+"AllFiles/3/4/4.txt"))
files, err := driver.AllFiles(rootFolder + "AllFiles")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllFiles/1.txt", rootFolder + "AllFiles/2.txt", rootFolder + "AllFiles/3/3.txt", rootFolder + "AllFiles/3/4/4.txt"}, files)
files, err = driver.AllFiles("./" + rootFolder + "AllFiles")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllFiles/1.txt", rootFolder + "AllFiles/2.txt", rootFolder + "AllFiles/3/3.txt", rootFolder + "AllFiles/3/4/4.txt"}, files)
files, err = driver.AllFiles("/" + rootFolder + "AllFiles")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllFiles/1.txt", rootFolder + "AllFiles/2.txt", rootFolder + "AllFiles/3/3.txt", rootFolder + "AllFiles/3/4/4.txt"}, files)
files, err = driver.AllFiles("./" + rootFolder + "AllFiles/")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "AllFiles/1.txt", rootFolder + "AllFiles/2.txt", rootFolder + "AllFiles/3/3.txt", rootFolder + "AllFiles/3/4/4.txt"}, files)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"AllFiles"))
},
},
{
name: "Copy",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Copy/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Copy/1.txt"))
assert.Nil(t, driver.Copy(rootFolder+"Copy/1.txt", rootFolder+"Copy1/1.txt"))
assert.True(t, driver.Exists(rootFolder+"Copy/1.txt"))
assert.True(t, driver.Exists(rootFolder+"Copy1/1.txt"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Copy"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Copy1"))
},
},
{
name: "Delete",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Delete/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Delete/1.txt"))
assert.Nil(t, driver.Delete(rootFolder+"Delete/1.txt"))
assert.True(t, driver.Missing(rootFolder+"Delete/1.txt"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Delete"))
},
},
{
name: "DeleteDirectory",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"DeleteDirectory/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"DeleteDirectory/1.txt"))
fileInfo := &File{path: "logo.png"}
path, err := driver.PutFile(rootFolder+"DeleteDirectory", fileInfo)
assert.Nil(t, err)
assert.True(t, driver.Exists(path))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"DeleteDirectory"))
assert.True(t, driver.Missing(rootFolder+"DeleteDirectory/1.txt"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"DeleteDirectory"))
},
},
{
name: "Directories",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Directories/1.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Directories/2.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Directories/3/3.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Directories/3/5/5.txt", "Goravel"))
assert.Nil(t, driver.MakeDirectory(rootFolder+"Directories/3/4"))
assert.True(t, driver.Exists(rootFolder+"Directories/1.txt"))
assert.True(t, driver.Exists(rootFolder+"Directories/2.txt"))
assert.True(t, driver.Exists(rootFolder+"Directories/3/3.txt"))
assert.True(t, driver.Exists(rootFolder+"Directories/3/5/5.txt"))
files, err := driver.Directories(rootFolder + "Directories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Directories/3"}, files)
files, err = driver.Directories("./" + rootFolder + "Directories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Directories/3"}, files)
files, err = driver.Directories("/" + rootFolder + "Directories")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Directories/3"}, files)
files, err = driver.Directories("./" + rootFolder + "Directories/")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Directories/3"}, files)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Directories"))
},
},
{
name: "Files",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Files/1.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Files/2.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Files/3/3.txt", "Goravel"))
assert.Nil(t, driver.Put(rootFolder+"Files/3/4/4.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Files/1.txt"))
assert.True(t, driver.Exists(rootFolder+"Files/2.txt"))
assert.True(t, driver.Exists(rootFolder+"Files/3/3.txt"))
assert.True(t, driver.Exists(rootFolder+"Files/3/4/4.txt"))
files, err := driver.Files(rootFolder + "Files")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Files/1.txt", rootFolder + "Files/2.txt"}, files)
files, err = driver.Files("./" + rootFolder + "Files")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Files/1.txt", rootFolder + "Files/2.txt"}, files)
files, err = driver.Files("/" + rootFolder + "Files")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Files/1.txt", rootFolder + "Files/2.txt"}, files)
files, err = driver.Files("./" + rootFolder + "Files/")
assert.Nil(t, err)
assert.Equal(t, []string{rootFolder + "Files/1.txt", rootFolder + "Files/2.txt"}, files)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Files"))
},
},
{
name: "Get",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Get/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Get/1.txt"))
data, err := driver.Get(rootFolder + "Get/1.txt")
assert.Nil(t, err)
assert.Equal(t, "Goravel", data)
length, err := driver.Size(rootFolder + "Get/1.txt")
assert.Nil(t, err)
assert.Equal(t, int64(7), length)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Get"))
},
},
{
name: "LastModified",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"LastModified/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"LastModified/1.txt"))
assert.Nil(t, driver.Put(rootFolder+"LastModified/1.txt", "Goravel-new"))
date, err := driver.LastModified(rootFolder + "LastModified/1.txt")
assert.Nil(t, err)
l, err := time.LoadLocation("UTC")
assert.Nil(t, err)
assert.Equal(t, carbon.Now().ToStdTime().In(l).Format("2006-01-02 15"), date.Format("2006-01-02 15"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"LastModified"))
},
},
{
name: "MakeDirectory",
setup: func() {
assert.Nil(t, driver.MakeDirectory(rootFolder+"MakeDirectory1/"))
assert.Nil(t, driver.MakeDirectory(rootFolder+"MakeDirectory2"))
assert.Nil(t, driver.MakeDirectory(rootFolder+"MakeDirectory3/MakeDirectory4"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"MakeDirectory1"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"MakeDirectory2"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"MakeDirectory3"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"MakeDirectory4"))
},
},
{
name: "MimeType",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"MimeType/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"MimeType/1.txt"))
mimeType, err := driver.MimeType(rootFolder + "MimeType/1.txt")
assert.Nil(t, err)
mediaType, _, err := mime.ParseMediaType(mimeType)
assert.Nil(t, err)
assert.Equal(t, "raw", mediaType)
fileInfo := &File{path: "logo.png"}
path, err := driver.PutFile(rootFolder+"MimeType", fileInfo)
assert.Nil(t, err)
assert.True(t, driver.Exists(path))
mimeType, err = driver.MimeType(path)
assert.Nil(t, err)
assert.Equal(t, "image/png", mimeType)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"MimeType"))
},
},
{
name: "Move",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Move/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Move/1.txt"))
assert.Nil(t, driver.Move(rootFolder+"Move/1.txt", rootFolder+"Move1/1.txt"))
assert.True(t, driver.Missing(rootFolder+"Move/1.txt"))
assert.True(t, driver.Exists(rootFolder+"Move1/1.txt"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Move"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Move1"))
},
},
{
name: "Put",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Put/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Put/1.txt"))
assert.True(t, driver.Missing(rootFolder+"Put/2.txt"))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Put"))
},
},
{
name: "PutFile_Image",
setup: func() {
fileInfo := &File{path: "logo.png"}
path, err := driver.PutFile(rootFolder+"PutFile1", fileInfo)
assert.Nil(t, err)
assert.True(t, driver.Exists(path))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"PutFile1"))
},
},
{
name: "PutFile_Text",
setup: func() {
fileInfo := &File{path: "test.txt"}
path, err := driver.PutFile(rootFolder+"PutFile", fileInfo)
assert.Nil(t, err)
assert.True(t, driver.Exists(path))
data, err := driver.Get(path)
assert.Nil(t, err)
assert.Equal(t, "Goravel", data)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"PutFile"))
},
},
{
name: "PutFileAs_Text",
setup: func() {
fileInfo := &File{path: "test.txt"}
path, err := driver.PutFileAs(rootFolder+"PutFileAs", fileInfo, "text")
assert.Nil(t, err)
assert.Equal(t, rootFolder+"PutFileAs/text.txt", path)
assert.True(t, driver.Exists(path))
data, err := driver.Get(path)
assert.Nil(t, err)
assert.Equal(t, "Goravel", data)
path, err = driver.PutFileAs(rootFolder+"PutFileAs", fileInfo, "text1.txt")
assert.Nil(t, err)
assert.Equal(t, rootFolder+"PutFileAs/text1.txt", path)
assert.True(t, driver.Exists(path))
data, err = driver.Get(path)
assert.Nil(t, err)
assert.Equal(t, "Goravel", data)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"PutFileAs"))
},
},
{
name: "PutFileAs_Image",
setup: func() {
fileInfo := &File{path: "logo.png"}
path, err := driver.PutFileAs(rootFolder+"PutFileAs1", fileInfo, "image")
assert.Nil(t, err)
assert.Equal(t, rootFolder+"PutFileAs1/image", path)
assert.True(t, driver.Exists(path))
path, err = driver.PutFileAs(rootFolder+"PutFileAs1", fileInfo, "image1.png")
assert.Nil(t, err)
assert.Equal(t, rootFolder+"PutFileAs1/image1.png", path)
assert.True(t, driver.Exists(path))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"PutFileAs1"))
},
},
{
name: "Size",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Size/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Size/1.txt"))
length, err := driver.Size(rootFolder + "Size/1.txt")
assert.Nil(t, err)
assert.Equal(t, int64(7), length)
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Size"))
},
},
{
name: "TemporaryUrl",
setup: func() {
url, err := driver.TemporaryUrl(rootFolder+"TemporaryUrl/1.txt", time.Now().Add(5*time.Second))
assert.NotNil(t, err)
assert.Empty(t, url)
},
},
{
name: "Url",
setup: func() {
assert.Nil(t, driver.Put(rootFolder+"Url/1.txt", "Goravel"))
assert.True(t, driver.Exists(rootFolder+"Url/1.txt"))
url := driver.Url(rootFolder + "Url/1.txt")
matches := regexp.MustCompile(`/v\d+/(.+)`).FindStringSubmatch(url)
assert.Equal(t, rootFolder+"Url/1.txt", matches[1])
resp, err := http.Get(url)
assert.Nil(t, err)
content, err := io.ReadAll(resp.Body)
assert.Nil(t, resp.Body.Close())
assert.Nil(t, err)
assert.Equal(t, "Goravel", string(content))
assert.Nil(t, driver.DeleteDirectory(rootFolder+"Url"))
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
test.setup()
})
}
assert.Nil(t, os.Remove("test.txt"))
}
type File struct {
path string
}
func (f *File) Disk(disk string) contractsfilesystem.File {
return &File{}
}
func (f *File) Extension() (string, error) {
return "", nil
}
func (f *File) File() string {
return f.path
}
func (f *File) GetClientOriginalName() string {
return ""
}
func (f *File) GetClientOriginalExtension() string {
return ""
}
func (f *File) HashName(path ...string) string {
return ""
}
func (f *File) LastModified() (time.Time, error) {
return time.Now(), nil
}
func (f *File) MimeType() (string, error) {
return "", nil
}
func (f *File) Size() (int64, error) {
return 0, nil
}
func (f *File) Store(path string) (string, error) {
return "", nil
}
func (f *File) StoreAs(path string, name string) (string, error) {
return "", nil
}