packages feed

sandwich-0.3.0.5: test/IntroduceWith.hs

{-# LANGUAGE DataKinds #-}

module IntroduceWith where


import Control.Monad.IO.Class
import Control.Monad.Trans.Writer
import GHC.Stack
import Test.Sandwich
import UnliftIO.Exception

import TestUtil

tests :: MonadIO m => WriterT [SomeException] m ()
tests = do
  run introduceWithFailsOnAllocateException
  run introduceWithFailsOnCleanUpException

main :: IO ()
main = mainWith tests

-- * Tests

introduceWithFailsOnAllocateException :: (HasCallStack) => IO ()
introduceWithFailsOnAllocateException = do
  (results, msgs) <- runAndGetResultsAndLogs $ introduceWith "introduce with" fakeDatabaseLabel withAction $ do
    it "does thing 1" $ return ()

  msgs `mustBe` [[], []]
  results `mustBe` [Failure (GotException Nothing (Just "Exception in introduceWith 'introduce with' handler") someUserErrorWrapped)
                   , Failure (GetContextException Nothing someUserErrorWrapped)]
  where
    withAction action = do
      throwSomeUserError
      _ <- action FakeDatabase
      return ()

introduceWithFailsOnCleanUpException :: (HasCallStack) => IO ()
introduceWithFailsOnCleanUpException = do
  (results, msgs) <- runAndGetResultsAndLogs $ introduceWith "introduce with" fakeDatabaseLabel withAction $ do
    it "does thing 1" $ return ()

  msgs `mustBe` [[], []]
  results `mustBe` [Failure (GotException Nothing (Just "Exception in introduceWith 'introduce with' handler") someUserErrorWrapped)
                   , Success]
  where
    withAction action = do
      _ <- action FakeDatabase
      throwSomeUserError