packages feed

tower-hs-0.2.0.0: test/Tower/Middleware/FilterSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Tower.Middleware.FilterSpec (spec) where

import Test.Hspec

import Tower.Service
import Tower.Error
import Tower.Error.Testing ()
import Data.Function ((&))
import Tower.Middleware.Filter

spec :: Spec
spec = describe "Filter middleware" $ do
  describe "withFilter" $ do
    it "allows matching requests through" $ do
      let svc :: Service String String
          svc = Service $ \_ -> pure (Right "ok")
          filtered = svc & withFilter (const True)
      result <- runService filtered "request"
      result `shouldBe` Right "ok"

    it "rejects non-matching requests" $ do
      let svc :: Service String String
          svc = Service $ \_ -> pure (Right "ok")
          filtered = svc & withFilter (const False)
      result <- runService filtered "request"
      result `shouldBe` Left (CustomError "Request filtered out")

    it "filters based on request properties" $ do
      let svc :: Service String String
          svc = Service $ \_ -> pure (Right "ok")
          onlyGet = svc & withFilter (== "GET")
      getResult <- runService onlyGet "GET"
      postResult <- runService onlyGet "POST"
      getResult `shouldBe` Right "ok"
      postResult `shouldBe` Left (CustomError "Request filtered out")