packages feed

wai-middleware-throttle-0.1.0.0: test/WaiMiddlewareThrottleSpec.hs

------------------------------------------------------------------------
-- |
-- Module      : WaiMiddlewareThrottleSpec
-- Description : WAI Request Throttling Middleware
-- Copyright   : (c) 2015 Christopher Reichert
-- License     : BSD3
-- Maintainer  : Christopher Reichert <creichert07@gmail.com>
-- Stability   : unstable
-- Portability : POSIX
--
{-# LANGUAGE OverloadedStrings #-}

module WaiMiddlewareThrottleSpec (
    spec
  ) where

import           Control.Monad.IO.Class
import           Network.HTTP.Types
import           Network.HTTP.Types.Status
import           Network.Wai
import           Network.Wai.Test
import           Test.Hspec
import           Test.HUnit                      hiding (Test)

import           Network.Wai.Middleware.Throttle


spec :: Spec
spec = describe "Network.Wai.Middleware.Throttle" $
    it "throttles requests" caseThrottle


-- | Simple Hmac Middleware App
--
-- This app has preloaded api keys to simulate
-- some database or service which can access the
-- private keys.
throttleApp :: WaiThrottle -> Application
throttleApp st = throttle defaultThrottleSettings st
                   $ \_ f -> f response
  where
    payload  = "{ \"api\", \"return data\" }"
    response = responseLBS status200 [] payload


defReq :: Request
defReq  = defaultRequest
            { requestMethod  = "GET"
            , requestHeaders = [ ("Content-Type", "application/json") ]
            }


-- | Test Hmac Authentication
caseThrottle :: Assertion
caseThrottle = do

  st <- liftIO initThrottler

  statuses <- flip runSession (throttleApp st) $ do
    responses <- mapM (const (request defReq)) [ 1 .. 100 :: Integer ]
    mapM (return . simpleStatus) responses

  let msg = "Verifying some of the requests were throttled"
  assertBool msg  $ elem status429 statuses