packages feed

templatise-0.1.7.0: test/initialise/CabalGolden.hs

{-# LANGUAGE OverloadedStrings #-}

module CabalGolden (golden) where

import qualified Cabal as SUT
import Control.Monad.Logger (LogLevel (LevelDebug))
import Control.Monad.Reader (liftIO)
import Data.ByteString (readFile)
import Data.ByteString.Lazy.Char8 (pack)
import Data.Maybe (fromJust)
import Data.Text (unpack)
import Distribution.SPDX.LicenseId (LicenseId (MIT))
import qualified Environment (T (..))
import Initialiser (runInitialiser)
import Network.URI (parseURI)
import System.FilePath (isExtensionOf, normalise, replaceExtension, takeBaseName)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.Golden (findByExtension, goldenVsStringDiff)
import Prelude hiding (readFile)

golden :: IO TestTree
golden =
  testGroup "Cabal.convert"
    . map convertTest
    . filter (not . (".golden.cabal" `isExtensionOf`))
    <$> findByExtension [".cabal"] d
  where
    d = normalise "test/initialise/data"

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.cabal"
    action = do
      contents <- liftIO (readFile p)
      pack . unpack <$> runInitialiser (SUT.convert contents) environment
    environment =
      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 = ".",
          Environment.year = 1970,
          Environment.verbosity = LevelDebug
        }