github.com/Accefy/pop@v0.0.0-20230428174248-e9f677eab5b9/dialect_sqlite_test.go (about) 1 //go:build sqlite 2 // +build sqlite 3 4 package pop 5 6 import ( 7 "fmt" 8 "path/filepath" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 var sqliteDefaultOptions = map[string]string{"_busy_timeout": "5000", "_fk": "true"} 15 16 func Test_ConnectionDetails_Finalize_SQLite_URL_Only(t *testing.T) { 17 r := require.New(t) 18 19 cd := &ConnectionDetails{ 20 URL: "sqlite3:///tmp/foo.db", 21 } 22 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 23 r.NoError(err) 24 r.Equal("sqlite3", cd.Dialect, "given dialect: N/A") 25 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite3:///tmp/foo.db") 26 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: sqlite3:///tmp/foo.db") 27 } 28 29 func Test_ConnectionDetails_Finalize_SQLite_OverrideOptions_URL_Only(t *testing.T) { 30 r := require.New(t) 31 32 cd := &ConnectionDetails{ 33 URL: "sqlite3:///tmp/foo.db?_fk=false&foo=bar", 34 } 35 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 36 r.NoError(err) 37 r.Equal("sqlite3", cd.Dialect, "given dialect: N/A") 38 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite3:///tmp/foo.db?_fk=false&foo=bar") 39 r.EqualValues(map[string]string{"_fk": "false", "foo": "bar", "_busy_timeout": "5000"}, cd.Options, "given url: sqlite3:///tmp/foo.db?_fk=false&foo=bar") 40 } 41 42 func Test_ConnectionDetails_Finalize_SQLite_SynURL_Only(t *testing.T) { 43 r := require.New(t) 44 45 cd := &ConnectionDetails{ 46 URL: "sqlite:///tmp/foo.db", 47 } 48 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 49 r.NoError(err) 50 r.Equal("sqlite3", cd.Dialect, "given dialect: N/A") 51 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite:///tmp/foo.db") 52 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: sqlite3:///tmp/foo.db") 53 } 54 55 func Test_ConnectionDetails_Finalize_SQLite_Dialect_URL(t *testing.T) { 56 r := require.New(t) 57 cd := &ConnectionDetails{ 58 Dialect: "sqlite3", 59 URL: "sqlite3:///tmp/foo.db", 60 } 61 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 62 r.NoError(err) 63 r.Equal("sqlite3", cd.Dialect, "given dialect: sqlite3") 64 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite3:///tmp/foo.db") 65 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: sqlite3:///tmp/foo.db") 66 } 67 68 func Test_ConnectionDetails_Finalize_SQLite_Dialect_SynURL(t *testing.T) { 69 r := require.New(t) 70 cd := &ConnectionDetails{ 71 Dialect: "sqlite3", 72 URL: "sqlite:///tmp/foo.db", 73 } 74 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 75 r.NoError(err) 76 r.Equal("sqlite3", cd.Dialect, "given dialect: sqlite3") 77 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite:///tmp/foo.db") 78 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: sqlite3:///tmp/foo.db") 79 } 80 81 func Test_ConnectionDetails_Finalize_SQLite_Synonym_URL(t *testing.T) { 82 r := require.New(t) 83 cd := &ConnectionDetails{ 84 Dialect: "sqlite", 85 URL: "sqlite3:///tmp/foo.db", 86 } 87 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 88 r.NoError(err) 89 r.Equal("sqlite3", cd.Dialect, "given dialect: sqlite") 90 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite3:///tmp/foo.db") 91 r.Equal(sqliteDefaultOptions, cd.Options, "given url: sqlite3:///tmp/foo.db") 92 } 93 94 func Test_ConnectionDetails_Finalize_SQLite_Synonym_SynURL(t *testing.T) { 95 r := require.New(t) 96 cd := &ConnectionDetails{ 97 Dialect: "sqlite", 98 URL: "sqlite:///tmp/foo.db", 99 } 100 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 101 r.NoError(err) 102 r.Equal("sqlite3", cd.Dialect, "given dialect: sqlite") 103 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite:///tmp/foo.db") 104 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: sqlite:///tmp/foo.db") 105 } 106 107 func Test_ConnectionDetails_Finalize_SQLite_Synonym_Path(t *testing.T) { 108 r := require.New(t) 109 cd := &ConnectionDetails{ 110 Dialect: "sqlite", 111 Database: "./foo.db", 112 } 113 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 114 r.NoError(err) 115 r.Equal("sqlite3", cd.Dialect, "given dialect: sqlite") 116 r.Equal("./foo.db", cd.Database, "given database: ./foo.db") 117 r.EqualValues(sqliteDefaultOptions, cd.Options, "given url: ./foo.db") 118 } 119 120 func Test_ConnectionDetails_Finalize_SQLite_OverrideOptions_Synonym_Path(t *testing.T) { 121 r := require.New(t) 122 123 cd := &ConnectionDetails{ 124 URL: "sqlite3:///tmp/foo.db?_fk=false&foo=bar", 125 } 126 err := cd.Finalize() // calls withURL() and urlParserSQLite3(cd) 127 r.NoError(err) 128 r.Equal("sqlite3", cd.Dialect, "given dialect: N/A") 129 r.Equal("/tmp/foo.db", cd.Database, "given url: sqlite3:///tmp/foo.db") 130 r.EqualValues(map[string]string{"_fk": "false", "foo": "bar", "_busy_timeout": "5000"}, cd.Options, "given url: sqlite3:///tmp/foo.db?_fk=false&foo=bar") 131 } 132 133 func Test_ConnectionDetails_FinalizeOSPath(t *testing.T) { 134 r := require.New(t) 135 d := t.TempDir() 136 p := filepath.Join(d, "testdb.sqlite") 137 cd := &ConnectionDetails{ 138 Dialect: "sqlite", 139 Database: p, 140 } 141 r.NoError(cd.Finalize()) 142 r.Equal("sqlite3", cd.Dialect) 143 r.EqualValues(p, cd.Database) 144 } 145 146 func TestSqlite_CreateDB(t *testing.T) { 147 r := require.New(t) 148 149 cd := &ConnectionDetails{Dialect: "sqlite"} 150 dialect, err := newSQLite(cd) 151 r.NoError(err) 152 153 t.Run("CreateFile", func(t *testing.T) { 154 dir := t.TempDir() 155 cd.Database = filepath.Join(dir, "testdb.sqlite") 156 157 r.NoError(dialect.CreateDB()) 158 r.FileExists(cd.Database) 159 }) 160 161 t.Run("MemoryDB_tag", func(t *testing.T) { 162 dir := t.TempDir() 163 cd.Database = filepath.Join(dir, "file::memory:?cache=shared") 164 165 r.NoError(dialect.CreateDB()) 166 r.NoFileExists(cd.Database) 167 }) 168 169 t.Run("MemoryDB_only", func(t *testing.T) { 170 dir := t.TempDir() 171 cd.Database = filepath.Join(dir, ":memory:") 172 173 r.NoError(dialect.CreateDB()) 174 r.NoFileExists(cd.Database) 175 }) 176 177 t.Run("MemoryDB_param", func(t *testing.T) { 178 dir := t.TempDir() 179 cd.Database = filepath.Join(dir, "file:foobar?mode=memory&cache=shared") 180 181 r.NoError(dialect.CreateDB()) 182 r.NoFileExists(cd.Database) 183 }) 184 185 t.Run("CreateFile_ExistingDB", func(t *testing.T) { 186 dir := t.TempDir() 187 cd.Database = filepath.Join(dir, "testdb.sqlite") 188 189 r.NoError(dialect.CreateDB()) 190 r.EqualError(dialect.CreateDB(), fmt.Sprintf("could not create SQLite database '%s'; database exists", cd.Database)) 191 }) 192 193 } 194 195 func TestSqlite_NewDriver(t *testing.T) { 196 _, err := newSQLiteDriver() 197 require.NoError(t, err) 198 }