packages feed

shelly-1.12.1: test/src/FindSpec.hs

module FindSpec ( findSpec ) where

import TestInit
import Data.List (sort)
import Data.Text (replace, pack, unpack)
import System.Directory (createDirectoryIfMissing)
import System.PosixCompat.Files (createSymbolicLink, fileExist)
import qualified System.FilePath as SF

createSymlinkForTest :: IO ()
createSymlinkForTest = do
  createDirectoryIfMissing True symDir
  fexist <- fileExist (symDir SF.</> "symlinked_dir")
  if fexist
    then return ()
    else createSymbolicLink
           (".." SF.</> "symlinked_dir")
           (symDir SF.</> "symlinked_dir")
  where
    rootDir = "test" SF.</> "data"
    symDir = rootDir SF.</> "dir"

toWindowsStyleIfNecessary :: String -> String
toWindowsStyleIfNecessary s
  | isWindows = unpack . replace "/" "\\" . pack $ s
  | otherwise = s

findSpec :: Spec
findSpec = do
  describe "relativeTo" $ do
    it "relative to non-existent dir" $ do
      res <- shelly $ relativeTo "rel/" "rel/foo"
      res @?= "foo"
      res2 <- shelly $ relativeTo "rel" "rel/foo"
      res2 @?= "foo"

    it "relative to existing dir" $ do
      res <- shelly $ relativeTo "test/" "test/drain.hs"
      res @?= "drain.hs"
      res2 <- shelly $ relativeTo "test" "test/drain.hs"
      res2 @?= "drain.hs"

    it "abs path relative to existing dir" $ do
      res  <- shelly $ do
        d <- pwd
        relativeTo "test/" $ d </> "test/drain.hs"
      res @?= "drain.hs"

  describe "relative listing" $ do
    it "lists relative files" $ do
      res <- shelly $ cd "test/src" >> ls "."
      sort res @?= map toWindowsStyleIfNecessary ["./CopySpec.hs", "./EnvSpec.hs", "./FailureSpec.hs",
                    "./FindSpec.hs", "./Help.hs", "./LiftedSpec.hs", "./LogWithSpec.hs", "./MoveSpec.hs",
                    "./PipeSpec.hs", "./PrintCommandsFnSpec.hs", "./ReadFileSpec.hs", "./RmSpec.hs", "./RunSpec.hs", "./ShowCommandSpec.hs", "./SshSpec.hs",
                    "./TestInit.hs", "./TestMain.hs",
                    "./WhichSpec.hs", "./WriteSpec.hs", "./sleep.hs"]

    it "lists relative files in folder" $ do
      res <- shelly $ cd "test" >> ls "src"
      sort res @?=  map toWindowsStyleIfNecessary ["src/CopySpec.hs", "src/EnvSpec.hs", "src/FailureSpec.hs",
                    "src/FindSpec.hs", "src/Help.hs", "src/LiftedSpec.hs", "src/LogWithSpec.hs", "src/MoveSpec.hs",
                    "src/PipeSpec.hs", "src/PrintCommandsFnSpec.hs", "src/ReadFileSpec.hs", "src/RmSpec.hs", "src/RunSpec.hs", "src/ShowCommandSpec.hs", "src/SshSpec.hs",
                    "src/TestInit.hs", "src/TestMain.hs",
                    "src/WhichSpec.hs", "src/WriteSpec.hs", "src/sleep.hs"]

    it "finds relative files" $ do
      res <- shelly $ cd "test/src" >> find "."
      sort res @?= map toWindowsStyleIfNecessary ["./CopySpec.hs", "./EnvSpec.hs", "./FailureSpec.hs",
                    "./FindSpec.hs", "./Help.hs", "./LiftedSpec.hs", "./LogWithSpec.hs", "./MoveSpec.hs",
                    "./PipeSpec.hs", "./PrintCommandsFnSpec.hs", "./ReadFileSpec.hs", "./RmSpec.hs", "./RunSpec.hs", "./ShowCommandSpec.hs", "./SshSpec.hs",
                    "./TestInit.hs", "./TestMain.hs",
                    "./WhichSpec.hs", "./WriteSpec.hs", "./sleep.hs"]

  describe "find" $ do
    it "empty list for empty dir" $ do
      let d = "deleteme"
      res <- shelly $ do
        mkdir_p d
        res <- find d
        rm_rf d
        return res
      res @?= []

    it "lists relative files" $ do
      res <- shelly $ verbosely $ find "test/src"
      if isWindows
        then sort res @?= ["test/src\\CopySpec.hs", "test/src\\EnvSpec.hs", "test/src\\FailureSpec.hs",
                    "test/src\\FindSpec.hs", "test/src\\Help.hs", "test/src\\LiftedSpec.hs",
                    "test/src\\LogWithSpec.hs", "test/src\\MoveSpec.hs", "test/src\\PipeSpec.hs", "test/src\\PrintCommandsFnSpec.hs", "test/src\\ReadFileSpec.hs",
                    "test/src\\RmSpec.hs", "test/src\\RunSpec.hs", "test/src\\ShowCommandSpec.hs", "test/src\\SshSpec.hs",
                    "test/src\\TestInit.hs", "test/src\\TestMain.hs", "test/src\\WhichSpec.hs", "test/src\\WriteSpec.hs",
                    "test/src\\sleep.hs"]
        else sort res @?= ["test/src/CopySpec.hs", "test/src/EnvSpec.hs", "test/src/FailureSpec.hs",
                    "test/src/FindSpec.hs", "test/src/Help.hs", "test/src/LiftedSpec.hs",
                    "test/src/LogWithSpec.hs", "test/src/MoveSpec.hs", "test/src/PipeSpec.hs", "test/src/PrintCommandsFnSpec.hs", "test/src/ReadFileSpec.hs",
                    "test/src/RmSpec.hs", "test/src/RunSpec.hs", "test/src/ShowCommandSpec.hs", "test/src/SshSpec.hs",
                    "test/src/TestInit.hs", "test/src/TestMain.hs", "test/src/WhichSpec.hs", "test/src/WriteSpec.hs",
                    "test/src/sleep.hs"]

    it "lists absolute files" $ do
      res <- shelly $ relPath "test/src" >>= find >>= mapM (relativeTo "test/src")
      sort res @?= ["CopySpec.hs", "EnvSpec.hs", "FailureSpec.hs", "FindSpec.hs",
                    "Help.hs", "LiftedSpec.hs", "LogWithSpec.hs", "MoveSpec.hs",
                    "PipeSpec.hs", "PrintCommandsFnSpec.hs", "ReadFileSpec.hs", "RmSpec.hs", "RunSpec.hs",
                    "ShowCommandSpec.hs", "SshSpec.hs", "TestInit.hs", "TestMain.hs",
                    "WhichSpec.hs", "WriteSpec.hs", "sleep.hs"]

    unless isWindows $ before createSymlinkForTest $ do
      it "follow symlinks" $
         do res <-
              shelly $
              followSymlink True $
              relPath "test/data" >>= find >>= mapM (relativeTo "test/data")
            sort res @?=
              [ "dir"
              , "dir/symlinked_dir"
              , "dir/symlinked_dir/hoge_file"
              , "hello.sh"
              , "nonascii.txt"
              , "symlinked_dir"
              , "symlinked_dir/hoge_file"
              , "zshrc"
              ]
      it "not follow symlinks" $
         do res <-
              shelly $
              followSymlink False $
              relPath "test/data" >>= find >>= mapM (relativeTo "test/data")
            sort res @?=
              [ "dir"
              , "dir/symlinked_dir"
              , "hello.sh"
              , "nonascii.txt"
              , "symlinked_dir"
              , "symlinked_dir/hoge_file"
              , "zshrc"
              ]