packages feed

dormouse-client-0.3.0.0: test/Dormouse/Client/PayloadSpec.hs

module Dormouse.Client.PayloadSpec
  ( spec
  ) where

import Control.Monad.IO.Class
import qualified Data.Map as Map
import Data.Text.Encoding
import Dormouse.Client.Types
import Dormouse.Client.Generators.Text
import Dormouse.Client.Payload

import Data.Proxy

import Test.Hspec
import Test.Hspec.Hedgehog
import qualified Hedgehog.Range as Range
import qualified Streamly.External.ByteString as SEB
import qualified Streamly.Data.Stream as Stream

spec :: Spec
spec = before setup $ do
  describe "decodeText" $ do
    it "successfully decodes latin-1 text for iso-8859-1 charset" $ \sizeRanges -> do
      hedgehog $ do
        txt <- forAll . genLatin1BS $ sizeRanges
        let 
          resp = HttpResponse 
            { responseStatusCode = 200
            , responseHeaders = Map.fromList [("Content-Type", "text/plain; charset=iso-8859-1")]
            , responseBody = Stream.unfold SEB.read txt
            }
          expectedLatin1Text = decodeLatin1 txt
        resp' <- liftIO . deserialiseRequest html $ resp
        responseBody resp' === expectedLatin1Text
    it "successfully decodes utf8 text for utf8 charset" $ \sizeRanges -> do
      hedgehog $ do
        txt <- forAll . genUtf8BS $ sizeRanges
        let 
          resp = HttpResponse 
            { responseStatusCode = 200
            , responseHeaders = Map.fromList [("Content-Type", "text/plain; charset=utf8")]
            , responseBody = Stream.unfold SEB.read txt
            }
          expectedUtf8Text = decodeUtf8 txt
        resp' <- liftIO . deserialiseRequest html $ resp
        responseBody resp' === expectedUtf8Text
    it "successfully decodes utf8 text if no explicit charset applied" $ \sizeRanges -> do
      hedgehog $ do
        txt <- forAll . genUtf8BS $ sizeRanges
        let 
          resp = HttpResponse 
            { responseStatusCode = 200
            , responseHeaders = Map.empty
            , responseBody = Stream.unfold SEB.read txt
            }
          expectedUtf8Text = decodeUtf8 txt
        resp' <- liftIO . deserialiseRequest html $ resp
        responseBody resp' === expectedUtf8Text
  where
    setup = do
      return $ Range.exponential 0 100000