packages feed

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