1 package sqlgen_test
2
3 import (
4 "testing"
5
6 "github.com/doug-martin/goqu/v9/exp"
7 "github.com/doug-martin/goqu/v9/internal/errors"
8 "github.com/doug-martin/goqu/v9/internal/sb"
9 "github.com/doug-martin/goqu/v9/sqlgen"
10 "github.com/stretchr/testify/suite"
11 )
12
13 type (
14 truncateTestCase struct {
15 clause exp.TruncateClauses
16 sql string
17 isPrepared bool
18 args []interface{}
19 err string
20 }
21 truncateSQLGeneratorSuite struct {
22 baseSQLGeneratorSuite
23 }
24 )
25
26 func (tsgs *truncateSQLGeneratorSuite) assertCases(tsg sqlgen.TruncateSQLGenerator, testCases ...truncateTestCase) {
27 for _, tc := range testCases {
28 b := sb.NewSQLBuilder(tc.isPrepared)
29 tsg.Generate(b, tc.clause)
30 switch {
31 case len(tc.err) > 0:
32 tsgs.assertErrorSQL(b, tc.err)
33 case tc.isPrepared:
34 tsgs.assertPreparedSQL(b, tc.sql, tc.args)
35 default:
36 tsgs.assertNotPreparedSQL(b, tc.sql)
37 }
38 }
39 }
40
41 func (tsgs *truncateSQLGeneratorSuite) TestDialect() {
42 opts := sqlgen.DefaultDialectOptions()
43 d := sqlgen.NewTruncateSQLGenerator("test", opts)
44 tsgs.Equal("test", d.Dialect())
45
46 opts2 := sqlgen.DefaultDialectOptions()
47 d2 := sqlgen.NewTruncateSQLGenerator("test2", opts2)
48 tsgs.Equal("test2", d2.Dialect())
49 }
50
51 func (tsgs *truncateSQLGeneratorSuite) TestGenerate() {
52 opts := sqlgen.DefaultDialectOptions()
53 opts.TruncateClause = []byte("truncate")
54
55 tcNoTable := exp.NewTruncateClauses()
56 tcSingle := tcNoTable.SetTable(exp.NewColumnListExpression("a"))
57 tcMulti := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a", "b"))
58
59 expectedNoSourceErr := "goqu: no source found when generating truncate sql"
60 tsgs.assertCases(
61 sqlgen.NewTruncateSQLGenerator("test", opts),
62 truncateTestCase{clause: tcSingle, sql: `truncate "a"`},
63 truncateTestCase{clause: tcSingle, sql: `truncate "a"`, isPrepared: true},
64
65 truncateTestCase{clause: tcMulti, sql: `truncate "a", "b"`},
66 truncateTestCase{clause: tcMulti, sql: `truncate "a", "b"`, isPrepared: true},
67
68 truncateTestCase{clause: tcNoTable, err: expectedNoSourceErr},
69 truncateTestCase{clause: tcNoTable, err: expectedNoSourceErr, isPrepared: true},
70 )
71 }
72
73 func (tsgs *truncateSQLGeneratorSuite) TestGenerate_UnsupportedFragment() {
74 opts := sqlgen.DefaultDialectOptions()
75 opts.TruncateSQLOrder = []sqlgen.SQLFragmentType{sqlgen.UpdateBeginSQLFragment}
76 tc := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a"))
77 expectedErr := "goqu: unsupported TRUNCATE SQL fragment UpdateBeginSQLFragment"
78 tsgs.assertCases(
79 sqlgen.NewTruncateSQLGenerator("test", opts),
80 truncateTestCase{clause: tc, err: expectedErr},
81 truncateTestCase{clause: tc, err: expectedErr, isPrepared: true},
82 )
83 }
84
85 func (tsgs *truncateSQLGeneratorSuite) TestGenerate_WithErroredBuilder() {
86 opts := sqlgen.DefaultDialectOptions()
87 opts.TruncateSQLOrder = []sqlgen.SQLFragmentType{sqlgen.UpdateBeginSQLFragment}
88 d := sqlgen.NewTruncateSQLGenerator("test", opts)
89
90 b := sb.NewSQLBuilder(true).SetError(errors.New("expected error"))
91 d.Generate(b, exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a")))
92 tsgs.assertErrorSQL(b, `goqu: expected error`)
93 }
94
95 func (tsgs *truncateSQLGeneratorSuite) TestGenerate_WithCascade() {
96 opts := sqlgen.DefaultDialectOptions()
97 opts.CascadeFragment = []byte(" cascade")
98 opts.RestrictFragment = []byte(" restrict")
99 opts.IdentityFragment = []byte(" identity")
100
101 tc := exp.NewTruncateClauses().SetTable(exp.NewColumnListExpression("a"))
102 tcCascade := tc.SetOptions(exp.TruncateOptions{Cascade: true})
103 tcRestrict := tc.SetOptions(exp.TruncateOptions{Restrict: true})
104 tcRestart := tc.SetOptions(exp.TruncateOptions{Identity: "restart"})
105
106 tsgs.assertCases(
107 sqlgen.NewTruncateSQLGenerator("test", opts),
108 truncateTestCase{clause: tcCascade, sql: `TRUNCATE "a" cascade`},
109 truncateTestCase{clause: tcCascade, sql: `TRUNCATE "a" cascade`, isPrepared: true},
110
111 truncateTestCase{clause: tcRestrict, sql: `TRUNCATE "a" restrict`},
112 truncateTestCase{clause: tcRestrict, sql: `TRUNCATE "a" restrict`, isPrepared: true},
113
114 truncateTestCase{clause: tcRestart, sql: `TRUNCATE "a" RESTART identity`},
115 truncateTestCase{clause: tcRestart, sql: `TRUNCATE "a" RESTART identity`, isPrepared: true},
116 )
117 }
118
119 func TestTruncateSQLGenerator(t *testing.T) {
120 suite.Run(t, new(truncateSQLGeneratorSuite))
121 }
122
View as plain text