packages feed

himari-1.0.0.1: test/HlintUnliftioSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module HlintUnliftioSpec (spec) where

import Data.Text qualified as T
import Himari
import Test.Syd

spec :: Spec
spec = do
  describe "hlint unliftio preference rules" . beforeAll runHlintOnSample $ do
    itWithOuter "Control.Exception.catch should warn to use UnliftIO.Exception" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.Exception.catch"

    itWithOuter "Control.Exception.bracket should warn to use UnliftIO.Exception" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.Exception.bracket"

    itWithOuter "Control.Exception.finally should warn to use UnliftIO.Exception" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.Exception.finally"

    itWithOuter "Control.Exception.try should warn to use UnliftIO.Exception" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.Exception.try"

    itWithOuter "Control.Concurrent.MVar.withMVar should warn to use UnliftIO.MVar" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.MVar.withMVar"

    itWithOuter "Control.Concurrent.MVar.modifyMVar_ should warn to use UnliftIO.MVar" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.MVar.modifyMVar_"

    itWithOuter "System.Timeout.timeout should warn to use UnliftIO.Timeout" $ \output -> do
      output `shouldSatisfy` containsWarning "UnliftIO.Timeout.timeout"

runHlintOnSample :: IO Text
runHlintOnSample = do
  (exitCode, stdoutOutput, stderrOutput) <-
    readProcess
      $ proc "hlint" ["test/HlintSamples/UnliftioPreference.hs"]
  pure $ case exitCode of
    ExitSuccess -> convert stdoutOutput
    ExitFailure _ -> convert stdoutOutput <> convert stderrOutput

containsWarning :: Text -> Text -> Bool
containsWarning expectedMsg output = expectedMsg `T.isInfixOf` output