hspec-discover-2.10.3: test/Test/Hspec/Discover/RunSpec.hs
module Test.Hspec.Discover.RunSpec (spec) where
import Helper
import Test.Mockery.Directory
import Test.Hspec.Discover.Run hiding (Spec)
import qualified Test.Hspec.Discover.Run as Run
spec :: Spec
spec = do
describe "run" $ around_ inTempDirectory $ do
it "generates a test driver" $ do
touch "test/FooSpec.hs"
touch "test/Foo/Bar/BazSpec.hs"
touch "test/Foo/BarSpec.hs"
run ["test/Spec.hs", "", "out"]
readFile "out" `shouldReturn` unlines [
"{-# LINE 1 \"test/Spec.hs\" #-}"
, "{-# LANGUAGE NoImplicitPrelude #-}"
, "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"
, "module Main where"
, "import qualified FooSpec"
, "import qualified Foo.BarSpec"
, "import qualified Foo.Bar.BazSpec"
, "import Test.Hspec.Discover"
, "main :: IO ()"
, "main = hspec spec"
, "spec :: Spec"
, "spec = " ++ unwords [
"describe \"Foo\" FooSpec.spec"
, ">> describe \"Foo.Bar\" Foo.BarSpec.spec"
, ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec"
]
]
it "generates a test driver with no Main/main" $ do
touch "test/FooSpec.hs"
touch "test/Foo/Bar/BazSpec.hs"
touch "test/Foo/BarSpec.hs"
run ["test/Spec.hs", "", "out", "--no-main"]
readFile "out" `shouldReturn` unlines [
"{-# LINE 1 \"test/Spec.hs\" #-}"
, "{-# LANGUAGE NoImplicitPrelude #-}"
, "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"
, "module Spec where"
, "import qualified FooSpec"
, "import qualified Foo.BarSpec"
, "import qualified Foo.Bar.BazSpec"
, "import Test.Hspec.Discover"
, "spec :: Spec"
, "spec = " ++ unwords [
"describe \"Foo\" FooSpec.spec"
, ">> describe \"Foo.Bar\" Foo.BarSpec.spec"
, ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec"
]
]
it "generates a test driver with hooks" $ do
touch "test/FooSpec.hs"
touch "test/Foo/Bar/BazSpec.hs"
touch "test/Foo/BarSpec.hs"
touch "test/Foo/SpecHook.hs"
touch "test/SpecHook.hs"
run ["test/Spec.hs", "", "out"]
readFile "out" `shouldReturn` unlines [
"{-# LINE 1 \"test/Spec.hs\" #-}"
, "{-# LANGUAGE NoImplicitPrelude #-}"
, "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"
, "module Main where"
, "import qualified SpecHook"
, "import qualified FooSpec"
, "import qualified Foo.SpecHook"
, "import qualified Foo.BarSpec"
, "import qualified Foo.Bar.BazSpec"
, "import Test.Hspec.Discover"
, "main :: IO ()"
, "main = hspec spec"
, "spec :: Spec"
, "spec = " ++ unwords [
"(SpecHook.hook $ describe \"Foo\" FooSpec.spec"
, ">> (Foo.SpecHook.hook $ describe \"Foo.Bar\" Foo.BarSpec.spec"
, ">> describe \"Foo.Bar.Baz\" Foo.Bar.BazSpec.spec))"
]
]
it "generates a test driver for an empty directory" $ do
touch "test/Foo/Bar/Baz/.placeholder"
run ["test/Spec.hs", "", "out"]
readFile "out" `shouldReturn` unlines [
"{-# LINE 1 \"test/Spec.hs\" #-}"
, "{-# LANGUAGE NoImplicitPrelude #-}"
, "{-# OPTIONS_GHC -w -Wall -fno-warn-warnings-deprecations #-}"
, "module Main where"
, "import Test.Hspec.Discover"
, "main :: IO ()"
, "main = hspec spec"
, "spec :: Spec"
, "spec = return ()"
]
describe "pathToModule" $ do
it "derives module name from a given path" $ do
pathToModule "test/Spec.hs" `shouldBe` "Spec"
describe "driverWithFormatter" $ do
it "generates a test driver that uses a custom formatter" $ do
driverWithFormatter "Some.Module.formatter" "" `shouldBe` unlines [
"import qualified Some.Module"
, "main :: IO ()"
, "main = hspecWithFormatter Some.Module.formatter spec"
]
describe "moduleNameFromId" $ do
it "returns the module name of a fully qualified identifier" $ do
moduleNameFromId "Some.Module.someId" `shouldBe` "Some.Module"
describe "importList" $ do
it "generates imports for a list of specs" $ do
importList (Just [Run.Spec "Foo", Run.Spec "Bar"]) "" `shouldBe` unlines [
"import qualified FooSpec"
, "import qualified BarSpec"
]
describe "discover" $ do
it "discovers spec files" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/FooSpec.hs"
touch "test/BarSpec.hs"
discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Leaf "Bar", Leaf "Foo"])
it "discovers nested spec files" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/Foo/BarSpec.hs"
touch "test/Foo/BazSpec.hs"
discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Node "Foo" (Forest WithoutHook [Leaf "Bar", Leaf "Baz"])])
it "discovers hooks" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/FooSpec.hs"
touch "test/BarSpec.hs"
touch "test/SpecHook.hs"
discover "test/Spec.hs" `shouldReturn` Just (Forest WithHook [Leaf "Bar", Leaf "Foo"])
it "discovers nested hooks" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/Foo/BarSpec.hs"
touch "test/Foo/BazSpec.hs"
touch "test/Foo/SpecHook.hs"
discover "test/Spec.hs" `shouldReturn` Just (Forest WithoutHook [Node "Foo" (Forest WithHook [Leaf "Bar", Leaf "Baz"])])
it "ignores invalid module names" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/barSpec.hs"
discover "test/Spec.hs" `shouldReturn` Nothing
it "ignores empty directories" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/Foo/.keep"
discover "test/Spec.hs" `shouldReturn` Nothing
it "ignores directories with extension" $ do
inTempDirectory $ do
touch "test/Spec.hs"
touch "test/Foo.hs/BarSpec.hs"
discover "test/Spec.hs" `shouldReturn` Nothing