packages feed

tricorder-1.0.0.0: test/Unit/Tricorder/Session/TestTargetSpec.hs

module Unit.Tricorder.Session.TestTargetSpec (test_TestTarget) where

import Data.Default (def)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))

import Tricorder.Session.Config (Config (..))

import Tricorder.Session.CommandConfig qualified as CommandConfig
import Tricorder.Session.Config qualified as Config
import Tricorder.Session.Stage.Test.Config qualified as Test.Config
import Tricorder.Session.Target qualified as Target
import Tricorder.Session.TestTarget qualified as TestTarget


test_TestTarget :: TestTree
test_TestTarget =
    testGroup
        "TestTarget"
        [ testGroup "resolveTestTargets" testResolveTestTargets
        ]


testResolveTestTargets :: [TestTree]
testResolveTestTargets =
    [ testCase "infers test: components from targets when testTargets is absent" do
        let cfg = def :: Config
        TestTarget.resolve cfg (mkTargets ["lib:mylib", "test:mylib-test"])
            @?= mapMaybe TestTarget.parse ["test:mylib-test"]
    , testCase "returns empty list when no test: components in targets" do
        let cfg = def :: Config
        TestTarget.resolve cfg (mkTargets ["lib:mylib", "exe:myapp"])
            @?= mapMaybe TestTarget.parse []
    , testCase "uses explicit test.commandConfig.targets list when set" do
        let cfg =
                def
                    { Config.test =
                        def
                            { Test.Config.commandConfig =
                                def
                                    { CommandConfig.targets = Just ["test:b-test"]
                                    }
                            }
                    }
        TestTarget.resolve cfg (mkTargets ["lib:a", "test:a-test", "test:b-test"])
            @?= mapMaybe TestTarget.parse ["test:b-test"]
    , testCase "returns empty list when testTargets is explicitly empty" do
        let cfg =
                def
                    { Config.test =
                        def
                            { Test.Config.commandConfig =
                                def
                                    { CommandConfig.targets = Just []
                                    }
                            }
                    }
        TestTarget.resolve cfg (mkTargets ["lib:a", "test:a-test"])
            @?= []
    , testCase "infers multiple test: components" do
        let cfg = def :: Config
        TestTarget.resolve cfg (mkTargets ["lib:a", "test:a-test", "test:b-test"])
            @?= mapMaybe TestTarget.parse ["test:a-test", "test:b-test"]
    ]
  where
    mkTargets = fmap Target.parse