blob: 8cc800f916d9fa62cf42667e6bcb43d9eb48568c [file] [log] [blame] [edit]
package squirrel
import (
"database/sql"
"testing"
"github.com/stretchr/testify/assert"
)
func TestConcatExpr(t *testing.T) {
b := ConcatExpr("COALESCE(name,", Expr("CONCAT(?,' ',?)", "f", "l"), ")")
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "COALESCE(name,CONCAT(?,' ',?))"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"f", "l"}
assert.Equal(t, expectedArgs, args)
}
func TestConcatExprBadType(t *testing.T) {
b := ConcatExpr("prefix", 123, "suffix")
_, _, err := b.ToSql()
assert.Error(t, err)
assert.Contains(t, err.Error(), "123 is not")
}
func TestEqToSql(t *testing.T) {
b := Eq{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id = ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestEqEmptyToSql(t *testing.T) {
sql, args, err := Eq{}.ToSql()
assert.NoError(t, err)
expectedSql := "(1=1)"
assert.Equal(t, expectedSql, sql)
assert.Empty(t, args)
}
func TestEqInToSql(t *testing.T) {
b := Eq{"id": []int{1, 2, 3}}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id IN (?,?,?)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1, 2, 3}
assert.Equal(t, expectedArgs, args)
}
func TestNotEqToSql(t *testing.T) {
b := NotEq{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id <> ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestEqNotInToSql(t *testing.T) {
b := NotEq{"id": []int{1, 2, 3}}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id NOT IN (?,?,?)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1, 2, 3}
assert.Equal(t, expectedArgs, args)
}
func TestEqInEmptyToSql(t *testing.T) {
b := Eq{"id": []int{}}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "(1=0)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{}
assert.Equal(t, expectedArgs, args)
}
func TestNotEqInEmptyToSql(t *testing.T) {
b := NotEq{"id": []int{}}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "(1=1)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{}
assert.Equal(t, expectedArgs, args)
}
func TestEqBytesToSql(t *testing.T) {
b := Eq{"id": []byte("test")}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id = ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{[]byte("test")}
assert.Equal(t, expectedArgs, args)
}
func TestLtToSql(t *testing.T) {
b := Lt{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id < ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestLtOrEqToSql(t *testing.T) {
b := LtOrEq{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id <= ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestGtToSql(t *testing.T) {
b := Gt{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id > ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestGtOrEqToSql(t *testing.T) {
b := GtOrEq{"id": 1}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "id >= ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1}
assert.Equal(t, expectedArgs, args)
}
func TestExprNilToSql(t *testing.T) {
var b Sqlizer
b = NotEq{"name": nil}
sql, args, err := b.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
expectedSql := "name IS NOT NULL"
assert.Equal(t, expectedSql, sql)
b = Eq{"name": nil}
sql, args, err = b.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
expectedSql = "name IS NULL"
assert.Equal(t, expectedSql, sql)
}
func TestNullTypeString(t *testing.T) {
var b Sqlizer
var name sql.NullString
b = Eq{"name": name}
sql, args, err := b.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "name IS NULL", sql)
name.Scan("Name")
b = Eq{"name": name}
sql, args, err = b.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{"Name"}, args)
assert.Equal(t, "name = ?", sql)
}
func TestNullTypeInt64(t *testing.T) {
var userID sql.NullInt64
userID.Scan(nil)
b := Eq{"user_id": userID}
sql, args, err := b.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "user_id IS NULL", sql)
userID.Scan(int64(10))
b = Eq{"user_id": userID}
sql, args, err = b.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{int64(10)}, args)
assert.Equal(t, "user_id = ?", sql)
}
func TestNilPointer(t *testing.T) {
var name *string = nil
eq := Eq{"name": name}
sql, args, err := eq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "name IS NULL", sql)
neq := NotEq{"name": name}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "name IS NOT NULL", sql)
var ids *[]int = nil
eq = Eq{"id": ids}
sql, args, err = eq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "id IS NULL", sql)
neq = NotEq{"id": ids}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "id IS NOT NULL", sql)
var ida *[3]int = nil
eq = Eq{"id": ida}
sql, args, err = eq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "id IS NULL", sql)
neq = NotEq{"id": ida}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Empty(t, args)
assert.Equal(t, "id IS NOT NULL", sql)
}
func TestNotNilPointer(t *testing.T) {
c := "Name"
name := &c
eq := Eq{"name": name}
sql, args, err := eq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{"Name"}, args)
assert.Equal(t, "name = ?", sql)
neq := NotEq{"name": name}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{"Name"}, args)
assert.Equal(t, "name <> ?", sql)
s := []int{1, 2, 3}
ids := &s
eq = Eq{"id": ids}
sql, args, err = eq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{1, 2, 3}, args)
assert.Equal(t, "id IN (?,?,?)", sql)
neq = NotEq{"id": ids}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{1, 2, 3}, args)
assert.Equal(t, "id NOT IN (?,?,?)", sql)
a := [3]int{1, 2, 3}
ida := &a
eq = Eq{"id": ida}
sql, args, err = eq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{1, 2, 3}, args)
assert.Equal(t, "id IN (?,?,?)", sql)
neq = NotEq{"id": ida}
sql, args, err = neq.ToSql()
assert.NoError(t, err)
assert.Equal(t, []interface{}{1, 2, 3}, args)
assert.Equal(t, "id NOT IN (?,?,?)", sql)
}
func TestEmptyAndToSql(t *testing.T) {
sql, args, err := And{}.ToSql()
assert.NoError(t, err)
expectedSql := "(1=1)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{}
assert.Equal(t, expectedArgs, args)
}
func TestEmptyOrToSql(t *testing.T) {
sql, args, err := Or{}.ToSql()
assert.NoError(t, err)
expectedSql := "(1=0)"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{}
assert.Equal(t, expectedArgs, args)
}
func TestLikeToSql(t *testing.T) {
b := Like{"name": "%irrel"}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "name LIKE ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"%irrel"}
assert.Equal(t, expectedArgs, args)
}
func TestNotLikeToSql(t *testing.T) {
b := NotLike{"name": "%irrel"}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "name NOT LIKE ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"%irrel"}
assert.Equal(t, expectedArgs, args)
}
func TestILikeToSql(t *testing.T) {
b := ILike{"name": "sq%"}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "name ILIKE ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"sq%"}
assert.Equal(t, expectedArgs, args)
}
func TestNotILikeToSql(t *testing.T) {
b := NotILike{"name": "sq%"}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "name NOT ILIKE ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"sq%"}
assert.Equal(t, expectedArgs, args)
}
func TestSqlEqOrder(t *testing.T) {
b := Eq{"a": 1, "b": 2, "c": 3}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "a = ? AND b = ? AND c = ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1, 2, 3}
assert.Equal(t, expectedArgs, args)
}
func TestSqlLtOrder(t *testing.T) {
b := Lt{"a": 1, "b": 2, "c": 3}
sql, args, err := b.ToSql()
assert.NoError(t, err)
expectedSql := "a < ? AND b < ? AND c < ?"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{1, 2, 3}
assert.Equal(t, expectedArgs, args)
}