packages feed

templatise-0.1.2.0: test/initialise/InitialiseSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module InitialiseSpec (spec) where

import Configuration (Configuration (..))
import Data.Maybe (fromJust)
import Data.Text (Text, pack)
import Distribution.SPDX (LicenseId (MIT))
import Hooks (withProjectCopy)
import qualified Initialise as SUT
import Network.URI (parseURI)
import System.Directory (doesFileExist)
import System.FilePath ((</>))
import System.Process (readProcess)
import Test.Hspec (Spec, describe, runIO, shouldNotReturn, shouldReturn)

spec :: Spec
spec = describe "Initialisers" $ do
  describe "defaultInitialiser" $ do
    runIO $ withProjectCopy $ \p -> do
      let configuration =
            Configuration
              { name = "sentinel",
                homepage = fromJust (parseURI "https://github.com/sentinel/sentinel.git"),
                author = "Sentinel",
                maintainer = "sentinel@example.com",
                licence = MIT,
                path = p,
                year = 1970
              }

      SUT.runInitialise SUT.defaultInitialiser configuration

      doesFileExist (p </> "templatise.cabal") `shouldReturn` False
      doesFileExist (p </> "sentinel.cabal") `shouldReturn` True

      grep ["MIT"] [p </> "LICENSE"] `shouldNotReturn` []

      let ps =
            [ "initialise",
              "template-hs",
              "template.hs",
              "templatise"
            ]

      let fs =
            map
              (p </>)
              [ ".devcontainer" </> "devcontainer.json",
                ".github" </> "workflows" </> "haskell-ci.yml",
                "CHANGELOG.md",
                "sentinel.cabal"
              ]

      grep ps fs `shouldReturn` []

grep :: [String] -> [FilePath] -> IO [Text]
grep ps fs = map pack . lines <$> readProcess "grep" ("-o" : unlines ps : fs) ""