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