github.com/ncruces/go-sqlite3@v0.15.1-0.20240520133447-53eef1510ff0/ext/fileio/fsdir_test.go (about) 1 package fileio_test 2 3 import ( 4 "bytes" 5 "database/sql" 6 "io/fs" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/ncruces/go-sqlite3" 12 "github.com/ncruces/go-sqlite3/driver" 13 _ "github.com/ncruces/go-sqlite3/embed" 14 "github.com/ncruces/go-sqlite3/ext/fileio" 15 _ "github.com/ncruces/go-sqlite3/tests/testcfg" 16 ) 17 18 func Test_fsdir(t *testing.T) { 19 t.Parallel() 20 21 for _, fsys := range []fs.FS{nil, os.DirFS(".")} { 22 t.Run("", func(t *testing.T) { 23 db, err := driver.Open(":memory:", func(c *sqlite3.Conn) error { 24 fileio.RegisterFS(c, fsys) 25 return nil 26 }) 27 if err != nil { 28 t.Fatal(err) 29 } 30 defer db.Close() 31 32 rows, err := db.Query(`SELECT * FROM fsdir('.', '.')`) 33 if err != nil { 34 t.Fatal(err) 35 } 36 37 for rows.Next() { 38 var name string 39 var mode fs.FileMode 40 var mtime time.Time 41 var data sql.RawBytes 42 err := rows.Scan(&name, &mode, sqlite3.TimeFormatUnixFrac.Scanner(&mtime), &data) 43 if err != nil { 44 t.Fatal(err) 45 } 46 if mode.Perm() == 0 { 47 t.Errorf("got: %v", mode) 48 } 49 if mtime.Before(time.Unix(0, 0)) { 50 t.Errorf("got: %v", mtime) 51 } 52 if name == "fsdir_test.go" { 53 if !bytes.HasPrefix(data, []byte("package fileio_test")) { 54 t.Errorf("got: %s", data[:min(64, len(data))]) 55 } 56 } 57 } 58 }) 59 } 60 } 61 62 func Test_fsdir_errors(t *testing.T) { 63 t.Parallel() 64 65 db, err := sqlite3.Open(":memory:") 66 if err != nil { 67 t.Fatal(err) 68 } 69 defer db.Close() 70 71 fileio.Register(db) 72 73 err = db.Exec(`SELECT name FROM fsdir()`) 74 if err == nil { 75 t.Fatal("want error") 76 } else { 77 t.Log(err) 78 } 79 }