packages feed

tower-hs-0.1.0.0: src/Tower/Middleware/TestDouble.hs

-- |
-- Module      : Tower.Middleware.TestDouble
-- Description : Mock services and request recording for testing
-- License     : MIT
--
-- @
-- -- Replace the service entirely
-- 'withMock' (\\req -> pure (Right fakeResponse))
--
-- -- Record requests for assertions
-- recorder <- newIORef []
-- 'withRecorder' recorder
-- @
module Tower.Middleware.TestDouble
  ( withMock
  , withRecorder
  ) where

import Data.IORef

import Tower.Service (Service(..), Middleware)
import Tower.Error (ServiceError)

-- | Replace the inner service entirely with a mock function.
-- The inner service is never called.
withMock
  :: (req -> IO (Either ServiceError res))
  -> Middleware req res
withMock handler _inner = Service handler

-- | Record all requests that pass through, then forward to the inner service.
-- The recorder stores requests in reverse order (most recent first).
--
-- @
-- recorder <- newIORef []
-- let svc = 'withRecorder' recorder innerService
-- @
withRecorder :: IORef [req] -> Middleware req res
withRecorder ref inner = Service $ \req -> do
  modifyIORef' ref (req :)
  runService inner req