-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclassify_test.go
More file actions
56 lines (52 loc) · 1.78 KB
/
Copy pathclassify_test.go
File metadata and controls
56 lines (52 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package pgparse
import (
"testing"
. "github.com/smartystreets/goconvey/convey"
)
func TestMutates(t *testing.T) {
Convey("Given statements of each effect class", t, func() {
cases := []struct {
sql string
mutates bool
class StmtClass
}{
{"SELECT * FROM users WHERE id = $1", false, ClassReadOnly},
{"VALUES (1), (2)", false, ClassReadOnly},
{"SELECT * FROM t FOR UPDATE", false, ClassReadOnly},
{"INSERT INTO t (a) VALUES (1)", true, ClassWrite},
{"UPDATE t SET a = 1 WHERE id = $1", true, ClassWrite},
{"DELETE FROM t WHERE id = $1", true, ClassWrite},
{"WITH u AS (UPDATE t SET a = 1 RETURNING id) SELECT * FROM u", true, ClassWrite},
{"CREATE TABLE t (id int)", true, ClassDDL},
{"DROP TABLE t", true, ClassDDL},
{"ALTER TABLE t ADD COLUMN c int", true, ClassDDL},
{"TRUNCATE t", true, ClassWrite},
{"GRANT SELECT ON t TO bob", true, ClassDDL},
{"COPY t FROM stdin", true, ClassUtility},
{"SET search_path TO public", false, ClassReadOnly},
{"SHOW all", false, ClassReadOnly},
{"BEGIN", false, ClassTransaction},
{"COMMIT", false, ClassTransaction},
{"ROLLBACK", false, ClassTransaction},
}
Convey("When classified", func() {
Convey("Then Mutates and Classify match expectations", func() {
for _, c := range cases {
res, err := Parse(c.sql)
So(err, ShouldBeNil)
So(res.Mutates(), ShouldEqual, c.mutates)
So(Classify(res.Stmts[0]), ShouldEqual, c.class)
}
})
})
})
Convey("Given a read query and a write query in one string", t, func() {
Convey("When the whole result is classified", func() {
res, _ := Parse("SELECT 1; UPDATE t SET a = 1")
Convey("Then Mutates is true and ReadOnly is false", func() {
So(res.Mutates(), ShouldBeTrue)
So(res.ReadOnly(), ShouldBeFalse)
})
})
})
}