packages feed

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"]