1package squirrel
2
3import (
4	"testing"
5
6	"github.com/stretchr/testify/assert"
7)
8
9func TestUpdateBuilderToSql(t *testing.T) {
10	b := Update("").
11		Prefix("WITH prefix AS ?", 0).
12		Table("a").
13		Set("b", Expr("? + 1", 1)).
14		SetMap(Eq{"c": 2}).
15		Set("c1", Case("status").When("1", "2").When("2", "1")).
16		Set("c2", Case().When("a = 2", Expr("?", "foo")).When("a = 3", Expr("?", "bar"))).
17		Set("c3", Select("a").From("b")).
18		Where("d = ?", 3).
19		OrderBy("e").
20		Limit(4).
21		Offset(5).
22		Suffix("RETURNING ?", 6)
23
24	sql, args, err := b.ToSql()
25	assert.NoError(t, err)
26
27	expectedSql :=
28		"WITH prefix AS ? " +
29			"UPDATE a SET b = ? + 1, c = ?, " +
30			"c1 = CASE status WHEN 1 THEN 2 WHEN 2 THEN 1 END, " +
31			"c2 = CASE WHEN a = 2 THEN ? WHEN a = 3 THEN ? END, " +
32			"c3 = (SELECT a FROM b) " +
33			"WHERE d = ? " +
34			"ORDER BY e LIMIT 4 OFFSET 5 " +
35			"RETURNING ?"
36	assert.Equal(t, expectedSql, sql)
37
38	expectedArgs := []interface{}{0, 1, 2, "foo", "bar", 3, 6}
39	assert.Equal(t, expectedArgs, args)
40}
41
42func TestUpdateBuilderToSqlErr(t *testing.T) {
43	_, _, err := Update("").Set("x", 1).ToSql()
44	assert.Error(t, err)
45
46	_, _, err = Update("x").ToSql()
47	assert.Error(t, err)
48}
49
50func TestUpdateBuilderPlaceholders(t *testing.T) {
51	b := Update("test").SetMap(Eq{"x": 1, "y": 2})
52
53	sql, _, _ := b.PlaceholderFormat(Question).ToSql()
54	assert.Equal(t, "UPDATE test SET x = ?, y = ?", sql)
55
56	sql, _, _ = b.PlaceholderFormat(Dollar).ToSql()
57	assert.Equal(t, "UPDATE test SET x = $1, y = $2", sql)
58}
59
60func TestUpdateBuilderRunners(t *testing.T) {
61	db := &DBStub{}
62	b := Update("test").Set("x", 1).RunWith(db)
63
64	expectedSql := "UPDATE test SET x = ?"
65
66	b.Exec()
67	assert.Equal(t, expectedSql, db.LastExecSql)
68}
69
70func TestUpdateBuilderNoRunner(t *testing.T) {
71	b := Update("test").Set("x", 1)
72
73	_, err := b.Exec()
74	assert.Equal(t, RunnerNotSet, err)
75}
76