gosuki/database/database_test.go

169 lines
2.8 KiB
Go

package database
import (
"os"
"testing"
"github.com/jmoiron/sqlx"
"github.com/mattn/go-sqlite3"
)
const (
TestDB = "testdata/gomarkdb_test.sqlite"
)
func TestNew(t *testing.T) {
// Test buffer format
t.Run("BufferPath", func(t *testing.T) {
db := New("buffer", "", DBTypeInMemoryDSN)
if db.Path != "file:buffer?mode=memory&cache=shared" {
t.Error("invalid buffer path")
}
})
t.Run("MemPath", func(t *testing.T) {
db := New("cache", "", DBTypeCacheDSN)
if db.Path != "file:cache?mode=memory&cache=shared" {
t.Fail()
}
})
t.Run("FilePath", func(t *testing.T) {
db := New("file_test", "/tmp/test/testdb.sqlite", DBTypeFileDSN)
if db.Path != "file:/tmp/test/testdb.sqlite" {
t.Fail()
}
})
t.Run("FileCustomDsn", func(t *testing.T) {
opts := DsnOptions{
"foo": "bar",
"mode": "rw",
}
db := New("file_dsn", "", DBTypeFileDSN, opts)
if db.Path != "file:file_dsn?foo=bar&mode=rw" {
t.Fail()
}
})
t.Run("AppendOptions", func(t *testing.T) {
opts := DsnOptions{
"foo": "bar",
"mode": "rw",
}
db := New("append_opts", "", DBTypeInMemoryDSN, opts)
if db.Path != "file:append_opts?mode=memory&cache=shared&foo=bar&mode=rw" {
t.Fail()
}
})
}
type AlwaysLockedChecker struct {
locked bool
}
func (f *AlwaysLockedChecker) Locked() (bool, error) {
return f.locked, nil
}
type LockedSQLXOpener struct {
handle *sqlx.DB
err sqlite3.Error
}
func (o *LockedSQLXOpener) Open(driver string, dsn string) error {
return o.err
}
func (o *LockedSQLXOpener) Get() *sqlx.DB {
return nil
}
func TestInitLocked(t *testing.T) {
lockedOpener := &LockedSQLXOpener{
handle: nil,
err: sqlite3.Error{Code: sqlite3.ErrBusy},
}
lockCheckerTrue := &AlwaysLockedChecker{locked: true}
lockCheckerFalse := &AlwaysLockedChecker{locked: false}
t.Run("VFSLockChecker", func(t *testing.T) {
testDB := &DB{
Name: "test",
Path: "file:test",
EngineMode: DriverDefault,
LockChecker: lockCheckerTrue,
SQLXOpener: lockedOpener,
Type: DBTypeRegularFile,
}
_, err := testDB.Init()
if err == nil {
t.Fail()
}
if err != ErrVfsLocked {
t.Fail()
}
})
t.Run("SQLXLockChecker", func(t *testing.T) {
testDB := &DB{
Name: "test",
Path: "file:test",
EngineMode: DriverDefault,
LockChecker: lockCheckerFalse,
SQLXOpener: lockedOpener,
Type: DBTypeRegularFile,
}
_, err := testDB.Init()
if err == nil {
t.Fail()
}
if err != ErrVfsLocked {
t.Fail()
}
})
}
func TestGomarkDBCeate(t *testing.T) {
t.Error("if gomark.db does not exist create it")
}
func TestSyncFromGomarkDB(t *testing.T) {
t.Error("sync from gomark db")
}
func TestSyncToGomarkDB(t *testing.T) {
t.Error("sync to gomark db")
}
func TestMain(m *testing.M) {
code := m.Run()
os.Exit(code)
}