staversion-0.1.1.0: test/Staversion/Internal/ExecSpec.hs
module Staversion.Internal.ExecSpec (main,spec) where
import Data.Version (Version(Version))
import Data.IORef (readIORef)
import Data.List (isInfixOf)
import System.FilePath ((</>))
import Test.Hspec
import Staversion.Internal.Command (Command(..))
import Staversion.Internal.Exec (processCommand)
import Staversion.Internal.Query
( PackageName,
Query(..),
PackageSource(..),
Result(..),
ResultVersions,
resultVersionsFromList,
ErrorMsg
)
import Staversion.Internal.Log (defaultLogger, _mockLogger, Logger(loggerThreshold), LogLevel(..))
import Staversion.Internal.TestUtil (ver, rvers)
main :: IO ()
main = hspec spec
spec :: Spec
spec = describe "processCommand" $ do
specify "QueryName, SourceStackage, hit" $ do
singleCase (SourceStackage "conpact_build_plan") (QueryName "drawille")
(Right $ rvers [("drawille", Just $ ver [0,1,0,6])])
specify "QueryName, SourceStackage, miss" $ do
singleCase (SourceStackage "conpact_build_plan") (QueryName "unknown")
(Right $ rvers [("unknown", Nothing)])
specify "QueryName, SourceStackage, source not found" $ do
(logger, logs) <- _mockLogger
let src = SourceStackage "unknown"
query = QueryName "drawille"
comm = baseCommand { commSources = [src],
commQueries = [query],
commLogger = logger { loggerThreshold = Just LogInfo }
}
[got_ret] <- processCommand comm
resultIn got_ret `shouldBe` src
resultFor got_ret `shouldBe` query
case resultVersions got_ret of
Right _ -> expectationFailure "it should fail"
Left _ -> return ()
got_logs <- readIORef logs
let match :: (LogLevel, String) -> Bool
match (level, msg) = (level >= LogWarn)
&& ("unknown.yaml" `isInfixOf` msg)
&& ("not found" `isInfixOf` msg)
(length $ filter match got_logs) `shouldBe` 1
specify "QueryName, SourceStackage, full-mesh" $ do
let src2 = SourceStackage "lts-2.22_conpact"
src7 = SourceStackage "lts-7.0_conpact"
qc = QueryName "conduit"
qa = QueryName "aeson"
comm = baseCommand { commSources = [src2, src7], commQueries = [qc, qa] }
expected = [ Result { resultIn = src2, resultFor = qc,
resultVersions = Right $ rvers [("conduit", Just $ ver [1,2,5])]
},
Result { resultIn = src2, resultFor = qa,
resultVersions = Right $ rvers [("aeson", Just $ ver [0,8,0,2])]
},
Result { resultIn = src7, resultFor = qc,
resultVersions = Right $ rvers [("conduit", Just $ ver [1,2,7])]
},
Result { resultIn = src7, resultFor = qa,
resultVersions = Right $ rvers [("aeson", Just $ ver [0,11,2,1])]
}
]
got <- processCommand comm
got `shouldBe` expected
singleCase :: PackageSource -> Query -> Either ErrorMsg ResultVersions -> IO ()
singleCase src query exp_ret_vers = singleCase' src query (`shouldBe` exp_ret_vers)
singleCase' :: PackageSource -> Query -> (Either ErrorMsg ResultVersions -> IO a) -> IO a
singleCase' src query checker = do
[got_ret] <- processCommand comm
resultIn got_ret `shouldBe` src
resultFor got_ret `shouldBe` query
checker $ resultVersions got_ret
where
comm = baseCommand { commSources = [src],
commQueries = [query]
}
baseCommand :: Command
baseCommand = Command { commBuildPlanDir = "test" </> "data",
commLogger = defaultLogger { loggerThreshold = Nothing },
commSources = [],
commQueries = [],
commAllowNetwork = False
}