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  }