packages feed

hreq-conduit-0.1.0.0: test/Hreq/HttpBin/SuccessSpec.hs

module Hreq.HttpBin.SuccessSpec (spec) where

import Conduit
import Data.String.Conversions (cs)
import qualified Data.Text as T
import Hreq.Conduit
import Test.Hspec

spec :: Spec
spec = describe "Hreq.HttpBin.SuccessSpec" successSpec

runHttpBin :: Hreq IO a -> IO a
runHttpBin action = runHreq baseUrl action
  where
    baseUrl = HttpsDomain "httpbin.org"

successSpec :: Spec
successSpec = do
  describe "Streaming" $ do
    describe "works with responses" $ do
      it "receiving a stream of data" $ do
        let size = 3 * 1024 * 1024 -- amount of data to stream in MBs
        let streamBytes = hreqWithConduit @("stream-bytes" :> Capture Int :> StreamGet) (size :. Empty)

        runHttpBin
          $ streamBytes
          $ \ src -> do
                tempFile <- runConduitRes $ src .| sinkSystemTempFile "hreq.json"
                tempFile `shouldContain` "hreq"


    describe "works with request bodies" $ do
      it "streaming a file " $ do
        let streamReq src = hreq @("post" :> ConduitReqBody :> RawResponse POST) $ src :. Empty

        withSourceFile "README.md" $
           \srcFile -> do
              let src :: ReqBodySource
                  src = ReqBodySource
                        $ srcFile
                        .| decodeUtf8C
                        .| mapC T.toUpper
                        .| encodeUtf8C

              res <- runHttpBin $ streamReq src

              cs (resBody res) `shouldContain` "HREQ"