packages feed

skeletest-0.3.4: test/Skeletest/Internal/SpecSpec.hs

module Skeletest.Internal.SpecSpec (spec) where

import Skeletest
import Skeletest.Predicate qualified as P
import Skeletest.TestUtils.Integration

spec :: Spec
spec = do
  describe "skip" $ do
    integration . it "skips tests completely" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = skip \"broken tests\" $ do"
        , "  it \"should not run\" $ undefined"
        , "  it \"should not run either\" $ undefined"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner []
      stderr `shouldBe` ""
      stdout `shouldSatisfy` P.matchesSnapshot

  describe "xfail" $ do
    integration . it "checks for expected failures" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = xfail \"broken tests\" $ do"
        , "  it \"should fail\" $ undefined"
        , "  it \"should fail too\" $ undefined"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner []
      stderr `shouldBe` ""
      stdout `shouldSatisfy` P.matchesSnapshot

    integration . it "errors on unexpected passes" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = xfail \"broken tests\" $ do"
        , "  it \"should fail\" $ pure ()"
        , "  it \"should fail too\" $ pure ()"
        ]

      (stdout, stderr) <- expectFailure $ runTests runner []
      stderr `shouldBe` ""
      stdout `shouldSatisfy` P.matchesSnapshot

  describe "focus" $ do
    -- TODO: test that using focus with -Werror fails
    integration . it "only runs focused test" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = do"
        , "  focus . it \"in progress\" $ pure ()"
        , "  it \"not working yet\" $ failTest \"broken\""
        ]

      (stdout, _) <- expectSuccess $ runTests runner []
      stdout `shouldSatisfy` P.matchesSnapshot

  describe "markManual" $ do
    integration . it "skips manual tests by default" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = do"
        , "  markManual . withMarkers [\"foo\"] $ do"
        , "    it \"foo1\" $ pure ()"
        , "    it \"foo2\" $ pure ()"
        , "  it \"bar1\" $ pure ()"
        , "  it \"bar2\" $ pure ()"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner []
      stderr `shouldBe` ""
      stdout
        `shouldSatisfy` P.and
          [ P.not $ P.hasInfix "foo1"
          , P.not $ P.hasInfix "foo2"
          , P.hasInfix "bar1"
          , P.hasInfix "bar2"
          ]

    integration . it "runs selected manual tests" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = do"
        , "  markManual . withMarkers [\"foo\"] $ do"
        , "    it \"foo1\" $ pure ()"
        , "    it \"foo2\" $ pure ()"
        , "  it \"bar1\" $ pure ()"
        , "  it \"bar2\" $ pure ()"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner ["*"]
      stderr `shouldBe` ""
      stdout
        `shouldSatisfy` P.and
          [ P.hasInfix "foo1"
          , P.hasInfix "foo2"
          , P.hasInfix "bar1"
          , P.hasInfix "bar2"
          ]

  describe "withMarkers" $ do
    integration . it "allows selecting from command line" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "spec = do"
        , "  withMarkers [\"foo\"] $ do"
        , "    it \"foo1\" $ pure ()"
        , "    it \"foo2\" $ pure ()"
        , "  it \"bar1\" $ pure ()"
        , "  it \"bar2\" $ pure ()"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner ["@foo"]
      stderr `shouldBe` ""
      stdout
        `shouldSatisfy` P.and
          [ P.hasInfix "foo1"
          , P.hasInfix "foo2"
          , P.not $ P.hasInfix "bar1"
          , P.not $ P.hasInfix "bar2"
          ]

  describe "withMarker" $ do
    integration . it "allows selecting from command line" $ do
      runner <- getFixture
      addTestFile runner "ExampleSpec.hs" $
        [ "module ExampleSpec (spec) where"
        , ""
        , "import Skeletest"
        , ""
        , "data MyMarker = MyMarker deriving (Show)"
        , "instance IsMarker MyMarker where getMarkerName _ = \"my-marker\""
        , ""
        , "spec = do"
        , "  withMarker MyMarker $ do"
        , "    it \"foo1\" $ pure ()"
        , "    it \"foo2\" $ pure ()"
        , "  it \"bar1\" $ pure ()"
        , "  it \"bar2\" $ pure ()"
        ]

      (stdout, stderr) <- expectSuccess $ runTests runner ["@my-marker"]
      stderr `shouldBe` ""
      stdout
        `shouldSatisfy` P.and
          [ P.hasInfix "foo1"
          , P.hasInfix "foo2"
          , P.not $ P.hasInfix "bar1"
          , P.not $ P.hasInfix "bar2"
          ]