module ErbSpec(spec) where import XPrelude import Test.Hspec import Erb import Puppet.Runner parsingtests :: [(String, [RubyStatement])] parsingtests = [ ("port = 5432", [ Puts (Value (Literal "port = 5432" ))]) , ("mode = host=<%= @var %>", [ Puts (Value (Literal "mode = host=")) , Puts (Object (Value (Literal "@var"))) , Puts (Value (Literal ""))]) , ("mode = host=<%= var %>", [ Puts (Value (Literal "mode = host=")) , Puts (Object (Value (Literal "var"))) , Puts (Value (Literal ""))]) , ("<%= @os['architecture'] %>", [ Puts (Value (Literal "")) , Puts (LookupOperation (Object (Value (Literal "@os"))) (Value (Literal "architecture"))) , Puts (Value (Literal ""))]) , ("<%= @os['release']['major'] %>", [ Puts (Value (Literal "")) , Puts (LookupOperation (LookupOperation (Object (Value (Literal "@os"))) (Value (Literal "release"))) (Value (Literal "major"))) , Puts (Value (Literal ""))]) , ("<%= @processors['models'] %>", [ Puts (Value (Literal "")) , Puts (LookupOperation (Object (Value (Literal "@processors"))) (Value (Literal "models"))) , Puts (Value (Literal ""))]) , ("<%= scope.lookupvar('::fqdn') %>", [ Puts (Value (Literal "")) , Puts (ScopeObject (Value (Literal "::fqdn"))) , Puts(Value (Literal ""))]) , ("<%= scope.lookupvar(\"::fqdn\") %>", [ Puts (Value (Literal "")) , Puts (ScopeObject (Value (Literal "::fqdn"))) , Puts(Value (Literal ""))]) ] resolvetests :: [([RubyStatement], Text)] resolvetests = [ ([ Puts (Object (Value (Literal "@hostname")))] , "dummy" ) , ([ Puts (LookupOperation (Object (Value (Literal "@os"))) (Value (Literal "architecture")))] , "amd64" ) , ([ Puts (LookupOperation (LookupOperation (Object (Value (Literal "@os"))) (Value (Literal "release"))) (Value (Literal "major")))] , "7" ) , ([ Puts (LookupOperation (Object (Value (Literal "@processors"))) (Value (Literal "models")))] , expectedmodels ) , ([ Puts (ScopeObject (Value (Literal "::fqdn")))] , "dummy.dummy.domain" ) ] where expectedmodels = "[\"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\", \"Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz\"]" parsingspec = for_ parsingtests $ \(s, e) -> let item = it ("should parse " <> s) in case parseErbString s of Left err -> item $ expectationFailure (show err) Right r -> item $ r `shouldBe` e resolvespec = let state0 = initialState dummyFacts mempty Just (scope_name, scope) = extractScope state0 in for_ resolvetests $ \(s, e) -> let item = it ("should resolve " <> show s) in case rubyEvaluate scope scope_name s of Left err -> item $ expectationFailure (show err) Right r -> item $ r `shouldBe` e spec = describe "Erb" $ do parsingspec resolvespec