stackctl-1.4.2.2: test/Stackctl/FilterOptionSpec.hs
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module Stackctl.FilterOptionSpec
( spec
) where
import Stackctl.Prelude
import Stackctl.AWS
import Stackctl.AWS.Scope
import Stackctl.Config (emptyConfig)
import Stackctl.FilterOption
import Stackctl.StackSpec
import Stackctl.StackSpecPath
import Stackctl.StackSpecYaml
import Test.Hspec
spec :: Spec
spec = do
describe "filterStackSpecs" $ do
it "filters specs matching any of the given patterns" $ do
let
Just option = filterOptionFromText "**/some-path,**/prefix/*,**/suffix"
specs =
[ toSpec "some-path" "some-path" Nothing
, toSpec "some-other-path" "some-path-other" Nothing
, toSpec "other-some-path" "other-some-path" Nothing
, toSpec "prefix-foo" "prefix/foo" Nothing
, toSpec "prefix-foo-bar" "prefix/foo-bar" Nothing
, toSpec "prefix-foo-bar-prefix" "prefix/foo-bar/prefix" Nothing
, toSpec "foo-suffix" "foo/suffix" Nothing
, toSpec "foo-bar-suffix" "foo/bar/suffix" Nothing
, toSpec "foo-suffix-bar" "foo/suffix/bar" Nothing
]
map specName (filterStackSpecs option specs)
`shouldMatchList` [ "some-path"
, "prefix-foo"
, "prefix-foo-bar"
, "foo-suffix"
, "foo-bar-suffix"
, "foo-suffix-bar"
]
it "filters specs by template too" $ do
let
Just option = filterOptionFromText "templates/x,**/y/*"
specs =
[ toSpec "some-path" "some-path" Nothing
, toSpec "some-other-path" "some-path-other" $ Just "x"
, toSpec "prefix-foo" "prefix/foo" Nothing
, toSpec "other-some-path" "other-some-path" $ Just "z/y/t"
, toSpec "prefix-foo-bar" "prefix/foo-bar" Nothing
]
map specName (filterStackSpecs option specs)
`shouldMatchList` ["some-other-path", "other-some-path"]
it "filters specs by name too" $ do
let
Just option = filterOptionFromText "some-name,**/prefix/*,templates/x"
specs =
[ toSpec "some-name" "some-path" Nothing
, toSpec "some-path" "some-path-other" $ Just "x"
, toSpec "prefix-foo" "prefix/foo" Nothing
, toSpec "other-some-path" "other-some-path" $ Just "z/y/t"
, toSpec "prefix-foo-bar" "prefix/foo-bar" Nothing
]
map specName (filterStackSpecs option specs)
`shouldMatchList` [ "some-name"
, "some-path"
, "prefix-foo"
, "prefix-foo-bar"
]
it "adds some intuitive fuzziness" $ do
let
Just option = filterOptionFromText "some/path,file,file.ext"
specs =
[ toSpec "some-name" "x/some/path/y" Nothing
, toSpec "some-path" "some-path/other" $ Just "x"
, toSpec "prefix-foo" "prefix/file.json" Nothing
, toSpec "other-some-path" "other-some-path" $ Just "z/y/t"
, toSpec "prefix-foo-bar" "prefix/foo-bar" Nothing
]
map specName (filterStackSpecs option specs)
`shouldMatchList` ["some-name", "prefix-foo"]
describe "filterOptionFromPaths" $ do
it "finds full paths (e.g. as output by generate)" $ do
let
option =
filterOptionFromPaths
$ pure "stacks/1234567890.test-account/us-east-1/stack.yaml"
specs =
[ toSpec "some-name" "stack.yaml" Nothing
, toSpec "other-path" "other-stack.yaml" $ Just "x"
]
map specName (filterStackSpecs option specs)
`shouldMatchList` ["some-name"]
toSpec :: Text -> FilePath -> Maybe FilePath -> StackSpec
toSpec name path mTemplate =
flip runReader emptyConfig
$ buildStackSpec ".platform/specs" specPath specBody
where
stackName = StackName name
specPath = stackSpecPath scope stackName path
specBody =
StackSpecYaml
{ ssyDescription = Nothing
, ssyDepends = Nothing
, ssyActions = Nothing
, ssyTemplate = fromMaybe path mTemplate
, ssyParameters = Nothing
, ssyCapabilities = Nothing
, ssyTags = Nothing
}
scope =
AwsScope
{ awsAccountId = AccountId "1234567890"
, awsAccountName = "test-account"
, awsRegion = Region' "us-east-1"
}
specName :: StackSpec -> Text
specName = unStackName . stackSpecStackName