packages feed

language-puppet-1.5.1: tests/ErbSpec.hs

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