packages feed

flink-statefulfun-0.2.0.0: src/Network/Flink/Test.hs

-- | This module is used to store all the
-- utility functions used for testing.
module Network.Flink.Test (testStatefulFunc) where

import Control.Monad.Except (runExceptT)
import Control.Monad.Reader (ReaderT (runReaderT))
import Control.Monad.State (StateT (..))
import Data.Either.Combinators (fromRight')
import Data.Functor (($>))
import Network.Flink.Internal.Stateful
  ( Env (Env),
    Function (runFunction),
    FunctionState,
    newState,
  )

-- | Function for testing stateful functions locally.
--
-- Runs function given some initial state and
-- input message. The final state of the function
-- is returned along with all messages, egress, etc.
-- that were queued up to be sent to Flink during execution.
--
-- Function contains __unsafe__ code, don't use for anything but test cases.
testStatefulFunc ::
  -- | Initial state for test run
  s ->
  -- | Function to run
  (a -> Function s ()) ->
  -- | Input message
  a ->
  IO (FunctionState s)
testStatefulFunc initialCtx func input = runner (newState initialCtx)
  where
    env = Env "test_namespace" "test_function" "placeholder_id"
    runner state = do
      (res, state') <- runReaderT (runStateT (runExceptT $ runFunction (func input)) state) env
      return $ fromRight' (res $> state')