Fix integration tests.

This commit is contained in:
zer0sub 2019-05-01 18:23:19 +02:00
parent eccc17dc8a
commit 5c05214ba1
5 changed files with 102 additions and 18 deletions

View file

@ -60,6 +60,20 @@ func newBinaryExpression(lhs, rhs Expression, operator []byte, parent ...Express
return binaryExpression return binaryExpression
} }
func isSimpleOperand(expression Expression) bool {
if _, ok := expression.(*literalExpression); ok {
return true
}
if _, ok := expression.(Column); ok {
return true
}
if _, ok := expression.(FuncExpression); ok {
return true
}
return false
}
func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption) error { func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption) error {
if c.lhs == nil { if c.lhs == nil {
return errors.Newf("nil lhs.") return errors.Newf("nil lhs.")
@ -68,10 +82,9 @@ func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption)
return errors.Newf("nil rhs.") return errors.Newf("nil rhs.")
} }
_, literalLeft := c.lhs.(*literalExpression) wrap := !isSimpleOperand(c.lhs) && !isSimpleOperand(c.rhs)
_, literalRight := c.rhs.(*literalExpression)
if !literalLeft && !literalRight { if wrap {
out.WriteString("(") out.WriteString("(")
} }
@ -85,7 +98,7 @@ func (c *binaryExpression) Serialize(out *queryData, options ...serializeOption)
return err return err
} }
if !literalLeft && !literalRight { if wrap {
out.WriteString(")") out.WriteString(")")
} }

View file

@ -81,8 +81,8 @@ func (us *setStatementImpl) OFFSET(offset int64) SetStatement {
} }
func (us *setStatementImpl) Serialize(out *queryData, options ...serializeOption) error { func (us *setStatementImpl) Serialize(out *queryData, options ...serializeOption) error {
if len(us.selects) == 0 { if len(us.selects) < 2 {
return errors.Newf("UNION statement must have at least one SELECT") return errors.Newf("UNION statement must have at least two SELECT statements.")
} }
out.WriteString("(") out.WriteString("(")

View file

@ -1 +1,71 @@
package sqlbuilder package sqlbuilder
import (
"fmt"
"gotest.tools/assert"
"testing"
)
func TestUnionNoSelect(t *testing.T) {
query, args, err := UNION().Sql()
assert.Assert(t, err != nil)
//fmt.Println(err.Error())
fmt.Print(query, args)
}
func TestUnionOneSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
).Sql()
assert.Assert(t, err != nil)
fmt.Println(err.Error())
fmt.Println(query)
fmt.Println(args)
}
func TestUnionTwoSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2))`)
assert.Equal(t, len(args), 0)
}
func TestUnionThreeSelect(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
table3.SELECT(table3Col1),
).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2) UNION (SELECT table3.col1 AS "table3.col1" FROM db.table3))`)
assert.Equal(t, len(args), 0)
}
func TestUnionWithOrderBy(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).ORDER_BY(table1Col1.Asc()).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2)) ORDER BY table1.col1 ASC`)
assert.Equal(t, len(args), 0)
}
func TestUnionWithLimit(t *testing.T) {
query, args, err := UNION(
table1.SELECT(table1Col1),
table2.SELECT(table2Col3),
).LIMIT(10).OFFSET(11).Sql()
assert.NilError(t, err)
assert.Equal(t, query, `((SELECT table1.col1 AS "table1.col1" FROM db.table1) UNION (SELECT table2.col3 AS "table2.col3" FROM db.table2)) LIMIT $1 OFFSET $2`)
assert.Equal(t, len(args), 2)
}

View file

@ -4,6 +4,8 @@ import (
"database/sql" "database/sql"
"fmt" "fmt"
_ "github.com/lib/pq" _ "github.com/lib/pq"
"github.com/sub0zero/go-sqlbuilder/generator"
"gotest.tools/assert"
"os" "os"
"testing" "testing"
) )
@ -75,3 +77,14 @@ CREATE TABLE IF NOT EXISTS test_sample.link (
fmt.Println(result) fmt.Println(result)
} }
func TestGenerateModel(t *testing.T) {
err := generator.Generate(folderPath, connectString, dbname, schemaName)
assert.NilError(t, err)
//err = generator.Generate(folderPath, connectString, dbname, "sport")
//
//assert.NilError(t, err)
}

View file

@ -2,7 +2,6 @@ package tests
import ( import (
"fmt" "fmt"
"github.com/sub0zero/go-sqlbuilder/generator"
"github.com/sub0zero/go-sqlbuilder/sqlbuilder" "github.com/sub0zero/go-sqlbuilder/sqlbuilder"
"github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/model" "github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/model"
. "github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/table" . "github.com/sub0zero/go-sqlbuilder/tests/.test_files/dvd_rental/dvds/table"
@ -12,17 +11,6 @@ import (
"time" "time"
) )
func TestGenerateModel(t *testing.T) {
err := generator.Generate(folderPath, connectString, dbname, schemaName)
assert.NilError(t, err)
//err = generator.Generate(folderPath, connectString, dbname, "sport")
//
//assert.NilError(t, err)
}
func TestSelect_ScanToStruct(t *testing.T) { func TestSelect_ScanToStruct(t *testing.T) {
actor := model.Actor{} actor := model.Actor{}
query := Actor.SELECT(Actor.AllColumns).ORDER_BY(Actor.ActorID.Asc()) query := Actor.SELECT(Actor.AllColumns).ORDER_BY(Actor.ActorID.Asc())