packages feed

templatise-0.1.7.0: test/initialise/OptionsSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module OptionsSpec (spec) where

import Data.Text (Text, isInfixOf, pack)
import Defaults (Defaults (..))
import qualified Environment (T)
import qualified Options as SUT
import Options.Applicative
  ( ParserResult
      ( CompletionInvoked,
        Failure,
        Success
      ),
    defaultPrefs,
    execParserPure,
    renderFailure,
  )
import System.Exit (ExitCode (ExitFailure, ExitSuccess))
import Test.Hspec (Spec, describe, it, shouldSatisfy)

spec :: Spec
spec =
  describe "Options" $ do
    describe "parserInfo" $ do
      it "should error if homepage isn't a URI" $
        parse ["--homepage", "not-a-url"]
          `shouldSatisfy` failWith "option --homepage: cannot parse value `not-a-url'"
      it "should error if licence isn't an SPDX licence ID" $ do
        parse ["--licence", "not-a-licence"]
          `shouldSatisfy` failWith "option --licence: cannot parse value `not-a-licence'"

failWith :: Text -> ParserResult a -> Bool
failWith _ (Success _) = False
failWith _ (CompletionInvoked _) = False
failWith m (Failure f) = case renderFailure f "" of
  (_, ExitSuccess) -> False
  (m', ExitFailure _) -> m `isInfixOf` pack m'

parse :: [String] -> ParserResult Environment.T
parse =
  execParserPure defaultPrefs (SUT.parserInfo defaults)

defaults :: Defaults
defaults =
  Defaults
    { dOrigin = "http://github.com/username/repository.git",
      dAuthor = "Forename Surname",
      dMaintainer = "username@example.com",
      dPath = ".",
      dYear = 1970
    }