on dev help sign in
remove hspec tests
commitf093f299ea158b3776c95dd0e5cd8b1b2b7772eb authorEitan Chatav <eitan.chatav@gmail.com> dateFri 23 Feb 2018, 12:50 (9 years ago) parent46d5803
4 files changed−434
squeal-postgresql/test/Spec.hs−1 squeal-postgresql/test/Squeal/PostgreSQL/DefinitionSpec.hs−124 squeal-postgresql/test/Squeal/PostgreSQL/ManipulationSpec.hs−128 squeal-postgresql/test/Squeal/PostgreSQL/QuerySpec.hs−181
squeal-postgresql/test/Spec.hsdeleted−1
@@ -1 +0,0 @@
1−{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
squeal-postgresql/test/Squeal/PostgreSQL/DefinitionSpec.hsdeleted−124
@@ -1,124 +0,0 @@
1−{-# LANGUAGE
2− DataKinds
3− , MagicHash
4− , OverloadedLabels
5− , OverloadedStrings
6− , TypeApplications
7− , TypeOperators
8−#-}
9−
10−module Squeal.PostgreSQL.DefinitionSpec where
11−
12−import Control.Category ((>>>))
13−import Data.Function
14−import Generics.SOP hiding (from)
15−import Test.Hspec
16−
17−import Squeal.PostgreSQL
18−
19−spec :: Spec
20−spec = do
21− let
22− definition `definitionRenders` str =
23− renderDefinition definition `shouldBe` str
24− it "should render CREATE TABLE statements" $ do
25− createTable #table1
26− ((int4 & notNull) `As` #col1 :* (int4 & notNull) `As` #col2 :* Nil)
27− [primaryKey (Column #col1 :* Column #col2 :* Nil)]
28− `definitionRenders`
29− "CREATE TABLE table1\
30− \ (col1 int4 NOT NULL, col2 int4 NOT NULL,\
31− \ PRIMARY KEY (col1, col2));"
32− createTable #table2
33− ( serial `As` #col1 :*
34− text `As` #col2 :*
35− (int8 & notNull & default_ 8) `As` #col3 :* Nil )
36− [check (#col3 .> 0)]
37− `definitionRenders`
38− "CREATE TABLE table2\
39− \ (col1 serial,\
40− \ col2 text,\
41− \ col3 int8 NOT NULL DEFAULT 8,\
42− \ CHECK ((col3 > 0)));"
43− let
44− statement :: Definition '[]
45− '[ "users" :::
46− '[ "id" ::: 'Optional ('NotNull 'PGint4)
47− , "username" ::: 'Required ('NotNull 'PGtext)
48− ]
49− , "emails" :::
50− '[ "id" ::: 'Optional ('NotNull 'PGint4)
51− , "userid" ::: 'Required ('NotNull 'PGint4)
52− , "email" ::: 'Required ('NotNull 'PGtext)
53− ]
54− ]
55− statement =
56− createTable #users
57− (serial `As` #id :* (text & notNull) `As` #username :* Nil)
58− [primaryKey (Column #id :* Nil)]
59− >>>
60− createTable #emails
61− ( serial `As` #id :*
62− (integer & notNull) `As` #userid :*
63− (text & notNull) `As` #email :* Nil )
64− [ primaryKey (Column #id :* Nil)
65− , foreignKey (Column #userid :* Nil) #users (Column #id :* Nil)
66− OnDeleteCascade OnUpdateRestrict
67− , unique (Column #email :* Nil)
68− , check (#email ./= "")
69− ]
70− statement `definitionRenders`
71− "CREATE TABLE users\
72− \ (id serial, username text NOT NULL,\
73− \ PRIMARY KEY (id));\
74− \ \
75− \CREATE TABLE emails\
76− \ (id serial,\
77− \ userid integer NOT NULL,\
78− \ email text NOT NULL,\
79− \ PRIMARY KEY (id),\
80− \ FOREIGN KEY (userid) REFERENCES users (id)\
81− \ ON DELETE CASCADE ON UPDATE RESTRICT,\
82− \ UNIQUE (email),\
83− \ CHECK ((email <> E'')));"
84− it "should render DROP TABLE statements" $ do
85− let
86− statement :: Definition Tables '[]
87− statement = dropTable #table1
88− statement `definitionRenders` "DROP TABLE table1;"
89−
90−type Columns =
91− '[ "col1" ::: 'Required ('NotNull 'PGint4)
92− , "col2" ::: 'Required ('NotNull 'PGint4)
93− ]
94−type Tables = '[ "table1" ::: Columns ]
95−type SumAndCol1 =
96− '[ "sum" ::: 'Required ('NotNull 'PGint4)
97− , "col1" ::: 'Required ('NotNull 'PGint4)
98− ]
99−type StudentsColumns = '["name" ::: 'Required ('NotNull 'PGtext)]
100−type StudentsTable = '["students" ::: StudentsColumns]
101−type OrderColumns =
102− '[ "orderID" ::: 'Required ('NotNull 'PGint4)
103− , "orderVal" ::: 'Required ('NotNull 'PGtext)
104− , "customerID" ::: 'Required ('NotNull 'PGint4)
105− , "shipperID" ::: 'Required ('NotNull 'PGint4)
106− ]
107−type CustomerColumns =
108− '[ "customerID" ::: 'Required ('NotNull 'PGint4)
109− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
110− ]
111−type ShipperColumns =
112− '[ "shipperID" ::: 'Required ('NotNull 'PGint4)
113− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
114− ]
115−type JoinTables =
116− '[ "orders" ::: OrderColumns
117− , "customers" ::: CustomerColumns
118− , "shippers" ::: ShipperColumns
119− ]
120−type ValueColumns =
121− '[ "orderVal" ::: 'Required ('NotNull 'PGtext)
122− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
123− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
124− ]
squeal-postgresql/test/Squeal/PostgreSQL/ManipulationSpec.hsdeleted−128
@@ -1,128 +0,0 @@
1−{-# LANGUAGE
2− DataKinds
3− , MagicHash
4− , OverloadedLabels
5− , OverloadedStrings
6− , TypeApplications
7− , TypeOperators
8−#-}
9−
10−module Squeal.PostgreSQL.ManipulationSpec where
11−
12−import Generics.SOP hiding (from)
13−import Test.Hspec
14−
15−import Squeal.PostgreSQL
16−
17−spec :: Spec
18−spec = do
19− let
20− manipulation `manipulationRenders` str =
21− renderManipulation manipulation `shouldBe` str
22− it "correctly renders returning INSERTs" $ do
23− let
24− statement :: Manipulation Tables '[] SumAndCol1
25− statement =
26− insertInto #table1 (Values (2 `As` #col1 :* 4 `As` #col2 :* Nil) [])
27− OnConflictDoRaise
28− (Returning $ (#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
29− statement `manipulationRenders`
30− "INSERT INTO table1 (col1, col2) VALUES (2, 4)\
31− \ RETURNING (col1 + col2) AS sum, col1 AS col1;"
32− it "correctly renders simple UPDATEs" $ do
33− let
34− statement :: Manipulation Tables '[] '[]
35− statement =
36− update #table1 (Set 2 `As` #col1 :* Same `As` #col2 :* Nil)
37− (#col1 ./= #col2) (Returning Nil)
38− statement `manipulationRenders`
39− "UPDATE table1 SET col1 = 2\
40− \ WHERE (col1 <> col2);"
41− it "correctly renders returning UPDATEs" $ do
42− let
43− statement :: Manipulation Tables '[] SumAndCol1
44− statement =
45− update #table1 (Set 2 `As` #col1 :* Same `As` #col2 :* Nil)
46− (#col1 ./= #col2)
47− (Returning $ (#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
48− statement `manipulationRenders`
49− "UPDATE table1 SET col1 = 2\
50− \ WHERE (col1 <> col2)\
51− \ RETURNING (col1 + col2) AS sum, col1 AS col1;"
52− it "correctly renders upsert INSERTs" $ do
53− let
54− statement :: Manipulation Tables '[] '[]
55− statement =
56− insertInto #table1 (Values (2 `As` #col1 :* 4 `As` #col2 :* Nil) [])
57− (OnConflictDoUpdate
58− (Set 2 `As` #col1 :* Same `As` #col2 :* Nil) Nothing)
59− (Returning Nil)
60− statement `manipulationRenders`
61− "INSERT INTO table1 (col1, col2) VALUES (2, 4)\
62− \ ON CONFLICT DO UPDATE\
63− \ SET col1 = 2;"
64− it "correctly renders returning upsert INSERTs" $ do
65− let
66− statement :: Manipulation Tables '[] SumAndCol1
67− statement =
68− insertInto #table1 (Values (2 `As` #col1 :* 4 `As` #col2 :* Nil) [])
69− (OnConflictDoUpdate
70− (Set 2 `As` #col1 :* Same `As` #col2 :* Nil)
71− (Just (#col1 ./= #col2)))
72− (Returning $ (#col1 + #col2) `As` #sum :* #col1 `As` #col1 :* Nil)
73− statement `manipulationRenders`
74− "INSERT INTO table1 (col1, col2) VALUES (2, 4)\
75− \ ON CONFLICT DO UPDATE\
76− \ SET col1 = 2\
77− \ WHERE (col1 <> col2)\
78− \ RETURNING (col1 + col2) AS sum, col1 AS col1;"
79− it "correctly renders DELETEs" $ do
80− let
81− statement :: Manipulation Tables '[] '[]
82− statement = deleteFrom #table1 (#col1 .== #col2) (Returning Nil)
83− statement `manipulationRenders`
84− "DELETE FROM table1 WHERE (col1 = col2);"
85− it "should be safe against SQL injection in literal text" $ do
86− let
87− statement :: Manipulation StudentsTable '[] '[]
88− statement = insertInto #students
89− (Values ("Robert'); DROP TABLE students;" `As` #name :* Nil) [])
90− OnConflictDoRaise (Returning Nil)
91− statement `manipulationRenders`
92− "INSERT INTO students (name) VALUES (E'Robert''); DROP TABLE students;');"
93−
94−type Columns =
95− '[ "col1" ::: 'Required ('NotNull 'PGint4)
96− , "col2" ::: 'Required ('NotNull 'PGint4)
97− ]
98−type Tables = '[ "table1" ::: Columns ]
99−type SumAndCol1 =
100− '[ "sum" ::: 'Required ('NotNull 'PGint4)
101− , "col1" ::: 'Required ('NotNull 'PGint4)
102− ]
103−type StudentsColumns = '["name" ::: 'Required ('NotNull 'PGtext)]
104−type StudentsTable = '["students" ::: StudentsColumns]
105−type OrderColumns =
106− '[ "orderID" ::: 'Required ('NotNull 'PGint4)
107− , "orderVal" ::: 'Required ('NotNull 'PGtext)
108− , "customerID" ::: 'Required ('NotNull 'PGint4)
109− , "shipperID" ::: 'Required ('NotNull 'PGint4)
110− ]
111−type CustomerColumns =
112− '[ "customerID" ::: 'Required ('NotNull 'PGint4)
113− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
114− ]
115−type ShipperColumns =
116− '[ "shipperID" ::: 'Required ('NotNull 'PGint4)
117− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
118− ]
119−type JoinTables =
120− '[ "orders" ::: OrderColumns
121− , "customers" ::: CustomerColumns
122− , "shippers" ::: ShipperColumns
123− ]
124−type ValueColumns =
125− '[ "orderVal" ::: 'Required ('NotNull 'PGtext)
126− , "customerVal" ::: 'Required ('NotNull 'PGfloat4)
127− , "shipperVal" ::: 'Required ('NotNull 'PGbool)
128− ]
squeal-postgresql/test/Squeal/PostgreSQL/QuerySpec.hsdeleted−181
@@ -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− ]