module ErbSpec (spec) where import Erb import GHC.Base (error) import Puppet.Runner import Test.Hspec import XPrelude 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 (scope_name, scope) = case extractScope state0 of Just p -> p Nothing -> error "should not happen" 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