blob: 06ba420a2aacf2ce9065e876a33cc5427ef7b7c4 [file] [log] [blame] [edit]
package squirrel
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestCaseWithVal(t *testing.T) {
caseStmt := Case("number").
When("1", "one").
When("2", "two").
Else(Expr("?", "big number"))
qb := Select().
Column(caseStmt).
From("table")
sql, args, err := qb.ToSql()
assert.NoError(t, err)
expectedSql := "SELECT CASE number " +
"WHEN 1 THEN one " +
"WHEN 2 THEN two " +
"ELSE ? " +
"END " +
"FROM table"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{"big number"}
assert.Equal(t, expectedArgs, args)
}
func TestCaseWithComplexVal(t *testing.T) {
caseStmt := Case("? > ?", 10, 5).
When("true", "'T'")
qb := Select().
Column(Alias(caseStmt, "complexCase")).
From("table")
sql, args, err := qb.ToSql()
assert.NoError(t, err)
expectedSql := "SELECT (CASE ? > ? " +
"WHEN true THEN 'T' " +
"END) AS complexCase " +
"FROM table"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{10, 5}
assert.Equal(t, expectedArgs, args)
}
func TestCaseWithNoVal(t *testing.T) {
caseStmt := Case().
When(Eq{"x": 0}, "x is zero").
When(Expr("x > ?", 1), Expr("CONCAT('x is greater than ', ?)", 2))
qb := Select().Column(caseStmt).From("table")
sql, args, err := qb.ToSql()
assert.NoError(t, err)
expectedSql := "SELECT CASE " +
"WHEN x = ? THEN x is zero " +
"WHEN x > ? THEN CONCAT('x is greater than ', ?) " +
"END " +
"FROM table"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{0, 1, 2}
assert.Equal(t, expectedArgs, args)
}
func TestCaseWithExpr(t *testing.T) {
caseStmt := Case(Expr("x = ?", true)).
When("true", Expr("?", "it's true!")).
Else("42")
qb := Select().Column(caseStmt).From("table")
sql, args, err := qb.ToSql()
assert.NoError(t, err)
expectedSql := "SELECT CASE x = ? " +
"WHEN true THEN ? " +
"ELSE 42 " +
"END " +
"FROM table"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{true, "it's true!"}
assert.Equal(t, expectedArgs, args)
}
func TestMultipleCase(t *testing.T) {
caseStmtNoval := Case(Expr("x = ?", true)).
When("true", Expr("?", "it's true!")).
Else("42")
caseStmtExpr := Case().
When(Eq{"x": 0}, "'x is zero'").
When(Expr("x > ?", 1), Expr("CONCAT('x is greater than ', ?)", 2))
qb := Select().
Column(Alias(caseStmtNoval, "case_noval")).
Column(Alias(caseStmtExpr, "case_expr")).
From("table")
sql, args, err := qb.ToSql()
assert.NoError(t, err)
expectedSql := "SELECT " +
"(CASE x = ? WHEN true THEN ? ELSE 42 END) AS case_noval, " +
"(CASE WHEN x = ? THEN 'x is zero' WHEN x > ? THEN CONCAT('x is greater than ', ?) END) AS case_expr " +
"FROM table"
assert.Equal(t, expectedSql, sql)
expectedArgs := []interface{}{
true, "it's true!",
0, 1, 2,
}
assert.Equal(t, expectedArgs, args)
}
func TestCaseWithNoWhenClause(t *testing.T) {
caseStmt := Case("something").
Else("42")
qb := Select().Column(caseStmt).From("table")
_, _, err := qb.ToSql()
assert.Error(t, err)
assert.Equal(t, "case expression must contain at lease one WHEN clause", err.Error())
}