@@ -1,181 +0,0 @@
1−{-# LANGUAGE
2− DataKinds
3− , MagicHash
4− , OverloadedLabels
5− , OverloadedStrings
6− , TypeApplications
7− , TypeOperators
8−#-}
9−
10−module Squeal.PostgreSQL.QuerySpec where
11−
12−import Data.Function
13−import Generics.SOP hiding (from)
14−import Test.Hspec
15−
16−import Squeal.PostgreSQL
17−
18−spec :: Spec
19−spec = do
20− let
21− qry `queryRenders` str =
22− renderManipulation (queryStatement qry) `shouldBe` str
23− it "correctly renders a simple SELECT query" $ do
24− let
25− statement :: Query Tables '[] SumAndCol1
26− statement =
27− select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
28− (from (Table (#table1 `As` #table1)) & where_ (#col1 .> #col2))
29− statement `queryRenders`
30− "SELECT (col1 + col2) AS sum, col1 AS col1\
31− \ FROM table1 AS table1 WHERE (col1 > col2);"
32− it "combines WHEREs using AND" $ do
33− let
34− statement :: Query Tables '[] SumAndCol1
35− statement =
36− select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
37− (from (Table (#table1 `As` #table1)) & where_ true & where_ false)
38− statement `queryRenders`
39− "SELECT (col1 + col2) AS sum, col1 AS col1\
40− \ FROM table1 AS table1 WHERE (TRUE AND FALSE);"
41− it "performs sub SELECTs" $ do
42− let
43− statement :: Query Tables '[] SumAndCol1
44− statement =
45− selectStar (from (Subquery
46− (select ((#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
47− (from (Table (#table1 `As` #table1))) `As` #sub)))
48− statement `queryRenders`
49− "SELECT * FROM\
50− \ (SELECT (col1 + col2) AS sum, col1 AS col1\
51− \ FROM table1 AS table1) AS sub;"
52− it "does LIMIT clauses" $ do
53− let
54− statement :: Query Tables '[] Columns
55− statement = selectStar (from (Table (#table1 `As` #table1)) & limit 1)
56− statement `queryRenders` "SELECT * FROM table1 AS table1 LIMIT 1;"
57− it "should use the minimum of given LIMITs" $ do
58− let
59− statement :: Query Tables '[] Columns
60− statement =
61− selectStar (from (Table (#table1 `As` #table1)) & limit 1 & limit 2)
62− statement `queryRenders` "SELECT * FROM table1 AS table1 LIMIT 1;"
63− it "should render parameters using $ signs" $ do
64− let
65− statement :: Query Tables '[ 'Required ('NotNull 'PGbool)] Columns
66− statement = selectStar
67− (from (Table (#table1 `As` #table1)) & where_ (param @1))
68− statement `queryRenders`
69− "SELECT * FROM table1 AS table1 WHERE ($1 :: bool);"
70− it "does OFFSET clauses" $ do
71− let
72− statement :: Query Tables '[] Columns
73− statement =
74− selectStar (from (Table (#table1 `As` #table1)) & offset 1)
75− statement `queryRenders` "SELECT * FROM table1 AS table1 OFFSET 1;"
76− it "should use the sum of given OFFSETs" $ do
77− let
78− statement :: Query Tables '[] Columns
79− statement = selectStar
80− (from (Table (#table1 `As` #table1)) & offset 1 & offset 2)
81− statement `queryRenders` "SELECT * FROM table1 AS table1 OFFSET 3;"
82− it "should render GROUP BY and HAVING clauses" $ do
83− let
84− statement :: Query Tables '[] SumAndCol1
85− statement =
86− select (sum_ #col2 `As` #sum :* #col1 `As` #col1 :* Nil)
87− ( from (Table (#table1 `As` #table1))
88− & group (By #col1 :* Nil)
89− & having (#col1 + sum_ #col2 .> 1) )
90− statement `queryRenders`
91− "SELECT sum(col2) AS sum, col1 AS col1\
92− \ FROM table1 AS table1\
93− \ GROUP BY col1\
94− \ HAVING ((col1 + sum(col2)) > 1);"
95− describe "JOINs" $ do
96− it "should render CROSS JOINs" $ do
97− let
98− statement :: Query JoinTables '[] ValueColumns
99− statement = select
100− ( #orders ! #orderVal `As` #orderVal :*
101− #customers ! #customerVal `As` #customerVal :*
102− #shippers ! #shipperVal `As` #shipperVal :* Nil )
103− ( from (Table (#orders `As` #orders)
104− & CrossJoin (Table (#customers `As` #customers))
105− & CrossJoin (Table (#shippers `As` #shippers))) )
106− statement `queryRenders`
107− "SELECT\
108− \ orders.orderVal AS orderVal,\
109− \ customers.customerVal AS customerVal,\
110− \ shippers.shipperVal AS shipperVal\
111− \ FROM orders AS orders\
112− \ CROSS JOIN customers AS customers\
113− \ CROSS JOIN shippers AS shippers;"
114− it "should render INNER JOINs" $ do
115− let
116− statement :: Query JoinTables '[] ValueColumns
117− statement = select
118− ( (#orders ! #orderVal) `As` #orderVal
119− :* (#customers ! #customerVal) `As` #customerVal
120− :* (#shippers ! #shipperVal) `As` #shipperVal :* Nil)
121− ( from (Table (#orders `As` #orders)
122− & InnerJoin (Table (#customers `As` #customers))
123− ((#orders ! #customerID) .== (#customers ! #customerID))
124− & InnerJoin (Table (#shippers `As` #shippers))
125− ((#orders ! #shipperID) .== (#shippers ! #shipperID))))
126− statement `queryRenders`
127− "SELECT\
128− \ orders.orderVal AS orderVal,\
129− \ customers.customerVal AS customerVal,\
130− \ shippers.shipperVal AS shipperVal\
131− \ FROM orders AS orders\
132− \ INNER JOIN customers AS customers\
133− \ ON (orders.customerID = customers.customerID)\
134− \ INNER JOIN shippers AS shippers\
135− \ ON (orders.shipperID = shippers.shipperID);"
136− it "should render self JOINs" $ do
137− let
138− statement :: Query JoinTables '[] OrderColumns
139− statement = selectDotStar #orders1
140− (from (Table (#orders `As` #orders1)
141− & CrossJoin (Table (#orders `As` #orders2))))
142− statement `queryRenders`
143− "SELECT orders1.*\
144− \ FROM orders AS orders1\
145− \ CROSS JOIN orders AS orders2;"
146−
147−type Columns =
148− '[ "col1" ::: 'Required ('NotNull 'PGint4)
149− , "col2" ::: 'Required ('NotNull 'PGint4)
150− ]
151−type Tables = '[ "table1" ::: Columns ]
152−type SumAndCol1 =
153− '[ "sum" ::: 'Required ('NotNull 'PGint4)
154− , "col1" ::: 'Required ('NotNull 'PGint4)
155− ]
156−type StudentsColumns = '["name" ::: 'Required ('NotNull 'PGtext)]
157−type StudentsTable = '["students" ::: StudentsColumns]
158−type OrderColumns =
159− '[ "orderID" ::: 'Required ('NotNull 'PGint4)
160− , "orderVal" ::: 'Required ('NotNull 'PGtext)
161− , "customerID" ::: 'Required ('NotNull 'PGint4)
162− , "shipperID" ::: 'Required ('NotNull 'PGint4)
163− ]
164−type CustomerColumns =
165− '[ "customerID" ::: 'Required ('NotNull 'PGint4)
166− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
167− ]
168−type ShipperColumns =
169− '[ "shipperID" ::: 'Required ('NotNull 'PGint4)
170− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
171− ]
172−type JoinTables =
173− '[ "orders" ::: OrderColumns
174− , "customers" ::: CustomerColumns
175− , "shippers" ::: ShipperColumns
176− ]
177−type ValueColumns =
178− '[ "orderVal" ::: 'Required ('NotNull 'PGtext)
179− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
180− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
181− ]