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  }