packages feed

templatise-0.1.3.0: test/initialise/FileGolden.hs

{-# LANGUAGE OverloadedStrings #-}

module FileGolden (golden) where

import Configuration (Configuration (..))
import Control.Monad.Logger (LogLevel (LevelDebug))
import Control.Monad.Reader (liftIO)
import Data.Maybe (fromJust)
import Data.Text.IO (readFile)
import Data.Text.Lazy (fromStrict)
import Data.Text.Lazy.Encoding (encodeUtf8)
import Distribution.SPDX.LicenseId (LicenseId (MIT))
import qualified File as SUT
import Initialiser (runInitialiser)
import Network.URI (parseURI)
import System.FilePath (isExtensionOf, normalise, replaceExtension, takeBaseName, takeExtension)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Golden (findByExtension, goldenVsStringDiff)
import Prelude hiding (readFile)

golden :: IO TestTree
golden = do
  testGroup "File.convert"
    <$> mapM
      g
      [ "devcontainer.json",
        "CHANGELOG.md",
        "haskell-ci.yml"
      ]
  where
    d = normalise "test/initialise/data"
    g n =
      let ext = takeExtension n
       in testGroup n
            . map convertTest
            . filter (not . ((".golden" ++ ext) `isExtensionOf`))
            <$> findByExtension [ext] d

convertTest :: FilePath -> TestTree
convertTest p = goldenVsStringDiff n diff gold action
  where
    n = takeBaseName p
    diff a b = ["diff", "-u", a, b]
    gold = p `replaceExtension` ".golden" ++ takeExtension p
    action = do
      contents <- liftIO (readFile p)
      encodeUtf8 . fromStrict <$> runInitialiser (SUT.convert contents) configuration
    configuration =
      Configuration
        { name = "sentinel",
          cabalName = "sentinel",
          homepage = fromJust (parseURI "https://github.com/sentinel/sentinel.git"),
          author = "Sentinel",
          maintainer = "sentinel@example.com",
          licence = MIT,
          path = ".",
          year = 1970,
          verbosity = LevelDebug
        }