hreq-client-0.1.0.0: test/Hreq/Pure/SuccessSpec.hs
module Hreq.Pure.SuccessSpec (spec) where
import Data.Foldable
import Data.Proxy
import Test.Hspec
import Hreq.Client
import Hreq.Core.Client (RequestBody (..))
import Hreq.Pure.Util (TestState (..), TestUser (..), defaultResponse, runClientPure)
spec :: Spec
spec = describe "Hreq.SuccessSpec" successSpec
testUser :: TestUser
testUser = TestUser "Allan" 29
successSpec :: Spec
successSpec = do
let baseUrl = HttpDomain "example.com"
runClientPure' = runClientPure @'Default
describe "Works with request components" $ do
it "works with paths" $ do
let x = hreq @("hello" :> RawResponse GET) Empty
expected = RunClient (appendToPath "hello" defaultRequest) defaultResponse
runClientPure' baseUrl x `shouldBe` expected
it "works with request body" $ do
let x = hreq @(JsonBody TestUser :> RawResponse GET) (testUser :. Empty)
RunClient req _ = runClientPure' baseUrl x
Just (RequestBodyLBS body, _ ) = reqBody req
body `shouldBe` mediaEncode (Proxy @JSON) testUser
it "works with query flags" $ do
let x = hreq @("users" :> QueryFlag "male" :> QueryFlag "old" :> RawResponse GET) Empty
RunClient req _ = runClientPure @'Default baseUrl x
reqPath req `shouldBe` "/users"
toList (reqQueryString req) `shouldBe` [("male", Nothing), ("old", Nothing)]
it "works with capture" $ do
let x = hreq @(Capture String :> RawResponse GET) ("allan" :. Empty)
RunClient req _ = runClientPure @'Default baseUrl x
reqPath req `shouldBe` "/allan"
it "works with captureAll" $ do
let x = hreq @(CaptureAll String :> RawResponse GET) (["allan", "lukwago"] :. Empty)
RunClient req _ = runClientPure @'Default baseUrl x
reqPath req `shouldBe` "/allan/lukwago"
it "works with single query params" $ do
let x = hreq @(Param "name" String :> RawResponse GET) ("allan" :. Empty)
RunClient req _ = runClientPure @'Default baseUrl x
toList (reqQueryString req) `shouldBe` [("name", Just "allan")]
it "works with multi query params" $ do
let x = hreq @(Param "name" String :> Param "age" Int :> RawResponse GET) ("allan" :. 29 :. Empty)
RunClient req _ = runClientPure @'Default baseUrl x
toList (reqQueryString req) `shouldBe` [("name", Just "allan"), ("age", Just "29")]
it "works with multi query params as a list" $ do
let x = hreq @(Params '["name" := String, "age" := Int] :> RawResponse GET) ("allan" :. 29 :. Empty)
RunClient req _ = runClientPure @'Default baseUrl x
toList (reqQueryString req) `shouldBe` [("name", Just "allan"), ("age", Just "29")]
describe "Works with response components" $ do
it "works with single verb requests" $ do
let x = hreq @(RawResponse GET) Empty
expected = RunClient defaultRequest defaultResponse
runClientPure' baseUrl x `shouldBe` expected
it "works with JSON responses" $ do
let x = hreq @(GetJson TestUser) Empty
RunClient _ res = runClientPure @'Default baseUrl x
res `shouldBe` testUser