chiasma-0.2.0.0: integration/Chiasma/Test/ProcessTest.hs
module Chiasma.Test.ProcessTest where
import Chiasma.Data.Conduit (createSinkFlush)
import Chiasma.Native.Api (TmuxNative(..))
import Chiasma.Native.Process (socketArg)
import Conduit (ConduitT, Flush(..), mapC, runConduit, sinkList, yieldMany, (.|))
import Data.ByteString.Internal (packChars)
import qualified Data.Conduit.Combinators as Conduit (concatMap, take)
import Data.Conduit.Process.Typed (
Process,
createSource,
getStdin,
getStdout,
proc,
setStdin,
setStdout,
withProcessTerm,
)
import qualified Data.Text as Text (splitOn)
import Hedgehog (assert)
import Chiasma.Test.Tmux (tmuxSpec)
import Chiasma.Test.Util (UnitTest)
run :: Process (ConduitT (Flush ByteString) Void IO ()) (ConduitT () ByteString IO ()) () -> IO [Text]
run prc = do
let stdin' = mapC (fmap packChars) .| getStdin prc
let stdout' = getStdout prc
runConduit $ yieldMany ([Chunk "list-panes\n"] :: [Flush String]) .| stdin'
runConduit $ yieldMany ([Flush] :: [Flush String]) .| stdin'
runConduit $ stdout' .| Conduit.take 2 .| mapC decodeUtf8 .| Conduit.concatMap (Text.splitOn "\n") .| sinkList
test_process :: UnitTest
test_process = do
out <- liftIO $ tmuxSpec $ \(TmuxNative sock) -> do
withProcessTerm (pc (args sock)) run
assert (length out > 3)
where
pc =
setStdin createSinkFlush . setStdout createSource . proc "tmux"
args sock =
toString <$> socketArg sock ++ ["-C", "attach"]