clair/vendor/github.com/ziutek/mymysql/godrv/driver_test.go
2016-06-07 10:08:50 +02:00

351 lines
6.6 KiB
Go

package godrv
import (
"database/sql"
"fmt"
"github.com/ziutek/mymysql/mysql"
"testing"
"time"
)
func init() {
Register("set names utf8")
}
func checkErr(t *testing.T, err error) {
if err != nil {
t.Fatalf("Error: %v", err)
}
}
func checkErrId(t *testing.T, err error, rid, eid int64) {
checkErr(t, err)
if rid != eid {
t.Fatal("res.LastInsertId() ==", rid, "but should be", eid)
}
}
func TestAll(t *testing.T) {
data := []string{"jeden", "dwa", "trzy"}
db, err := sql.Open("mymysql", "test/testuser/TestPasswd9")
checkErr(t, err)
defer db.Close()
defer db.Exec("DROP TABLE go")
db.Exec("DROP TABLE go")
_, err = db.Exec(
`CREATE TABLE go (
id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
txt TEXT,
n BIGINT
) ENGINE=InnoDB`)
checkErr(t, err)
ins, err := db.Prepare("INSERT go SET txt=?, n=?")
checkErr(t, err)
tx, err := db.Begin()
checkErr(t, err)
res, err := ins.Exec(data[0], 0)
checkErr(t, err)
id, err := res.LastInsertId()
checkErrId(t, err, id, 1)
res, err = ins.Exec(data[1], 1)
checkErr(t, err)
id, err = res.LastInsertId()
checkErrId(t, err, id, 2)
checkErr(t, tx.Commit())
tx, err = db.Begin()
checkErr(t, err)
res, err = tx.Exec("INSERT go SET txt=?, n=?", "cztery", 3)
checkErr(t, err)
id, err = res.LastInsertId()
checkErrId(t, err, id, 3)
checkErr(t, tx.Rollback())
rows, err := db.Query("SELECT * FROM go")
checkErr(t, err)
i := 1
for rows.Next() {
var (
id int
txt string
n int64
)
checkErr(t, rows.Scan(&id, &txt, &n))
if id > len(data) {
t.Fatal("To many rows in table")
}
if id != i || data[i-1] != txt || int64(i-1) != n {
t.Fatalf("txt[%d] == '%s' != '%s'", id, txt, data[id-1])
}
i++
}
checkErr(t, rows.Err())
sel, err := db.Prepare("SELECT * FROM go")
checkErr(t, err)
rows, err = sel.Query()
checkErr(t, err)
i = 1
for rows.Next() {
var (
id int
txt string
n int64
)
checkErr(t, rows.Scan(&id, &txt, &n))
if id > len(data) {
t.Fatal("To many rows in table")
}
if id != i || data[i-1] != txt || int64(i-1) != n {
t.Fatalf("txt[%d] == '%s' != '%s'", id, txt, data[id-1])
}
i++
}
checkErr(t, rows.Err())
sql := "select sum(41) as test"
row := db.QueryRow(sql)
var vi int64
checkErr(t, row.Scan(&vi))
if vi != 41 {
t.Fatal(sql)
}
sql = "select sum(4123232323232) as test"
row = db.QueryRow(sql)
var vf float64
checkErr(t, row.Scan(&vf))
if vf != 4123232323232 {
t.Fatal(sql)
}
}
func TestMediumInt(t *testing.T) {
db, err := sql.Open("mymysql", "test/testuser/TestPasswd9")
checkErr(t, err)
defer db.Exec("DROP TABLE mi")
defer db.Close()
db.Exec("DROP TABLE mi")
_, err = db.Exec(
`CREATE TABLE mi (
id INT PRIMARY KEY AUTO_INCREMENT,
m MEDIUMINT
)`)
checkErr(t, err)
const n = 9
for i := 0; i < n; i++ {
_, err = db.Exec("INSERT mi VALUES (0, ?)", i)
checkErr(t, err)
}
rows, err := db.Query("SELECT * FROM mi")
checkErr(t, err)
var i int
for i = 0; rows.Next(); i++ {
var id, m int
checkErr(t, rows.Scan(&id, &m))
if id != i+1 || m != i {
t.Fatalf("i=%d id=%d m=%d", i, id, m)
}
}
checkErr(t, rows.Err())
if i != n {
t.Fatalf("%d rows read, %d expected", i, n)
}
}
func TestTypes(t *testing.T) {
db, err := sql.Open("mymysql", "test/testuser/TestPasswd9")
checkErr(t, err)
defer db.Close()
defer db.Exec("DROP TABLE t")
db.Exec("DROP TABLE t")
_, err = db.Exec(
`CREATE TABLE t (
i INT NOT NULL,
f DOUBLE NOT NULL,
b BOOL NOT NULL,
s VARCHAR(8) NOT NULL,
d DATETIME NOT NULL,
y DATE NOT NULL,
n INT
) ENGINE=InnoDB`)
checkErr(t, err)
_, err = db.Exec(
`INSERT t VALUES (
23, 0.25, true, 'test', '2013-03-06 21:07', '2013-03-19', NULL
)`,
)
checkErr(t, err)
l, err := time.LoadLocation("Local")
td := time.Date(2013, 3, 6, 21, 7, 0, 0, l)
dd := time.Date(2013, 3, 19, 0, 0, 0, 0, l)
checkErr(t, err)
_, err = db.Exec(
"INSERT t VALUES (?, ?, ?, ?, ?, ?)",
23, 0.25, true, "test", td, dd, nil,
)
rows, err := db.Query("SELECT * FROM t")
checkErr(t, err)
var (
i int64
f float64
b bool
s string
d time.Time
y time.Time
n sql.NullInt64
)
for rows.Next() {
checkErr(t, rows.Scan(&i, &f, &b, &s, &d, &y, &n))
if i != 23 {
t.Fatal("int64", i)
}
if f != 0.25 {
t.Fatal("float64", f)
}
if b != true {
t.Fatal("bool", b)
}
if s != "test" {
t.Fatal("string", s)
}
if d != td {
t.Fatal("time.Time", d)
}
if y != dd {
t.Fatal("time.Time", y)
}
if n.Valid {
t.Fatal("mysql.NullInt64", n)
}
}
}
func TestMultiple(t *testing.T) {
db, err := sql.Open("mymysql", "test/testuser/TestPasswd9")
checkErr(t, err)
defer db.Close()
defer db.Exec("DROP TABLE t")
db.Exec("DROP TABLE t")
_, err = db.Exec(`CREATE TABLE t (
email VARCHAR(16),
password VARCHAR(16),
status VARCHAR(16),
signup_date DATETIME,
zipcode VARCHAR(16),
fname VARCHAR(16),
lname VARCHAR(16)
)`)
checkErr(t, err)
const shortFormat = "2006-01-02 15:04:05"
now := time.Now()
_, err = db.Exec(fmt.Sprintf(`INSERT INTO t (
email,
password,
status,
signup_date,
zipcode,
fname,
lname
) VALUES (
'a@a.com',
'asdf',
'unverified',
'%s',
'111',
'asdf',
'asdf'
);`, now.Format(mysql.TimeFormat)))
checkErr(t, err)
_, err = db.Exec(`INSERT INTO t (
email,
password,
status,
signup_date,
zipcode,
fname,
lname
) VALUES (
?, ?, ?, ?, ?, ?, ?
);`, "a@a.com", "asdf", "unverified", now, "111", "asdf", "asdf")
checkErr(t, err)
_, err = db.Exec(`INSERT INTO t (
email,
password,
status,
signup_date,
zipcode,
fname,
lname
) VALUES (
"a@a.com", 'asdf', ?, ?, ?, ?, 'asdf'
);`, "unverified", now, "111", "asdf")
checkErr(t, err)
rows, err := db.Query("SELECT * FROM t")
checkErr(t, err)
var (
email, password, status, zipcode, fname, lname string
signup_date time.Time
)
n := 0
for rows.Next() {
checkErr(t, rows.Scan(
&email, &password, &status, &signup_date, &zipcode, &fname, &lname,
))
if email != "a@a.com" {
t.Fatal(n, "email:", email)
}
if password != "asdf" {
t.Fatal(n, "password:", password)
}
if status != "unverified" {
t.Fatal(n, "status:", status)
}
e := signup_date.Format(mysql.TimeFormat)
d := signup_date.Format(mysql.TimeFormat)
if e[:len(shortFormat)] != d[:len(shortFormat)] {
t.Fatal(n, "signup_date:", d)
}
if zipcode != "111" {
t.Fatal(n, "zipcode:", zipcode)
}
if fname != "asdf" {
t.Fatal(n, "fname:", fname)
}
if lname != "asdf" {
t.Fatal(n, "lname:", lname)
}
n++
}
if n != 3 {
t.Fatal("Too short result set")
}
}