jet/sqlbuilder/insert_statement_test.go

149 lines
3.2 KiB
Go
Raw Normal View History

2019-04-07 09:58:12 +02:00
package sqlbuilder
import (
"gotest.tools/assert"
"testing"
"time"
)
2019-06-16 11:20:44 +02:00
func TestInvalidInsert(t *testing.T) {
assertStatementErr(t, table1.INSERT(table1Col1), "no row values or query specified")
assertStatementErr(t, table1.INSERT(table1Col1, table1ColFloat).VALUES(11), "number of values does not match number of columns")
assertStatementErr(t, table1.INSERT(nil).VALUES(1), "nil column in columns list")
2019-04-07 09:58:12 +02:00
}
func TestInsertNilValue(t *testing.T) {
2019-06-16 11:20:44 +02:00
assertStatement(t, table1.INSERT(table1Col1).VALUES(nil), `
2019-05-12 18:15:23 +02:00
INSERT INTO db.table1 (col1) VALUES
($1);
2019-06-16 11:20:44 +02:00
`, nil)
2019-04-07 09:58:12 +02:00
}
func TestInsertSingleValue(t *testing.T) {
2019-06-16 11:20:44 +02:00
assertStatement(t, table1.INSERT(table1Col1).VALUES(1), `
2019-05-12 18:15:23 +02:00
INSERT INTO db.table1 (col1) VALUES
($1);
2019-06-16 11:20:44 +02:00
`, int(1))
}
func TestInsertWithColumnList(t *testing.T) {
columnList := ColumnList{table3ColInt, table3StrCol}
assertStatement(t, table3.INSERT(columnList).VALUES(1, 3), `
INSERT INTO db.table3 (colInt, col2) VALUES
($1, $2);
`, 1, 3)
2019-04-07 09:58:12 +02:00
}
func TestInsertDate(t *testing.T) {
date := time.Date(1999, 1, 2, 3, 4, 5, 0, time.UTC)
2019-06-16 11:20:44 +02:00
assertStatement(t, table1.INSERT(table1ColTime).VALUES(date), `
2019-05-29 14:03:38 +02:00
INSERT INTO db.table1 (colTime) VALUES
2019-05-12 18:15:23 +02:00
($1);
2019-06-16 11:20:44 +02:00
`, date)
2019-04-07 09:58:12 +02:00
}
func TestInsertMultipleValues(t *testing.T) {
2019-06-16 11:20:44 +02:00
assertStatement(t, table1.INSERT(table1Col1, table1ColFloat, table1Col3).VALUES(1, 2, 3), `
INSERT INTO db.table1 (col1, colFloat, col3) VALUES
2019-05-12 18:15:23 +02:00
($1, $2, $3);
2019-06-16 11:20:44 +02:00
`, 1, 2, 3)
2019-04-07 09:58:12 +02:00
}
func TestInsertMultipleRows(t *testing.T) {
stmt := table1.INSERT(table1Col1, table1ColFloat).
2019-04-07 09:58:12 +02:00
VALUES(1, 2).
VALUES(11, 22).
VALUES(111, 222)
2019-06-16 11:20:44 +02:00
assertStatement(t, stmt, `
INSERT INTO db.table1 (col1, colFloat) VALUES
2019-05-12 18:15:23 +02:00
($1, $2),
($3, $4),
($5, $6);
2019-06-16 11:20:44 +02:00
`, 1, 2, 11, 22, 111, 222)
2019-04-07 09:58:12 +02:00
}
func TestInsertValuesFromModel(t *testing.T) {
type Table1Model struct {
2019-06-11 12:47:35 +02:00
Col1 *int
ColFloat float64
2019-04-07 09:58:12 +02:00
}
2019-06-11 12:47:35 +02:00
one := 1
2019-04-07 09:58:12 +02:00
toInsert := Table1Model{
2019-06-11 12:47:35 +02:00
Col1: &one,
ColFloat: 1.11,
2019-04-07 09:58:12 +02:00
}
stmt := table1.INSERT(table1Col1, table1ColFloat).
USING(toInsert).
USING(&toInsert)
2019-04-07 09:58:12 +02:00
2019-06-11 12:47:35 +02:00
expectedSql := `
INSERT INTO db.table1 (col1, colFloat) VALUES
2019-06-11 12:47:35 +02:00
($1, $2),
($3, $4);
`
assertStatement(t, stmt, expectedSql, int(1), float64(1.11), int(1), float64(1.11))
2019-04-07 09:58:12 +02:00
}
func TestInsertValuesFromModelColumnMismatch(t *testing.T) {
defer func() {
r := recover()
assert.Equal(t, r, "missing struct field for column : col1")
}()
2019-04-07 09:58:12 +02:00
type Table1Model struct {
Col1Prim int
Col2 string
}
newData := Table1Model{
2019-04-07 09:58:12 +02:00
Col1Prim: 1,
Col2: "one",
}
2019-06-16 11:20:44 +02:00
table1.
INSERT(table1Col1, table1ColFloat).
USING(newData)
2019-04-07 09:58:12 +02:00
}
2019-04-07 16:54:06 +02:00
func TestInsertFromNonStructModel(t *testing.T) {
defer func() {
r := recover()
assert.Equal(t, r, "argument mismatch: expected struct, got []int")
}()
table2.INSERT(table2ColInt).USING([]int{})
}
2019-04-07 16:54:06 +02:00
func TestInsertQuery(t *testing.T) {
stmt := table1.INSERT(table1Col1).
QUERY(table1.SELECT(table1Col1))
var expectedSql = `
INSERT INTO db.table1 (col1) (
SELECT table1.col1 AS "table1.col1"
FROM db.table1
);
`
assertStatement(t, stmt, expectedSql)
2019-04-07 16:54:06 +02:00
}
func TestInsertDefaultValue(t *testing.T) {
stmt := table1.INSERT(table1Col1, table1ColFloat).
2019-04-07 16:54:06 +02:00
VALUES(DEFAULT, "two")
var expectedSql = `
INSERT INTO db.table1 (col1, colFloat) VALUES
(DEFAULT, $1);
`
2019-04-07 16:54:06 +02:00
assertStatement(t, stmt, expectedSql, "two")
2019-04-07 16:54:06 +02:00
}