cloud-seeder-0.1.0.0: test-suite/Network/CloudSeeder/CommandLineSpec.hs
module Network.CloudSeeder.CommandLineSpec (spec) where
import Options.Applicative (ParserResult(..), ParserInfo(..), execParserPure, defaultPrefs, getParseResult)
import Test.Hspec
import Network.CloudSeeder.CommandLine
spec :: Spec
spec = do
let runParser :: ParserInfo a -> [String] -> ParserResult a
runParser = execParserPure defaultPrefs
describe "Command line" $ do
let command = ["provision", "stack", "env"]
describe "argument parsing" $ do
it "parses a command with no options after" $ do
let expected = ProvisionStack "stack" "env"
parsed = getParseResult $ runParser parseArguments command
parsed `shouldBe` Just expected
it "parses a command and ignores any provided options" $ do
let expected = ProvisionStack "stack" "env"
input = command ++ ["--foo", "val"]
parsed = getParseResult $ runParser parseArguments input
parsed `shouldBe` Just expected
it "produces help for --help if not all the arguments are supplied" $ do
let input = ["provision", "stack", "--help"]
parsed = getParseResult $ runParser parseArguments input
parsed `shouldBe` Nothing
it "defers help for --help if all the arguments are supplied" $ do
let expected = ProvisionStack "stack" "env"
input = command ++ ["--help"]
parsed = getParseResult $ runParser parseArguments input
parsed `shouldBe` Just expected
describe "optional parsing" $ do
it "parses an optional parameter" $ do
let flags = [Optional "foo" "defVal"]
input = command ++ ["--foo", "val"]
expected = [("foo", "val")]
parsed = getParseResult $ runParser (parseOptions flags) input
parsed `shouldBe` Just expected
it "returns a default value if an optional parameter is not present" $ do
let flags = [Optional "bar" "defVal"]
input = command
expected = [("bar", "defVal")]
parsed = getParseResult $ runParser (parseOptions flags) input
parsed `shouldBe` Just expected
it "parses a required parameter" $ do
let flags = [Required "flag"]
input = command ++ ["--flag", "val"]
expected = [("flag", "val")]
parsed = getParseResult $ runParser (parseOptions flags) input
parsed `shouldBe` Just expected
it "fails if a required parameter is not present" $ do
let flags = [Required "flag"]
input = command ++ ["--notFlag", "boop"]
parsed = getParseResult $ runParser (parseOptions flags) input
parsed `shouldBe` Nothing