{-# LANGUAGE OverloadedStrings #-}
module ForwardedSpec where
import Data.ByteString (ByteString)
import Test.Hspec
import qualified Data.CaseInsensitive as CI
import qualified Network.HTTP.Forwarded as F
valIs :: Maybe ByteString -> ByteString -> Expectation
valIs a b = shouldBe a (Just b)
valIsInsensitive :: Maybe (CI.CI ByteString) -> ByteString -> Expectation
valIsInsensitive a b = shouldBe a (Just $ CI.mk b)
spec :: Spec
spec = do
describe "parsing" $ do
context "full header" $ do
let val = "by=foo; for=bar; host=haskell.org; proto=https"
let parsed = F.parseForwarded val
it "parses" $ do
F.forwardedBy parsed `valIs` "foo"
F.forwardedFor parsed `valIs` "bar"
F.forwardedHost parsed `valIs` "haskell.org"
F.forwardedProto parsed `valIsInsensitive` "https"
it "should encode" $ do
F.serializeForwarded parsed `shouldBe` val
it "parses even without spaces" $ do
let p = F.parseForwarded "by=foo;for=bar;host=haskell.org;proto=https"
F.forwardedBy p `valIs` "foo"
F.forwardedFor p `valIs` "bar"
F.forwardedHost p `valIs` "haskell.org"
F.forwardedProto p `valIsInsensitive` "https"
context "only proto part" $ do
let val = "proto=http"
let parsed = F.parseForwarded val
it "parses" $ do
F.forwardedBy parsed `shouldBe` Nothing
F.forwardedFor parsed `shouldBe` Nothing
F.forwardedHost parsed `shouldBe` Nothing
F.forwardedProto parsed `valIsInsensitive` "http"
it "should serialize" $ do
F.serializeForwarded parsed `shouldBe` val
describe "properties" $ do
it "proto part is case insensitive" $ do
let val = "proto=HTTP"
let parsed = F.parseForwarded val
F.forwardedProto parsed `shouldBe` (Just "http")
it "for part is case sensitive" $ do
let val = "by=FOO"
let parsed = F.parseForwarded val
F.forwardedBy parsed `shouldNotBe` (Just "foo")