packages feed

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

{-# LANGUAGE OverloadedStrings #-}

module Network.HTTP.Tower.Middleware.SetHeaderSpec (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.SetHeader
import Network.HTTP.Tower.Middleware.TestDouble (withRecorder)

spec :: Spec
spec = describe "SetHeader middleware" $ do
  it "adds a single header to requests" $ do
    recorder <- newIORef []
    let svc = withHeader "X-Custom" "value" (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-Custom" hdrs `shouldBe` Just "value"

  it "adds multiple headers" $ do
    recorder <- newIORef []
    let svc = withHeaders [("X-A", "1"), ("X-B", "2")] (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-A" hdrs `shouldBe` Just "1"
    lookup "X-B" hdrs `shouldBe` Just "2"

  it "adds Bearer auth header" $ do
    recorder <- newIORef []
    let svc = withBearerAuth "my-token" (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 "Authorization" hdrs `shouldBe` Just "Bearer my-token"

  it "sets User-Agent header" $ do
    recorder <- newIORef []
    let svc = withUserAgent "http-tower/0.1" (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 "User-Agent" hdrs `shouldBe` Just "http-tower/0.1"

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