packages feed

shikumi-tools-0.2.0.0: test/ShellSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module ShellSpec (tests) where

import Control.Lens ((^.))
import Data.Text qualified as T
import MockLLM (runEffMock)
import Shikumi.Tool (Tool (..))
import Shikumi.Tool.Builtin.Shell (BashReq (..), bashTool)
import Shikumi.Tool.Env (localToolEnv)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (assertBool, assertFailure, testCase, (@?=))

tests :: TestTree
tests =
  testGroup
    "Tool.Shell"
    [ testCase "bash captures stdout and zero exit" $ do
        result <-
          runEffMock [] $
            run
              (bashTool localToolEnv)
              BashReq {command = "echo hi", cwd = Nothing, timeoutMs = Just 5000, stdin = Nothing}
        case result of
          Left err -> assertFailure ("bashTool failed: " <> show err)
          Right resp -> do
            resp ^. #exitCode @?= 0
            assertBool "stdout contains hi" ("hi" `T.isInfixOf` (resp ^. #stdout)),
      testCase "bash returns stderr and non-zero exit as a value" $ do
        result <-
          runEffMock [] $
            run
              (bashTool localToolEnv)
              BashReq {command = "echo oops 1>&2; exit 3", cwd = Nothing, timeoutMs = Just 5000, stdin = Nothing}
        case result of
          Left err -> assertFailure ("bashTool failed: " <> show err)
          Right resp -> do
            resp ^. #exitCode @?= 3
            assertBool "stderr contains oops" ("oops" `T.isInfixOf` (resp ^. #stderr))
    ]