nvfetcher-0.8.0.0: test/ExtractSpec.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module ExtractSpec where
import Control.Monad.Trans.Reader
import qualified Data.HashMap.Strict as HMap
import qualified Data.List.NonEmpty as NE
import Data.Maybe (fromJust)
import Development.Shake (liftIO)
import Development.Shake.FilePath ((</>))
import FetchRustGitDepsSpec (runPrefetchRule)
import NvFetcher (getBuildDir)
import NvFetcher.ExtractSrc
import NvFetcher.NixFetcher
import NvFetcher.Types
import qualified System.Directory.Extra as IO
import Test.Hspec
import Utils
spec :: Spec
spec = aroundShake $ do
describe "extract" $ do
let fetcher = gitHubFetcher ("berberman", "nvfetcher") $ Version "0.7.0"
srcSha256 = "sha256-GVjVivAz2AW7WNqpWTA5Uy9vN8Wh_3pjuZRFhsGVk24="
mkExpectedMap files = HMap.fromList [(f, srcSha256 </> f) | f <- files]
mkExpectedPaths buildDir files = [buildDir </> srcSha256 </> f | f <- files]
allExist = mapM_ shouldExist
specifyChan "extracts single file" $ do
prefetched <- runPrefetchRule fetcher
shouldBeJust prefetched
let expectedFiles = ["Setup.hs"]
runExtractSrcsRule (fromJust prefetched) (NE.singleton "Setup.hs")
`shouldReturnJust` mkExpectedMap expectedFiles
(fromJust -> buildDir) <- runActionChan getBuildDir
allExist $ mkExpectedPaths buildDir expectedFiles
specifyChan "extracts files" $ do
prefetched <- runPrefetchRule fetcher
shouldBeJust prefetched
let expectedFiles =
[ "default.nix",
"CHANGELOG.md",
"README.md",
"flake.nix",
"nix/default.nix"
]
runExtractSrcsRule (fromJust prefetched) (NE.fromList ["**/*.nix", "*.md"])
`shouldReturnJust` mkExpectedMap expectedFiles
(fromJust -> buildDir) <- runActionChan getBuildDir
allExist $ mkExpectedPaths buildDir expectedFiles
specifyChan "extracts rerun" $ do
prefetched <- runPrefetchRule fetcher
shouldBeJust prefetched
let expectedFiles = ["Setup.hs"]
runExtractSrcsRule (fromJust prefetched) (NE.singleton "Setup.hs")
`shouldReturnJust` mkExpectedMap expectedFiles
(fromJust -> buildDir) <- runActionChan getBuildDir
let path = case mkExpectedPaths buildDir expectedFiles of
[] -> error "Impossible"
(p : _) -> p
allExist [path]
-- Delete this generated file and rerun the rule
-- We should see the file being regenerated
liftIO $ IO.removeFile path
-- Run again
runExtractSrcsRule (fromJust prefetched) (NE.singleton "Setup.hs")
`shouldReturnJust` mkExpectedMap expectedFiles
-- Check that the file has been regenerated
allExist [path]
runExtractSrcsRule :: NixFetcher Fetched -> NE.NonEmpty Glob -> ReaderT ActionQueue IO (Maybe (HMap.HashMap FilePath FilePath))
runExtractSrcsRule fetcher globs = runActionChan $ extractSrcs fetcher globs