@@ -8,6 +8,7 @@ import Data.Tuple.Nested (type (/\))
88import Prim.Boolean (True)
99import Test.Spec (Spec, describe, it)
1010import Test.Spec.Assertions (shouldEqual, shouldSatisfy)
11+import Type.Proxy (Proxy(..))
1112import Yoga.Postgres.Schema
1213
1314-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -80,6 +81,25 @@ updateSQL = updateSQLFor @UsersTable @(name :: String) @(id :: Int)
8081deleteSQL :: String
8182deleteSQL = deleteSQLFor @UsersTable @(id :: Int)
8283
84+-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
85+-- Phase 8: Builder-style query API
86+-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
87+
88+usersTable :: Proxy UsersTable
89+usersTable = Proxy
90+
91+builderSelectAll :: String
92+builderSelectAll = from usersTable # selectAll # toSQL
93+
94+builderSelectCols :: String
95+builderSelectCols = from usersTable # select @"name, email" # toSQL
96+
97+builderSelectWhere :: String
98+builderSelectWhere = from usersTable # selectAll # where_ @(id :: Int) # toSQL
99+
100+builderSelectColsWhere :: String
101+builderSelectColsWhere = from usersTable # select @"name" # where_ @(age :: Int) # toSQL
102+
83103-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
84104-- Spec
85105-- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -123,3 +143,13 @@ spec = do
123143 describe "DELETE SQL" do
124144 it "generates DELETE with WHERE" do
125145 deleteSQL `shouldEqual` "DELETE FROM users WHERE id = $1"
146+
147+ describe "Builder API" do
148+ it "builds SELECT *" do
149+ builderSelectAll `shouldEqual` "SELECT * FROM users"
150+ it "builds SELECT with columns" do
151+ builderSelectCols `shouldEqual` "SELECT name, email FROM users"
152+ it "builds SELECT * with WHERE" do
153+ builderSelectWhere `shouldEqual` "SELECT * FROM users WHERE id = $1"
154+ it "builds SELECT columns with WHERE" do
155+ builderSelectColsWhere `shouldEqual` "SELECT name FROM users WHERE age = $1"