@@ -13,42 +13,39 @@ import Test.Spec (Spec, describe, it)
1313import Type.Proxy (Proxy(..))
1414import Yoga.Om as Om
1515import Yoga.Postgres as PG
16−import Yoga.Postgres.ClientOm (run, runOne, runExec)
16+import Yoga.Postgres.ClientOm (run, runOne, exec)
1717import Yoga.Postgres.Schema (Table, PrimaryKey, AutoIncrement, Unique, Default, TimestampTZ, class CreateTableDDL, createTableDDL, from, into, select, where_, orderBy, limit, groupBy, insert, delete, returning, union)
1818
1919spec :: Spec Unit
2020spec = describe "Query builder" do
2121
2222 it "selects columns with a WHERE clause" $ withUsersTable do
23− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
24− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
25− rows <- from usersTable # select @"name, email" # where_ @"role = $role" # run { role: "admin" }
26− Array.length rows `shouldEqual` 1
27− let
28− r = case Array.head rows of
29− Just x -> x
30− Nothing -> { name: "", email: "" }
31− r.name `shouldEqual` "Alice"
23+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
24+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
25+ rows <- from usersTable
26+ # select @"name, email"
27+ # where_ @"role = $role"
28+ # run { role: "admin" }
29+ rows `shouldEqual` [ { name: "Alice", email: "a@t.com" } ]
3230
3331 it "orders and limits results" $ withUsersTable do
34− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
35− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
36− _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "user" } # runExec {}
32+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
33+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
34+ _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "user" } # exec {}
3735 rows <- from usersTable # select @"name" # orderBy @"name" # limit @"2" # run {}
38− Array.length rows `shouldEqual` 2
39− (map _.name rows) `shouldEqual` [ "Alice", "Bob" ]
36+ rows `shouldEqual` [ { name: "Alice" }, { name: "Bob" } ]
4037
4138 it "groups results" $ withUsersTable do
42− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
43− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
44− _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "user" } # runExec {}
39+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
40+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
41+ _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "user" } # exec {}
4542 rows <- from usersTable # select @"role" # groupBy @"role" # orderBy @"role" # run {}
46− (rows <#> _.role) `shouldEqual` [ "admin", "user" ]
43+ rows `shouldEqual` [ { role: "admin" }, { role: "user" } ]
4744
4845 it "filters with a BETWEEN range" $ withUsersTable do
49− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
50− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
51− _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "mod" } # runExec {}
46+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
47+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
48+ _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "mod" } # exec {}
5249 rows <- from usersTable # select @"name" # where_ @"id BETWEEN $lo AND $hi" # orderBy @"id" # run { lo: 2, hi: 3 }
5350 rows `shouldEqual` [ { name: "Bob" }, { name: "Carol" } ]
5451
@@ -64,17 +61,17 @@ spec = describe "Query builder" do
6461 r.created_at `shouldEqual` r.updated_at
6562
6663 it "deletes with a condition and returns the deleted rows" $ withUsersTable do
67− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
68− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
64+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
65+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
6966 rows <- from usersTable # delete # where_ @"role = $role" # returning @"name" # run { role: "admin" }
7067 Array.length rows `shouldEqual` 1
7168 r <- Array.head rows # shouldBeJust
7269 r.name `shouldEqual` "Alice"
7370
7471 it "combines two queries with UNION" $ withUsersTable do
75− _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # runExec {}
76− _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # runExec {}
77− _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "mod" } # runExec {}
72+ _ <- into usersTable # insert { name: "Alice", email: "a@t.com", role: "admin" } # exec {}
73+ _ <- into usersTable # insert { name: "Bob", email: "b@t.com", role: "user" } # exec {}
74+ _ <- into usersTable # insert { name: "Carol", email: "c@t.com", role: "mod" } # exec {}
7875 rows <-
7976 from usersTable # select @"name" # where_ @"role = $a"
8077 # union (from usersTable # select @"name" # where_ @"role = $b")
@@ -134,5 +131,6 @@ withUsersTable test = do
134131 _ <- PG.executeSimple dropDDL conn
135132 PG.end conn
136133 where
137− dropDDL = PG.SQL "DROP TABLE IF EXISTS test_om_users CASCADE"
138− createDDL = PG.SQL ("DROP TABLE IF EXISTS test_om_users CASCADE; " <> createTableDDL @UsersTable)
134+ dropStr = "DROP TABLE IF EXISTS test_om_users CASCADE"
135+ dropDDL = PG.SQL dropStr
136+ createDDL = PG.SQL (dropStr <> "; " <> createTableDDL @UsersTable)