packages feed

amazonka-mtl-0.1.0.0: library/Control/Monad/AWS/MockT.hs

{-# LANGUAGE DerivingVia #-}

-- | Concrete reader monad over 'Matchers'
--
-- Its 'MonadAWS' instance can be used in tests where you don't have or
-- want your own test-app transformer:
--
-- @
-- import "Amazonka.S3"
-- import "Control.Monad.AWS"
--
-- spec :: Spec
-- spec = do
--   describe "someAction" $ do
--     it "works" $ do
--       let matcher = 'SendMatcher' (const True) -- match all calls
--            $ 'newListBucketsResponse'          -- return no buckets
--            & 'listBucketsResponse_buckets' ?~ []
--
--       names <- 'runMockT' $ 'withMatcher' matcher $ someAction
--       names `shouldBe` []
--
-- someAction :: (MonadIO m, 'MonadAWS') m => m [BucketName]
-- someAction = do
--   resp <- 'send' 'newListBuckets'
--   pure
--     $ maybe [] (map (^. bucket_name))
--     $ resp ^. listBucketsResponse_buckets
-- @
module Control.Monad.AWS.MockT
  ( MockT
  , runMockT

    -- * Setting up 'Matchers'
  , Matcher (..)
  , withMatcher
  , withMatchers
  ) where

import Prelude

import Control.Monad.AWS.Class
import Control.Monad.AWS.Matchers
import Control.Monad.AWS.ViaMock
import Control.Monad.IO.Unlift
import Control.Monad.Reader

newtype MockT m a = MockT
  { unMockT :: ReaderT Matchers m a
  }
  deriving newtype
    ( Functor
    , Applicative
    , Monad
    , MonadIO
    , MonadUnliftIO
    , MonadReader Matchers
    )
  deriving (MonadAWS) via (MockAWS (MockT m))

runMockT :: MockT m a -> m a
runMockT f = runReaderT (unMockT f) mempty