github.com/ncruces/go-sqlite3@v0.15.1-0.20240520133447-53eef1510ff0/ext/fileio/write_test.go (about) 1 package fileio 2 3 import ( 4 "database/sql" 5 "io/fs" 6 "path/filepath" 7 "testing" 8 "time" 9 10 "github.com/ncruces/go-sqlite3" 11 "github.com/ncruces/go-sqlite3/driver" 12 _ "github.com/ncruces/go-sqlite3/embed" 13 _ "github.com/ncruces/go-sqlite3/tests/testcfg" 14 ) 15 16 func Test_writefile(t *testing.T) { 17 t.Parallel() 18 19 db, err := driver.Open(":memory:", func(c *sqlite3.Conn) error { 20 Register(c) 21 return nil 22 }) 23 if err != nil { 24 t.Fatal(err) 25 } 26 defer db.Close() 27 28 dir := t.TempDir() 29 link := filepath.Join(dir, "link") 30 file := filepath.Join(dir, "test.txt") 31 nest := filepath.Join(dir, "tmp", "test.txt") 32 sock := filepath.Join(dir, "sock") 33 twosday := time.Date(2022, 2, 22, 22, 22, 22, 0, time.UTC) 34 35 _, err = db.Exec(`SELECT writefile(?, 'Hello world!')`, file) 36 if err != nil { 37 t.Fatal(err) 38 } 39 40 _, err = db.Exec(`SELECT writefile(?, ?, ?)`, link, "test.txt", fs.ModeSymlink) 41 if err != nil { 42 t.Fatal(err) 43 } 44 45 _, err = db.Exec(`SELECT writefile(?, ?, ?, ?)`, dir, nil, 0040700, twosday.Unix()) 46 if err != nil { 47 t.Fatal(err) 48 } 49 50 rows, err := db.Query(`SELECT * FROM fsdir('.', ?)`, dir) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 for rows.Next() { 56 var name string 57 var mode fs.FileMode 58 var mtime time.Time 59 var data sql.NullString 60 err := rows.Scan(&name, &mode, &mtime, &data) 61 if err != nil { 62 t.Fatal(err) 63 } 64 if mode.IsDir() && !mtime.Equal(twosday) { 65 t.Errorf("got: %v", mtime) 66 } 67 if mode.IsRegular() && data.String != "Hello world!" { 68 t.Errorf("got: %v", data) 69 } 70 if mode&fs.ModeSymlink != 0 && data.String != "test.txt" { 71 t.Errorf("got: %v", data) 72 } 73 } 74 75 _, err = db.Exec(`SELECT writefile(?, 'Hello world!')`, nest) 76 if err != nil { 77 t.Fatal(err) 78 } 79 80 _, err = db.Exec(`SELECT writefile(?, ?, ?)`, sock, nil, fs.ModeSocket) 81 if err == nil { 82 t.Fatal("want error") 83 } else { 84 t.Log(err) 85 } 86 87 _, err = db.Exec(`SELECT writefile()`) 88 if err == nil { 89 t.Fatal("want error") 90 } else { 91 t.Log(err) 92 } 93 }