packages feed

axel-0.0.5: test/Axel/Test/Monad/FileSystemSpec.hs

module Axel.Test.Monad.FileSystemSpec where

import qualified Axel.Monad.FileSystem as FS
import qualified Axel.Test.Monad.FileSystemMock as Mock

import Control.Lens

import System.FilePath

import Test.Tasty.Hspec

{-# ANN module "HLint: ignore Redundant do" #-}

spec_FileSystem :: SpecWith ()
spec_FileSystem = do
  describe "getDirectoryContentsRec" $ do
    it "gets the files inside a directory and all its subdirectories" $ do
      let action = FS.getDirectoryContentsRec "dir1"
      let origState =
            Mock.mkFSState
              [ Mock.Directory
                  "dir1"
                  [ Mock.File "file1" ""
                  , Mock.Directory
                      "dir2"
                      [Mock.File "file2" "", Mock.Directory "dir3" []]
                  ]
              ]
      let expected = ["dir1/file1", "dir1/dir2/file2"]
      case Mock.runFileSystem origState action of
        Left err -> expectationFailure err
        Right result -> result `shouldBe` (expected, origState)
  describe "withCurrentDirectory" $ do
    it "changes the directory and resets it afterwards" $ do
      let action = do
            FS.withCurrentDirectory "inside/subdir" $
              FS.writeFile "insideDir" "insideDirContents"
            FS.writeFile "outsideDir" "outsideDirContents"
      let origState =
            Mock.mkFSState
              [ Mock.Directory
                  "inside"
                  [ Mock.Directory "subdir" [Mock.File "bar" "barContents"]
                  , Mock.File "foo" "fooContents"
                  ]
              ]
      let expected =
            origState &
            (Mock.fsRoot . at "inside/subdir/insideDir" ?~
             Mock.File "insideDir" "insideDirContents") &
            (Mock.fsRoot . at "outsideDir" ?~
             Mock.File "outsideDir" "outsideDirContents")
      case Mock.runFileSystem origState action of
        Left err -> expectationFailure err
        Right result -> result `shouldBe` ((), expected)
  describe "withTemporaryDirectory" $ do
    it
      "creates a temporary directory and resets the current directory afterwards" $ do
      let action = do
            FS.withTemporaryDirectory $ \tempDir ->
              FS.writeFile (tempDir </> "insideTemp0") "insideTemp0Contents"
            FS.withTemporaryDirectory $ \tempDir ->
              FS.writeFile (tempDir </> "insideTemp1") "insideTemp1Contents"
      let origState = Mock.mkFSState []
      let expected =
            origState & (Mock.fsRoot . at "tmp" ?~ Mock.Directory "tmp" []) &
            (Mock.fsRoot . at "tmp/0" ?~
             Mock.Directory "0" [Mock.File "insideTemp0" "insideTemp0Contents"]) &
            (Mock.fsRoot . at "tmp/1" ?~
             Mock.Directory "1" [Mock.File "insideTemp1" "insideTemp1Contents"]) &
            (Mock.fsTempCounter .~ 2)
      case Mock.runFileSystem origState action of
        Left err -> expectationFailure err
        Right result -> result `shouldBe` ((), expected)