packages feed

templatise-0.1.7.0: test/initialise/InitialiseSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module InitialiseSpec (spec) where

import Control.Monad.Logger (LogLevel (LevelDebug))
import Data.Maybe (fromJust)
import Data.Text (Text, pack)
import Distribution.SPDX (LicenseId (MIT))
import qualified Environment (T (..))
import Hooks (withProjectCopy)
import qualified Initialiser as SUT
import Network.URI (parseURI)
import System.Directory (doesDirectoryExist, 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 =
            Environment.T
              { Environment.name = "sentinel",
                Environment.cabalName = "sentinel",
                Environment.homepage = fromJust (parseURI "https://github.com/sentinel/sentinel.git"),
                Environment.author = "Sentinel",
                Environment.maintainer = "sentinel@example.com",
                Environment.licence = MIT,
                Environment.path = p,
                Environment.year = 1970,
                Environment.verbosity = LevelDebug
              }

      SUT.runInitialiser SUT.defaultInitialiser configuration

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

      doesDirectoryExist (p </> "bin" </> "initialise") `shouldReturn` False
      doesFileExist (p </> "bin" </> "sentinel" </> "Main.hs") `shouldReturn` True

      doesDirectoryExist (p </> "lib" </> "initialise") `shouldReturn` False
      doesDirectoryExist (p </> "lib" </> "sentinel") `shouldReturn` True

      doesDirectoryExist (p </> "test" </> "initialise") `shouldReturn` False
      doesFileExist (p </> "test" </> "sentinel" </> "Main.hs") `shouldReturn` True

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

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

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

      grep ps fs `shouldReturn` []

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