packages feed

systranything-0.1.3.0: tests/Tests/Model/Common.hs

{- AUTOCOLLECT.TEST -}

module Tests.Model.Common
  (
  {- AUTOCOLLECT.TEST.export -}
  )
where

import Data.IORef (modifyIORef, newIORef, readIORef)
import Data.Text qualified as Text
import Model.Common (runCommand')
import Test.Hspec.Expectations (shouldBe, shouldSatisfy)
import Test.Tasty (testGroup)
import Test.Tasty.HUnit (testCase)

test :: TestTree
test =
  testGroup
    "runCommand"
    [ testGroup
        "succeeding"
        [ testCase "outputs stdout" $ do
            result <- runCommandNoOutput False succeedingCommand
            result `shouldBe` Just "hello",
          testCase "in verbose mode prints stdout and stderr" $ do
            (_, output) <- runCommandWithOutput True succeedingCommand
            output `shouldSatisfy` containsAll ["stdout", "stderr"]
        ],
      testGroup
        "failing"
        [ testCase "returns nothing" $ do
            result <- runCommandNoOutput False failingCommand
            result `shouldBe` Nothing,
          testCase "prints the command to stdout" $ do
            (_, output) <- runCommandWithOutput False failingCommand
            output `shouldSatisfy` Text.isInfixOf "exit 1",
          testCase "prints stdout and stderr" $ do
            (_, output) <- runCommandWithOutput False failingCommand
            output `shouldSatisfy` containsAll ["stdout", "stderr"]
        ]
    ]
  where
    succeedingCommand = "echo 'hello'"
    failingCommand = "exit 1"
    runCommandNoOutput = runCommand' $ const $ pure ()
    runCommandWithOutput verbose cmd = do
      ref <- newIORef Text.empty
      result <- runCommand' (appendTo ref) verbose cmd
      (result,) <$> readIORef ref
    appendTo ref = modifyIORef ref . flip (<>)
    containsAll extracts text = all (`Text.isInfixOf` text) extracts