-
Notifications
You must be signed in to change notification settings - Fork 112
/
generate_test.clj
94 lines (76 loc) · 3.32 KB
/
generate_test.clj
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
(ns yesql.generate-test
(:require [expectations :refer :all]
[clojure.template :refer [do-template]]
[yesql.statement-parser :refer [tokenize]]
[yesql.generate :refer :all]))
(do-template [statement _ expected-parameters]
(expect expected-parameters
(expected-parameter-list statement))
"SELECT * FROM user"
=> #{}
"SELECT * FROM user WHERE user_id = ?"
=> #{:?}
"SELECT * FROM user WHERE user_id = :name"
=> #{:name}
"SELECT * FROM user WHERE user_id = :name AND country = :country AND age IN (?,?)"
=> #{:name :country :?})
;;; Testing in-list-parmaeter for "IN-list" statements.
(expect [true true true false false]
(map in-list-parameter?
(list []
(list)
(lazy-seq (cons 1 [2]))
{:a 1}
#{1 2 3})))
;;; Testing reassemble-query
(do-template [statement parameters _ rewritten-form]
(expect rewritten-form
(rewrite-query-for-jdbc (tokenize statement)
parameters))
"SELECT age FROM users WHERE country = :country"
{:country "gb"}
=> ["SELECT age FROM users WHERE country = ?" "gb"]
"SELECT age FROM users WHERE (country = ? OR country = ?) AND name = :name"
{:? ["gb" "us"]
:name "tom"}
=> ["SELECT age FROM users WHERE (country = ? OR country = ?) AND name = ?" "gb" "us" "tom"]
;;; Vectors trigger IN expansion
"SELECT age FROM users WHERE country = :country AND name IN (:names)"
{:country "gb"
:names ["tom" "dick" "harry"]}
=> ["SELECT age FROM users WHERE country = ? AND name IN (?,?,?)" "gb" "tom" "dick" "harry"]
;;; Lists trigger IN expansion
"SELECT age FROM users WHERE country = :country AND name IN (:names)"
{:country "gb"
:names (list "tom" "dick" "harry")}
=> ["SELECT age FROM users WHERE country = ? AND name IN (?,?,?)" "gb" "tom" "dick" "harry"]
;;; Lazy seqs of cons of vectors trigger IN expansion
"SELECT age FROM users WHERE country = :country AND name IN (:names)"
{:country "gb"
:names (lazy-seq (cons "tom" ["dick" "harry"]))}
=> ["SELECT age FROM users WHERE country = ? AND name IN (?,?,?)" "gb" "tom" "dick" "harry"]
;;; Maps do not trigger IN expansion
"INSERT INTO json (source, data) VALUES (:source, :data)"
{:source "google"
:data {:a 1}}
=> ["INSERT INTO json (source, data) VALUES (?, ?)" "google" {:a 1}]
"INSERT INTO json (data, source) VALUES (:data, :source)"
{:source "google"
:data {:a 1}}
=> ["INSERT INTO json (data, source) VALUES (?, ?)" {:a 1} "google"]
;;; Empty IN-lists are allowed by Yesql - though most DBs will complain.
"SELECT age FROM users WHERE country = :country AND name IN (:names)"
{:country "gb"
:names []}
=> ["SELECT age FROM users WHERE country = ? AND name IN ()" "gb"]
"SELECT * FROM users WHERE group_ids IN(:group_ids) AND parent_id = :parent_id"
{:group_ids [1 2]
:parent_id 3}
=> ["SELECT * FROM users WHERE group_ids IN(?,?) AND parent_id = ?" 1 2 3])
;;; Incorrect parameters.
(expect AssertionError
(rewrite-query-for-jdbc (tokenize "SELECT age FROM users WHERE country = :country AND name = :name")
{:country "gb"}))
(expect AssertionError
(rewrite-query-for-jdbc (tokenize "SELECT age FROM users WHERE country = ? AND name = ?")
{}))