@@ -14,11 +14,15 @@ import (
14
14
"runtime"
15
15
"strings"
16
16
"testing"
17
+ "time"
17
18
18
19
_ "embed"
19
20
20
21
"github.com/stretchr/testify/assert"
22
+ "goyave.dev/goyave/v5/util/errors"
21
23
"goyave.dev/goyave/v5/util/fsutil/osfs"
24
+
25
+ stderrors "errors"
22
26
)
23
27
24
28
func deleteFile (path string ) {
@@ -243,8 +247,52 @@ func TestParseMultipartFiles(t *testing.T) {
243
247
//go:embed osfs
244
248
var resources embed.FS
245
249
250
+ type testStatFS struct {
251
+ embed.FS
252
+ }
253
+
254
+ type mockFileInfo struct {}
255
+
256
+ func (fs * mockFileInfo ) Name () string { return "" }
257
+ func (fs * mockFileInfo ) Size () int64 { return 0 }
258
+ func (fs * mockFileInfo ) Mode () fs.FileMode { return 0 }
259
+ func (fs * mockFileInfo ) ModTime () time.Time { return time .Now () }
260
+ func (fs * mockFileInfo ) Sys () any { return nil }
261
+ func (fs * mockFileInfo ) IsDir () bool { return false }
262
+
263
+ func (t testStatFS ) Stat (_ string ) (fileinfo fs.FileInfo , err error ) {
264
+ return & mockFileInfo {}, nil
265
+ }
266
+
267
+ type mockFile struct {
268
+ name string
269
+ }
270
+
271
+ func (f * mockFile ) Stat () (fs.FileInfo , error ) { return nil , nil }
272
+ func (f * mockFile ) Read (_ []byte ) (int , error ) { return 0 , nil }
273
+ func (f * mockFile ) Close () error { return nil }
274
+
275
+ type mockDirEntry struct {}
276
+
277
+ func (f * mockDirEntry ) Name () string { return "" }
278
+ func (f * mockDirEntry ) IsDir () bool { return false }
279
+ func (f * mockDirEntry ) Type () fs.FileMode { return 0 }
280
+ func (f * mockDirEntry ) Info () (fs.FileInfo , error ) { return & mockFileInfo {}, nil }
281
+
282
+ type mockFS struct {}
283
+
284
+ func (e mockFS ) Open (name string ) (fs.File , error ) {
285
+ return & mockFile {
286
+ name : name ,
287
+ }, nil
288
+ }
289
+
290
+ func (e mockFS ) ReadDir (_ string ) ([]fs.DirEntry , error ) {
291
+ return []fs.DirEntry {& mockDirEntry {}}, nil
292
+ }
293
+
246
294
func TestEmbed (t * testing.T ) {
247
- e := Embed { FS : resources }
295
+ e := NewEmbed ( resources )
248
296
249
297
stat , err := e .Stat ("osfs/osfs.go" )
250
298
if ! assert .NoError (t , err ) {
@@ -256,9 +304,57 @@ func TestEmbed(t *testing.T) {
256
304
stat , err = e .Stat ("notadir/osfs.go" )
257
305
assert .Nil (t , stat )
258
306
if assert .NotNil (t , err ) {
259
- e , ok := err .(* fs.PathError )
260
- assert .True (t , ok )
261
- assert .Equal (t , "open" , e .Op )
262
- assert .Equal (t , "notadir/osfs.go" , e .Path )
307
+ e , ok := err .(* errors.Error )
308
+ if assert .True (t , ok ) {
309
+ var fsErr * fs.PathError
310
+ if assert .True (t , stderrors .As (e , & fsErr )) {
311
+ assert .Equal (t , "open" , fsErr .Op )
312
+ assert .Equal (t , "notadir/osfs.go" , fsErr .Path )
313
+ }
314
+ }
263
315
}
316
+
317
+ // Make it so the underlying FS implements
318
+ e .FS = testStatFS {resources }
319
+ stat , err = e .Stat ("osfs/osfs.go" )
320
+ if ! assert .NoError (t , err ) {
321
+ return
322
+ }
323
+ _ , ok := stat .(* mockFileInfo )
324
+ assert .True (t , ok )
325
+
326
+ t .Run ("Open" , func (t * testing.T ) {
327
+ e := NewEmbed (& mockFS {})
328
+
329
+ f , err := e .Open ("" )
330
+ assert .NoError (t , err )
331
+ _ , ok := f .(* mockFile )
332
+ assert .True (t , ok )
333
+ })
334
+ t .Run ("ReadDir" , func (t * testing.T ) {
335
+ e := NewEmbed (& mockFS {})
336
+
337
+ f , err := e .ReadDir ("" )
338
+ assert .NoError (t , err )
339
+ if assert .Len (t , f , 1 ) {
340
+ _ , ok := f [0 ].(* mockDirEntry )
341
+ assert .True (t , ok )
342
+ }
343
+ })
344
+ }
345
+
346
+ func TestEmbedSub (t * testing.T ) {
347
+ t .Run ("err" , func (t * testing.T ) {
348
+ e := NewEmbed (resources )
349
+ sub , err := e .Sub (".." )
350
+ assert .Equal (t , Embed {}, sub )
351
+ assert .Error (t , err )
352
+ })
353
+
354
+ t .Run ("Valid" , func (t * testing.T ) {
355
+ e := NewEmbed (resources )
356
+ sub , err := e .Sub ("osfs.go" ) // It is valid to do this
357
+ assert .NotNil (t , sub .FS )
358
+ assert .NoError (t , err )
359
+ })
264
360
}
0 commit comments