From 9a11e35be051b10f21209a6eabdce019719faf59 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Mon, 2 May 2016 22:52:10 +0200 Subject: [PATCH] TESTS: add getDirsFilesSpec --- src/HSFM/FileSystem/FileOperations.hs | 12 +++++- test/Spec.hs | 60 ++++++++++++++++++++++++++- test/getDirsFilesSpec/.hidden | 0 test/getDirsFilesSpec/Lala | 0 test/getDirsFilesSpec/dirsym | 1 + test/getDirsFilesSpec/file | 0 test/getDirsFilesSpec/noPerms/.keep | 0 test/getDirsFilesSpec/syml | 1 + 8 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 test/getDirsFilesSpec/.hidden create mode 100644 test/getDirsFilesSpec/Lala create mode 120000 test/getDirsFilesSpec/dirsym create mode 100644 test/getDirsFilesSpec/file create mode 100644 test/getDirsFilesSpec/noPerms/.keep create mode 120000 test/getDirsFilesSpec/syml diff --git a/src/HSFM/FileSystem/FileOperations.hs b/src/HSFM/FileSystem/FileOperations.hs index 6bd7ff4..f2b8e4d 100644 --- a/src/HSFM/FileSystem/FileOperations.hs +++ b/src/HSFM/FileSystem/FileOperations.hs @@ -519,7 +519,7 @@ createDir dest = createDirectory (P.fromAbs dest) newDirPerms -- -- - `NoSuchThing` if source file does not exist -- - `PermissionDenied` if output directory cannot be written to --- - `PermissionDenied` if source driectory cannot be opened +-- - `PermissionDenied` if source directory cannot be opened -- - `UnsupportedOperation` if source and destination are on different devices -- - `FileDoesExist` if destination file already exists -- - `DirDoesExist` if destination directory already exists @@ -547,7 +547,7 @@ renameFile fromf tof = do -- -- - `NoSuchThing` if source file does not exist -- - `PermissionDenied` if output directory cannot be written to --- - `PermissionDenied` if source driectory cannot be opened +-- - `PermissionDenied` if source directory cannot be opened -- - `FileDoesExist` if destination file already exists -- - `DirDoesExist` if destination directory already exists -- - `SameFile` if destination and source are the same file @@ -599,6 +599,14 @@ newDirPerms -- |Gets all filenames of the given directory. This excludes "." and "..". -- This version does not follow symbolic links. +-- +-- Throws: +-- +-- - `NoSuchThing` if directory does not exist +-- - `InappropriateType` if file type is wrong (file) +-- - `InappropriateType` if file type is wrong (symlink to file) +-- - `InappropriateType` if file type is wrong (symlink to dir) +-- - `PermissionDenied` if directory cannot be opened getDirsFiles :: Path Abs -- ^ dir to read -> IO [Path Abs] getDirsFiles p = diff --git a/test/Spec.hs b/test/Spec.hs index eb746c0..a6d0af7 100644 --- a/test/Spec.hs +++ b/test/Spec.hs @@ -39,6 +39,10 @@ import System.Posix.Files.ByteString , setFileMode , unionFileModes ) +import Data.List + ( + sort + ) @@ -55,13 +59,16 @@ main = hspec $ before_ fixPermissions $ after_ revertPermissions $ do , renameFileSpec , moveFileSpec , recreateSymlinkSpec - , getFileTypeSpec ] -- run all stateful tests twice to catch missing cleanups or state skew sequence_ tests sequence_ tests + -- stateless tests + getFileTypeSpec + getDirsFilesSpec + -- TODO: deleteFile, deleteDir, deleteDirRecursive, getDirsFiles, getFileType where noWriteDirs = ["test/copyFileSpec/outputDirNoWrite" @@ -80,6 +87,7 @@ main = hspec $ before_ fixPermissions $ after_ revertPermissions $ do ,"test/moveFile/noPerms" ,"test/recreateSymlinkSpec/noPerms" ,"test/getFileTypeSpec/noPerms" + ,"test/getDirsFilesSpec/noPerms" ] fixPermissions = do sequence_ $ fmap noWritableDirPerms noWriteDirs @@ -533,6 +541,48 @@ getFileTypeSpec = (\e -> ioeGetErrorType e == PermissionDenied) +getDirsFilesSpec :: Spec +getDirsFilesSpec = + describe "HSFM.FileSystem.FileOperations.getDirsFiles" $ do + + -- successes -- + it "getDirsFiles, all fine" $ do + pwd <- fromJust <$> getEnv "PWD" >>= P.parseAbs + expectedFiles <- mapM P.parseRel ["test/getDirsFilesSpec/.hidden" + ,"test/getDirsFilesSpec/Lala" + ,"test/getDirsFilesSpec/dir" + ,"test/getDirsFilesSpec/dirsym" + ,"test/getDirsFilesSpec/file" + ,"test/getDirsFilesSpec/noPerms" + ,"test/getDirsFilesSpec/syml"] + (fmap sort $ getDirsFiles' "test/getDirsFilesSpec") + `shouldReturn` fmap (pwd P.) expectedFiles + + -- posix failures -- + it "getDirsFiles, nonexistent directory" $ + getDirsFiles' "test/getDirsFilesSpec/nothingHere" + `shouldThrow` + (\e -> ioeGetErrorType e == NoSuchThing) + + it "getDirsFiles, wrong file type (file)" $ + getDirsFiles' "test/getDirsFilesSpec/file" + `shouldThrow` + (\e -> ioeGetErrorType e == InappropriateType) + + it "getDirsFiles, wrong file type (symlink to file)" $ + getDirsFiles' "test/getDirsFilesSpec/syml" + `shouldThrow` + (\e -> ioeGetErrorType e == InvalidArgument) + + it "getDirsFiles, wrong file type (symlink to dir)" $ + getDirsFiles' "test/getDirsFilesSpec/dirsym" + `shouldThrow` + (\e -> ioeGetErrorType e == InvalidArgument) + + it "getDirsFiles, can't open directory" $ + getDirsFiles' "test/getDirsFilesSpec/noPerms" + `shouldThrow` + (\e -> ioeGetErrorType e == PermissionDenied) @@ -649,3 +699,11 @@ getFileType' path = do pwd <- fromJust <$> getEnv "PWD" >>= P.parseAbs file <- (pwd P.) <$> P.parseRel path getFileType file + + +getDirsFiles' :: ByteString -> IO [P.Path P.Abs] +getDirsFiles' path = do + pwd <- fromJust <$> getEnv "PWD" >>= P.parseAbs + file <- (pwd P.) <$> P.parseRel path + getDirsFiles file + diff --git a/test/getDirsFilesSpec/.hidden b/test/getDirsFilesSpec/.hidden new file mode 100644 index 0000000..e69de29 diff --git a/test/getDirsFilesSpec/Lala b/test/getDirsFilesSpec/Lala new file mode 100644 index 0000000..e69de29 diff --git a/test/getDirsFilesSpec/dirsym b/test/getDirsFilesSpec/dirsym new file mode 120000 index 0000000..8724519 --- /dev/null +++ b/test/getDirsFilesSpec/dirsym @@ -0,0 +1 @@ +dir \ No newline at end of file diff --git a/test/getDirsFilesSpec/file b/test/getDirsFilesSpec/file new file mode 100644 index 0000000..e69de29 diff --git a/test/getDirsFilesSpec/noPerms/.keep b/test/getDirsFilesSpec/noPerms/.keep new file mode 100644 index 0000000..e69de29 diff --git a/test/getDirsFilesSpec/syml b/test/getDirsFilesSpec/syml new file mode 120000 index 0000000..bbfbf8c --- /dev/null +++ b/test/getDirsFilesSpec/syml @@ -0,0 +1 @@ +Lala \ No newline at end of file