packages feed

stackctl-1.1.3.0: test/Stackctl/StackSpecSpec.hs

module Stackctl.StackSpecSpec
  ( spec
  ) where

import Stackctl.Prelude

import Stackctl.AWS
import Stackctl.AWS.Scope
import Stackctl.Config (emptyConfig)
import Stackctl.StackSpec
import Stackctl.StackSpecPath
import Stackctl.StackSpecYaml
import Test.Hspec

spec :: Spec
spec = do
  describe "sortStackSpecs" $ do
    it "orders dependencies before dependents" $ do
      let
        specs =
          [ toSpec "app" ["roles", "iam", "networking"]
          , toSpec "roles" ["iam"]
          , toSpec "iam" []
          , toSpec "networking" []
          ]

      map specName (sortStackSpecs specs)
        `shouldBe` ["iam", "roles", "networking", "app"]

toSpec :: Text -> [Text] -> StackSpec
toSpec name depends = flip runReader emptyConfig
  $ buildStackSpec "." specPath specBody
 where
  stackName = StackName name
  specPath = stackSpecPath scope stackName "a/b.yaml"
  specBody = StackSpecYaml
    { ssyDescription = Nothing
    , ssyDepends = Just $ map StackName depends
    , ssyActions = Nothing
    , ssyTemplate = ""
    , ssyParameters = Nothing
    , ssyCapabilities = Nothing
    , ssyTags = Nothing
    }

  scope = AwsScope
    { awsAccountId = AccountId ""
    , awsAccountName = ""
    , awsRegion = Region' ""
    }

specName :: StackSpec -> Text
specName = unStackName . stackSpecStackName