github.com/rjgonzale/pop/v5@v5.1.3-dev/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  }