@@ -4,11 +4,53 @@ import Prelude
44
55import Effect (Effect )
66import Node.URL as URL
7+ import Node.URL.URLSearchParams as URL.Search
8+ import Foreign (unsafeReadTagged )
9+ import Data.Bifunctor (lmap )
10+ import Control.Monad.Except (runExcept )
11+ import Control.Monad.Error.Class (liftEither )
12+ import Effect.Exception (error )
13+ import Data.Traversable (for )
14+ import Data.Tuple (Tuple (..))
15+ import Data.Map as Map
716import Test.Assert (assertEqual )
817
918main ∷ Effect Unit
1019main = do
11- let urlStr = " http://example.com/"
12- url <- URL .new urlStr
13- urlStr' <- URL .format url
14- assertEqual { expected: urlStr, actual: urlStr' }
20+ -- Simple roundtrip
21+ do
22+ let urlStr = " http://example.com/"
23+ url <- URL .new urlStr
24+ urlStr' <- URL .format url
25+ assertEqual { expected: urlStr, actual: urlStr' }
26+
27+ -- URLSearchParams
28+ do
29+ let urlStr = " http://example.com/?k&v=a&k&v=b"
30+ url <- URL .new urlStr
31+ search <- URL .searchParams url
32+ keys <- URL.Search .keys search
33+ valuesForeign <- URL.Search .values search
34+
35+ let
36+ getStringOrThrow =
37+ liftEither
38+ <<< lmap (error <<< show)
39+ <<< runExcept
40+ <<< unsafeReadTagged " String"
41+
42+ values <- for valuesForeign getStringOrThrow
43+
44+ map <- Map .fromFoldable <$> for keys \k -> do
45+ vs <- URL.Search .getAll k search
46+ pure $ Tuple k vs
47+
48+ assertEqual { actual: keys, expected: [ " k" , " v" , " k" , " v" ] }
49+ assertEqual { actual: values, expected: [ " " , " a" , " " , " b" ] }
50+ assertEqual
51+ { actual: map
52+ , expected: Map .fromFoldable
53+ [ Tuple " k" [ " " , " " ]
54+ , Tuple " v" [ " a" , " b" ]
55+ ]
56+ }
0 commit comments