You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
5.6 KiB
Go
213 lines
5.6 KiB
Go
10 years ago
|
package db
|
||
|
|
||
|
import (
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path"
|
||
|
"testing"
|
||
|
|
||
|
. "gopkg.in/check.v1"
|
||
|
)
|
||
|
|
||
|
// Hook up gocheck into the "go test" runner.
|
||
|
func Test(t *testing.T) {
|
||
|
TestingT(t)
|
||
|
}
|
||
|
|
||
|
type DbSuite struct{}
|
||
|
|
||
|
var _ = Suite(&DbSuite{})
|
||
|
|
||
|
/*
|
||
|
* Lowest-layer database tests
|
||
|
*/
|
||
|
|
||
|
func (s *DbSuite) Test_DbFileCreation(c *C) {
|
||
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
c.Assert(db, NotNil)
|
||
|
err = db.Close()
|
||
|
c.Assert(err, IsNil)
|
||
|
}
|
||
|
|
||
10 years ago
|
func (s *DbSuite) Test_TableCreation(c *C) {
|
||
10 years ago
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
defer db.Close()
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
10 years ago
|
r, err := db.Query("SELECT * FROM foo")
|
||
10 years ago
|
c.Assert(err, IsNil)
|
||
|
c.Assert(len(r), Equals, 0)
|
||
|
}
|
||
|
|
||
10 years ago
|
func (s *DbSuite) Test_SimpleStatements(c *C) {
|
||
10 years ago
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
defer db.Close()
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
err = db.Execute("INSERT INTO foo(name) VALUES(\"fiona\")")
|
||
|
c.Assert(err, IsNil)
|
||
10 years ago
|
r, err := db.Query("SELECT * FROM foo")
|
||
10 years ago
|
c.Assert(len(r), Equals, 1)
|
||
|
c.Assert(r[0]["id"], Equals, "1")
|
||
|
c.Assert(r[0]["name"], Equals, "fiona")
|
||
|
|
||
|
err = db.Execute("INSERT INTO foo(name) VALUES(\"dana\")")
|
||
|
c.Assert(err, IsNil)
|
||
10 years ago
|
r, err = db.Query("SELECT * FROM foo")
|
||
10 years ago
|
c.Assert(len(r), Equals, 2)
|
||
|
c.Assert(r[1]["id"], Equals, "2")
|
||
|
c.Assert(r[1]["name"], Equals, "dana")
|
||
|
|
||
|
err = db.Execute("UPDATE foo SET Name='Who knows?' WHERE Id=1")
|
||
|
c.Assert(err, IsNil)
|
||
10 years ago
|
r, err = db.Query("SELECT * FROM foo")
|
||
10 years ago
|
c.Assert(len(r), Equals, 2)
|
||
|
c.Assert(r[0]["id"], Equals, "1")
|
||
|
c.Assert(r[0]["name"], Equals, "Who knows?")
|
||
|
|
||
|
err = db.Execute("DELETE FROM foo WHERE Id=2")
|
||
|
c.Assert(err, IsNil)
|
||
10 years ago
|
r, err = db.Query("SELECT * FROM foo")
|
||
10 years ago
|
c.Assert(len(r), Equals, 1)
|
||
|
c.Assert(r[0]["id"], Equals, "1")
|
||
|
c.Assert(r[0]["name"], Equals, "Who knows?")
|
||
|
|
||
|
err = db.Execute("DELETE FROM foo WHERE Id=1")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
10 years ago
|
for i := 0; i < 10; i++ {
|
||
|
_ = db.Execute("INSERT INTO foo(name) VALUES(\"philip\")")
|
||
|
}
|
||
10 years ago
|
r, err = db.Query("SELECT name FROM foo")
|
||
10 years ago
|
c.Assert(len(r), Equals, 10)
|
||
10 years ago
|
for i := range r {
|
||
|
c.Assert(r[i]["name"], Equals, "philip")
|
||
|
}
|
||
|
}
|
||
10 years ago
|
|
||
10 years ago
|
func (s *DbSuite) Test_FailingSimpleStatements(c *C) {
|
||
10 years ago
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
defer db.Close()
|
||
|
|
||
|
err = db.Execute("INSERT INTO foo(name) VALUES(\"fiona\")")
|
||
|
c.Assert(err, NotNil)
|
||
|
c.Assert(err.Error(), Equals, "no such table: foo")
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, NotNil)
|
||
|
c.Assert(err.Error(), Equals, "table foo already exists")
|
||
|
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(11, \"fiona\")")
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(11, \"fiona\")")
|
||
|
c.Assert(err, NotNil)
|
||
|
c.Assert(err.Error(), Equals, "UNIQUE constraint failed: foo.id")
|
||
|
|
||
|
err = db.Execute("SELECT * FROM bar")
|
||
|
c.Assert(err, NotNil)
|
||
|
c.Assert(err.Error(), Equals, "no such table: bar")
|
||
|
|
||
|
err = db.Execute("utter nonsense")
|
||
|
c.Assert(err, NotNil)
|
||
|
c.Assert(err.Error(), Equals, "near \"utter\": syntax error")
|
||
|
}
|
||
10 years ago
|
|
||
|
func (s *DbSuite) Test_SimpleTransactions(c *C) {
|
||
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
defer db.Close()
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
err = db.StartTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
for i := 0; i < 10; i++ {
|
||
|
_ = db.Execute("INSERT INTO foo(name) VALUES(\"philip\")")
|
||
|
}
|
||
|
err = db.CommitTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
r, err := db.Query("SELECT name FROM foo")
|
||
|
c.Assert(len(r), Equals, 10)
|
||
|
for i := range r {
|
||
|
c.Assert(r[i]["name"], Equals, "philip")
|
||
|
}
|
||
|
|
||
|
err = db.StartTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
for i := 0; i < 10; i++ {
|
||
|
_ = db.Execute("INSERT INTO foo(name) VALUES(\"philip\")")
|
||
|
}
|
||
|
err = db.RollbackTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
r, err = db.Query("SELECT name FROM foo")
|
||
|
c.Assert(len(r), Equals, 10)
|
||
|
for i := range r {
|
||
|
c.Assert(r[i]["name"], Equals, "philip")
|
||
|
}
|
||
|
}
|
||
10 years ago
|
|
||
|
func (s *DbSuite) Test_TransactionsConstraintViolation(c *C) {
|
||
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
defer db.Close()
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
err = db.StartTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(1, \"fiona\")")
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(1, \"fiona\")")
|
||
|
c.Assert(err, NotNil)
|
||
|
err = db.RollbackTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
r, err := db.Query("SELECT * FROM foo")
|
||
|
c.Assert(len(r), Equals, 0)
|
||
|
}
|
||
10 years ago
|
|
||
|
func (s *DbSuite) Test_TransactionsHardFail(c *C) {
|
||
|
dir, err := ioutil.TempDir("", "rqlite-test-")
|
||
|
defer os.RemoveAll(dir)
|
||
|
db := New(path.Join(dir, "test_db"))
|
||
|
|
||
|
err = db.Execute("create table foo (id integer not null primary key, name text)")
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(1, \"fiona\")")
|
||
|
c.Assert(err, IsNil)
|
||
|
|
||
|
err = db.StartTransaction()
|
||
|
c.Assert(err, IsNil)
|
||
|
err = db.Execute("INSERT INTO foo(id, name) VALUES(2, \"dana\")")
|
||
|
c.Assert(err, IsNil)
|
||
|
db.Close()
|
||
|
|
||
10 years ago
|
db = Open(path.Join(dir, "test_db"))
|
||
10 years ago
|
c.Assert(db, NotNil)
|
||
|
r, err := db.Query("SELECT * FROM foo")
|
||
|
c.Assert(len(r), Equals, 1)
|
||
10 years ago
|
c.Assert(r[0]["name"], Equals, "fiona")
|
||
10 years ago
|
db.Close()
|
||
|
}
|