git.iko.soy/rowtype-yoga/purescript-yoga-fetch-om
on main help sign in
Add server↔client roundtrip integration tests
ad58708Mark
spago.lock+11−1
@@ -277,7 +277,17 @@
277 }
277 }
278 }
278 }
279 },
279 },
280− "extra_packages": {}
280+ "extra_packages": {
281+ "yoga-fastify": {
282+ "path": "../purescript-yoga-fastify-om/local-packages/yoga-fastify"
283+ },
284+ "yoga-fastify-om": {
285+ "path": "../purescript-yoga-fastify-om"
286+ },
287+ "yoga-http-api": {
288+ "path": "../purescript-yoga-fastify-om/local-packages/yoga-http-api"
289+ }
290+ }
281 },
291 },
282 "packages": {
292 "packages": {
283 "aff": {
293 "aff": {
spago.yaml+8−1
@@ -1,4 +1,11 @@
1−workspace: {}
1+workspace:
2+ extraPackages:
3+ yoga-fastify-om:
4+ path: ../purescript-yoga-fastify-om
5+ yoga-http-api:
6+ path: ../purescript-yoga-fastify-om/local-packages/yoga-http-api
7+ yoga-fastify:
8+ path: ../purescript-yoga-fastify-om/local-packages/yoga-fastify
2package:
9package:
3 name: yoga-fetch-om
10 name: yoga-fetch-om
4 publish:
11 publish:
test/Polymorphic.Spec.purs+1−1
@@ -54,7 +54,7 @@ withServer test = bracket acquire release (\_ -> test unit)
54 acquire = do
54 acquire = do
55 fastify <- liftEffect do
55 fastify <- liftEffect do
56 f <- F.fastify {}
56 f <- F.fastify {}
57− registerAPI { getUser: getUserHandler } f
57+ registerAPI @TestAPI { getUser: getUserHandler } f
58 pure f
58 pure f
59 void $ F.listen { port: Port 44931, host: Host "0.0.0.0" } fastify
59 void $ F.listen { port: Port 44931, host: Host "0.0.0.0" } fastify
60 pure fastify
60 pure fastify
test/Roundtrip.Spec.purs+34−1
@@ -63,6 +63,11 @@ type AuthRoute = Route GET
63 , unauthorized :: { body :: ErrorMsg }
63 , unauthorized :: { body :: ErrorMsg }
64 )
64 )
65
65
66+type SearchRoute = Route GET
67+ ("search" :? { active :: Boolean, minScore :: Number })
68+ {}
69+ (ok :: { body :: { active :: Boolean, minScore :: Number } })
70+
66type API =
71type API =
67 { getUser :: GetUserRoute
72 { getUser :: GetUserRoute
68 , listUsers :: ListUsersRoute
73 , listUsers :: ListUsersRoute
@@ -70,6 +75,7 @@ type API =
70 , updateUser :: UpdateUserRoute
75 , updateUser :: UpdateUserRoute
71 , deleteUser :: DeleteUserRoute
76 , deleteUser :: DeleteUserRoute
72 , me :: AuthRoute
77 , me :: AuthRoute
78+ , search :: SearchRoute
73 }
79 }
74
80
75api = client @API "http://localhost:44932"
81api = client @API "http://localhost:44932"
@@ -130,6 +136,17 @@ meHandler = handle do
130 BearerToken "secret" -> respond @"ok" { id: 1, name: "Admin", email: "admin@test.com" }
136 BearerToken "secret" -> respond @"ok" { id: 1, name: "Admin", email: "admin@test.com" }
131 _ -> reject @"unauthorized" { error: "Invalid token" }
137 _ -> reject @"unauthorized" { error: "Invalid token" }
132
138
139+searchHandler :: Handler SearchRoute ()
140+searchHandler = handle do
141+ { query } <- ask
142+ let active = case query.active of
143+ Just a -> a
144+ Nothing -> false
145+ let minScore = case query.minScore of
146+ Just s -> s
147+ Nothing -> 0.0
148+ respond @"ok" { active, minScore }
149+
133-- Test suite
150-- Test suite
134
151
135spec :: Spec Unit
152spec :: Spec Unit
@@ -210,6 +227,21 @@ spec = around withServer $ describe "server ↔ client roundtrip" do
210 # handleErrors { unauthorized: \e -> pure { id: 0, name: e.error, email: "" } }
227 # handleErrors { unauthorized: \e -> pure { id: 0, name: e.error, email: "" } }
211 liftAff $ user.name `shouldEqual` "Invalid token"
228 liftAff $ user.name `shouldEqual` "Invalid token"
212
229
230+ describe "GET with Boolean and Number query params" do
231+ it "passes Boolean and Number query params" \_ ->
232+ runOm {} { exception: \_ -> pure unit } do
233+ result <- api.search { active: Just true, minScore: Just 3.14 }
234+ liftAff do
235+ result.active `shouldEqual` true
236+ result.minScore `shouldEqual` 3.14
237+
238+ it "handles Nothing for optional Boolean/Number" \_ ->
239+ runOm {} { exception: \_ -> pure unit } do
240+ result <- api.search { active: Nothing, minScore: Nothing }
241+ liftAff do
242+ result.active `shouldEqual` false
243+ result.minScore `shouldEqual` 0.0
244+
213-- Server setup
245-- Server setup
214
246
215withServer :: forall a. (Unit -> _ a) -> _ a
247withServer :: forall a. (Unit -> _ a) -> _ a
@@ -218,13 +250,14 @@ withServer test = bracket acquire release (\_ -> test unit)
218 acquire = do
250 acquire = do
219 fastify <- liftEffect do
251 fastify <- liftEffect do
220 f <- F.fastify {}
252 f <- F.fastify {}
221− registerAPI
253+ registerAPI @API
222 { getUser: getUserHandler
254 { getUser: getUserHandler
223 , listUsers: listUsersHandler
255 , listUsers: listUsersHandler
224 , createUser: createUserHandler
256 , createUser: createUserHandler
225 , updateUser: updateUserHandler
257 , updateUser: updateUserHandler
226 , deleteUser: deleteUserHandler
258 , deleteUser: deleteUserHandler
227 , me: meHandler
259 , me: meHandler
260+ , search: searchHandler
228 }
261 }
229 f
262 f
230 pure f
263 pure f