packages feed

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

{-# LANGUAGE OverloadedStrings #-}

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

import Data.IORef
import qualified Network.HTTP.Client as HTTP
import Test.Hspec

import Network.HTTP.Tower.Client (HttpResponse)
import Tower.Service
import Network.HTTP.Tower.Middleware.RequestId
import Network.HTTP.Tower.Middleware.TestDouble (withRecorder)

spec :: Spec
spec = describe "RequestId middleware" $ do
  it "adds X-Request-ID header" $ do
    recorder <- newIORef []
    let svc = withRequestId (withRecorder recorder (Service $ \_ -> pure (Right fakeResponse)))
    req <- HTTP.parseRequest "http://example.com"
    _ <- runService svc req
    recorded <- readIORef recorder
    let hdrs = HTTP.requestHeaders (head recorded)
    lookup "X-Request-ID" hdrs `shouldSatisfy` (/= Nothing)

  it "generates unique IDs per request" $ do
    recorder <- newIORef []
    let svc = withRequestId (withRecorder recorder (Service $ \_ -> pure (Right fakeResponse)))
    req <- HTTP.parseRequest "http://example.com"
    _ <- runService svc req
    _ <- runService svc req
    recorded <- readIORef recorder
    let ids = map (lookup "X-Request-ID" . HTTP.requestHeaders) recorded
    length ids `shouldBe` 2
    head ids `shouldSatisfy` (/= last ids)

  it "uses custom header name" $ do
    recorder <- newIORef []
    let svc = withRequestIdHeader "X-Correlation-ID" (withRecorder recorder (Service $ \_ -> pure (Right fakeResponse)))
    req <- HTTP.parseRequest "http://example.com"
    _ <- runService svc req
    recorded <- readIORef recorder
    let hdrs = HTTP.requestHeaders (head recorded)
    lookup "X-Correlation-ID" hdrs `shouldSatisfy` (/= Nothing)

fakeResponse :: HttpResponse
fakeResponse = error "fakeResponse: body not evaluated in RequestId tests"