@@ -3,116 +3,97 @@ module BuildUrl.Spec where
33import Prelude
44
55import Data.Maybe (Maybe(..))
6−import Effect (Effect)
7−import Effect.Aff (Aff)
6+import Test.Spec (Spec, describe, it)
7+import Test.Spec.Assertions (shouldEqual)
88import Type.Proxy (Proxy(..))
99import Yoga.Fetch.Om.BuildUrl (buildUrl, substitutePathParams, appendQueryParams)
1010import Yoga.HTTP.API.Path (Path, type (/), type (:))
11−import ViTest (ViTest, describe, test)
12−import ViTest.Expect (expectToBe)
13−
14−expectToEqual :: forall a. Eq a => a -> a -> Aff Unit
15−expectToEqual expected actual = expectToBe true (expected == actual)
1611
1712--------------------------------------------------------------------------------
1813-- SubstitutePathParams Tests
1914--------------------------------------------------------------------------------
2015
21−testSubstitutePathParams :: Effect ViTest
22−testSubstitutePathParams = describe "substitutePathParams" $ do
23− _ <- test "substitutes single path param" do
24− let
25− result = substitutePathParams @(id :: Int) { id: 42 } "/users/:id"
26− expectToEqual "/users/42" result
27−
28− _ <- test "substitutes multiple path params" do
29− let
30− result = substitutePathParams @(userId :: Int, postId :: Int)
31− { userId: 1, postId: 99 }
32− "/users/:userId/posts/:postId"
33− expectToEqual "/users/1/posts/99" result
34−
35− _ <- test "handles String params" do
36− let
37− result = substitutePathParams @(slug :: String)
38− { slug: "hello-world" }
39− "/posts/:slug"
40− expectToEqual "/posts/hello-world" result
41−
42− test "handles empty params" do
43− let
44− result = substitutePathParams @() {} "/users"
45− expectToEqual "/users" result
46−
47−--------------------------------------------------------------------------------
48−-- AppendQueryParams Tests
49−--------------------------------------------------------------------------------
50−
51−testAppendQueryParams :: Effect ViTest
52−testAppendQueryParams = describe "appendQueryParams" $ do
53− _ <- test "appends single query param" do
54− let
55− result = appendQueryParams @(limit :: Int) { limit: 10 } "/users"
56− expectToEqual "/users?limit=10" result
57−
58− _ <- test "appends multiple query params" do
59− let
60− result = appendQueryParams @(limit :: Int, offset :: Int)
61− { limit: 10, offset: 20 }
62− "/users"
63− expectToEqual "/users?limit=10&offset=20" result
64−
65− _ <- test "handles Maybe params - Just" do
66− let
67− result = appendQueryParams @(limit :: Maybe Int)
68− { limit: Just 10 }
69− "/users"
70− expectToEqual "/users?limit=10" result
71−
72− _ <- test "handles Maybe params - Nothing" do
73− let
74− result = appendQueryParams @(limit :: Maybe Int)
75− { limit: Nothing }
76− "/users"
77− expectToEqual "/users" result
78−
79− _ <- test "handles mixed Maybe and required params" do
80− let
81− result = appendQueryParams @(limit :: Maybe Int, offset :: Int)
82− { limit: Nothing, offset: 20 }
83− "/users"
84− expectToEqual "/users?offset=20" result
85−
86− _ <- test "handles empty query params" do
87− let
88− result = appendQueryParams @() {} "/users"
89− expectToEqual "/users" result
90−
91− test "URL-encodes special characters in values" do
92− let
93− result = appendQueryParams @(search :: String) { search: "hello world&more=yes" } "/users"
94− expectToEqual "/users?search=hello%20world%26more%3Dyes" result
95−
96−--------------------------------------------------------------------------------
97−-- BuildUrl Tests
98−--------------------------------------------------------------------------------
99−
100−testBuildUrl :: Effect ViTest
101−testBuildUrl = describe "buildUrl" $ do
102− _ <- test "builds URL with path params only" do
103− let
104− result = buildUrl
105− "https://api.example.com"
106− (Proxy :: _ (Path ("users" / "id" : Int)))
107− { id: 42 }
108− {}
109− expectToEqual "https://api.example.com/users/42" result
110−
111− test "builds URL with query params only" do
112− let
113− result = buildUrl
114− "https://api.example.com"
115− (Proxy :: _ (Path "users"))
116− {}
117− { limit: 10, offset: 20 }
118− expectToEqual "https://api.example.com/users?limit=10&offset=20" result
16+spec :: Spec Unit
17+spec = do
18+ describe "substitutePathParams" do
19+ it "substitutes single path param" do
20+ let result = substitutePathParams @(id :: Int) { id: 42 } "/users/:id"
21+ result `shouldEqual` "/users/42"
22+
23+ it "substitutes multiple path params" do
24+ let
25+ result = substitutePathParams @(userId :: Int, postId :: Int)
26+ { userId: 1, postId: 99 }
27+ "/users/:userId/posts/:postId"
28+ result `shouldEqual` "/users/1/posts/99"
29+
30+ it "handles String params" do
31+ let
32+ result = substitutePathParams @(slug :: String)
33+ { slug: "hello-world" }
34+ "/posts/:slug"
35+ result `shouldEqual` "/posts/hello-world"
36+
37+ it "handles empty params" do
38+ let result = substitutePathParams @() {} "/users"
39+ result `shouldEqual` "/users"
40+
41+ describe "appendQueryParams" do
42+ it "appends single query param" do
43+ let result = appendQueryParams @(limit :: Int) { limit: 10 } "/users"
44+ result `shouldEqual` "/users?limit=10"
45+
46+ it "appends multiple query params" do
47+ let
48+ result = appendQueryParams @(limit :: Int, offset :: Int)
49+ { limit: 10, offset: 20 }
50+ "/users"
51+ result `shouldEqual` "/users?limit=10&offset=20"
52+
53+ it "handles Maybe params - Just" do
54+ let
55+ result = appendQueryParams @(limit :: Maybe Int)
56+ { limit: Just 10 }
57+ "/users"
58+ result `shouldEqual` "/users?limit=10"
59+
60+ it "handles Maybe params - Nothing" do
61+ let
62+ result = appendQueryParams @(limit :: Maybe Int)
63+ { limit: Nothing }
64+ "/users"
65+ result `shouldEqual` "/users"
66+
67+ it "handles mixed Maybe and required params" do
68+ let
69+ result = appendQueryParams @(limit :: Maybe Int, offset :: Int)
70+ { limit: Nothing, offset: 20 }
71+ "/users"
72+ result `shouldEqual` "/users?offset=20"
73+
74+ it "handles empty query params" do
75+ let result = appendQueryParams @() {} "/users"
76+ result `shouldEqual` "/users"
77+
78+ it "URL-encodes special characters in values" do
79+ let result = appendQueryParams @(search :: String) { search: "hello world&more=yes" } "/users"
80+ result `shouldEqual` "/users?search=hello%20world%26more%3Dyes"
81+
82+ describe "buildUrl" do
83+ it "builds URL with path params only" do
84+ let
85+ result = buildUrl
86+ "https://api.example.com"
87+ (Proxy :: _ (Path ("users" / "id" : Int)))
88+ { id: 42 }
89+ {}
90+ result `shouldEqual` "https://api.example.com/users/42"
91+
92+ it "builds URL with query params only" do
93+ let
94+ result = buildUrl
95+ "https://api.example.com"
96+ (Proxy :: _ (Path "users"))
97+ {}
98+ { limit: 10, offset: 20 }
99+ result `shouldEqual` "https://api.example.com/users?limit=10&offset=20"