{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedLists #-}
module Helpers ( module Exports
, compileCatalog
, checkExprsSuccess
, checkExprsError
, getCatalog
, getResource
, getAttribute
, spretty
, withStdlibFunction
) where
import XPrelude as Exports
import Control.Monad as Exports (fail)
import qualified Data.HashMap.Strict as HM
import qualified Data.Maybe.Strict as S
import Data.Text as Text
import qualified Data.Vector as Vector
import Test.Hspec as Exports
import Puppet.Interpreter as Exports
import Puppet.Parser as Exports
import Puppet.Runner as Exports hiding (getCatalog)
compileCatalog :: MonadError String m => Text -> m (FinalCatalog, EdgeMap, FinalCatalog, [Resource], InterpreterState)
compileCatalog input = do
statements <- either (throwError . show) return (runPParser "dummy" input)
let nodename = "node.fqdn"
sttmap =
[((TopNode, nodename), NodeDeclaration (NodeDecl (NodeName nodename) statements S.Nothing (initialPPos "dummy")))
]
(res, finalState, _) = pureEval dummyFacts sttmap (computeCatalog nodename)
(catalog, em, exported, defResources) <- either (throwError . show) return res
return (catalog, em, exported, defResources, finalState)
getCatalog :: MonadError String m => Text -> m FinalCatalog
getCatalog = fmap (view _1) . compileCatalog
spretty :: Pretty a => a -> String
spretty = flip displayS "" . renderCompact . pretty
getResource :: (Monad m) => RIdentifier -> FinalCatalog -> m Resource
getResource resid catalog = maybe (fail ("Unknown resource " ++ spretty resid)) return (HM.lookup resid catalog)
getAttribute :: Monad m => Text -> Resource -> m PValue
getAttribute att res =
case res ^? rattributes . ix att of
Nothing -> fail ("Unknown attribute: " ++ Text.unpack att)
Just x -> return x
withStdlibFunction :: Text -> ( ([PValue] -> InterpreterMonad PValue) -> Spec ) -> Spec
withStdlibFunction fname testsuite =
case stdlibFunctions ^? ix fname of
Just f -> testsuite f
Nothing -> panic ("Don't know this function: " <> fname)
checkExprsSuccess :: Text -> [Expression] -> Text -> Expectation
checkExprsSuccess fname args res =
case evalExprs fname args of
Left rr -> expectationFailure (show rr)
Right res' -> res' `shouldBe` res
checkExprsError :: Text -> [Expression] -> String -> Expectation
checkExprsError fname args msg =
case evalExprs fname args of
Left rr -> show rr `shouldContain` msg
Right r -> expectationFailure ("Should have errored, received this instead: " <> show r)
evalExprs :: Text -> [Expression] -> Either PrettyError Text
evalExprs fname =
dummyEval . resolveValue . UFunctionCall fname . Vector.fromList
>=> \pv -> case pv of
PString s -> return s
_ -> Left ("Expected a string, not " <> PrettyError (pretty pv))