packages feed

http-tower-hs-0.2.0.0: test/Network/HTTP/Tower/Middleware/LoggingSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Network.HTTP.Tower.Middleware.LoggingSpec (spec) where

import Data.IORef
import Data.Text (Text, isInfixOf)
import qualified Data.ByteString.Lazy as LBS
import qualified Network.HTTP.Client as HTTP
import qualified Network.HTTP.Client.Internal as HTTP
import qualified Network.HTTP.Types as HTTP
import Test.Hspec

import Network.HTTP.Tower.Client (HttpResponse)
import Tower.Service
import Tower.Error
import Network.HTTP.Tower.Middleware.Logging

spec :: Spec
spec = describe "Logging middleware" $ do
  it "logs successful requests" $ do
    logRef <- newIORef ([] :: [Text])
    let logger msg = modifyIORef' logRef (msg :)
        svc = Service $ \_ -> pure (Right fakeResponse)
        logged = withLogging logger svc
    req <- HTTP.parseRequest "http://example.com/test"
    _ <- runService logged req
    logs <- readIORef logRef
    length logs `shouldBe` 1
    let logMsg = head logs
    isInfixOf "example.com" logMsg `shouldBe` True

  it "logs failed requests" $ do
    logRef <- newIORef ([] :: [Text])
    let logger msg = modifyIORef' logRef (msg :)
        svc :: Service HTTP.Request HttpResponse
        svc = Service $ \_ -> pure (Left TimeoutError)
        logged = withLogging logger svc
    req <- HTTP.parseRequest "http://example.com/fail"
    _ <- runService logged req
    logs <- readIORef logRef
    length logs `shouldBe` 1
    let logMsg = head logs
    isInfixOf "ERR" logMsg `shouldBe` True

  it "does not alter the result" $ do
    let logger _ = pure ()
        svc = Service $ \_ -> pure (Right fakeResponse)
        logged = withLogging logger svc
    req <- HTTP.parseRequest "http://example.com/passthrough"
    result <- runService logged req
    case result of
      Right _  -> pure ()
      Left err -> expectationFailure $ "Expected Right, got: " ++ show err

fakeResponse :: HTTP.Response LBS.ByteString
fakeResponse = HTTP.Response
  { HTTP.responseStatus = HTTP.status200
  , HTTP.responseVersion = HTTP.http11
  , HTTP.responseHeaders = []
  , HTTP.responseBody = ""
  , HTTP.responseCookieJar = HTTP.createCookieJar []
  , HTTP.responseClose' = HTTP.ResponseClose (pure ())
  , HTTP.responseOriginalRequest = error "not used"
  , HTTP.responseEarlyHints = []
  }