pms-domain-service-0.0.1.0: test/PMS/Domain/Service/App/ControlSpec.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module PMS.Domain.Service.App.ControlSpec (spec) where
import Test.Hspec
import Control.Concurrent.Async
import qualified Control.Concurrent.STM as STM
import Control.Lens
import Data.Default
import qualified PMS.Domain.Model.DM.Type as DM
import qualified PMS.Domain.Service.App.Control as SUT
import qualified PMS.Domain.Service.DM.Type as SUT
-- |
--
data SpecContext = SpecContext {
_domainDataSpecContext :: DM.DomainData
, _appDataSpecContext :: SUT.AppStateW
}
makeLenses ''SpecContext
defaultSpecContext :: IO SpecContext
defaultSpecContext = do
domDat <- DM.defaultDomainData
let appDat = SUT.AppStateW SUT.StartState
return SpecContext {
_domainDataSpecContext = domDat
, _appDataSpecContext = appDat
}
-- |
--
spec :: Spec
spec = do
runIO $ putStrLn "Start Spec."
beforeAll setUpOnce $
afterAll tearDownOnce .
beforeWith setUp .
after tearDown $ run
-- |
--
setUpOnce :: IO SpecContext
setUpOnce = do
putStrLn "[INFO] EXECUTED ONLY ONCE BEFORE ALL TESTS START."
defaultSpecContext
-- |
--
tearDownOnce :: SpecContext -> IO ()
tearDownOnce _ = do
putStrLn "[INFO] EXECUTED ONLY ONCE AFTER ALL TESTS FINISH."
-- |
--
setUp :: SpecContext -> IO SpecContext
setUp ctx = do
putStrLn "[INFO] EXECUTED BEFORE EACH TEST STARTS."
domDat <- DM.defaultDomainData
return ctx { _domainDataSpecContext = domDat
, _appDataSpecContext = SUT.AppStateW SUT.StartState
}
-- |
--
tearDown :: SpecContext -> IO ()
tearDown _ = do
putStrLn "[INFO] EXECUTED AFTER EACH TEST FINISHES."
-- |
--
run :: SpecWith SpecContext
run = do
describe "runWithAppData" $ do
context "when McpInitializeRequest" $ do
it "should be initialized." $ \ctx -> do
putStrLn "[INFO] EXECUTING THE FIRST TEST."
let domDat = ctx^.domainDataSpecContext
appDat = ctx^.appDataSpecContext
reqQ = domDat^.DM.requestQueueDomainData
resQ = domDat^.DM.responseQueueDomainData
args = DM.McpInitializeRequest def
expect = ""
thId <- async $ SUT.runWithAppData appDat domDat
STM.atomically $ STM.writeTQueue reqQ args
(DM.McpInitializeResponse dat) <- STM.atomically $ STM.readTQueue resQ
let actual = dat^.DM.jsonrpcMcpInitializeResponseData^.DM.jsonrpcJsonRpcRequest
actual `shouldBe` expect
cancel thId