{-# LANGUAGE OverloadedStrings #-} module HPath.IO.CreateDirRecursiveSpec where import Test.Hspec import System.IO.Error ( ioeGetErrorType ) import GHC.IO.Exception ( IOErrorType(..) ) import Utils upTmpDir :: IO () upTmpDir = do setTmpDir "CreateDirRecursiveSpec" createTmpDir setupFiles :: IO () setupFiles = do createDir' "alreadyExists" createRegularFile' "alreadyExistsF" createDir' "noPerms" createDir' "noWritePerms" noPerms "noPerms" noWritableDirPerms "noWritePerms" cleanupFiles :: IO () cleanupFiles = do normalDirPerms "noPerms" normalDirPerms "noWritePerms" deleteDir' "alreadyExists" deleteDir' "noPerms" deleteDir' "noWritePerms" deleteFile' "alreadyExistsF" spec :: Spec spec = beforeAll_ (upTmpDir >> setupFiles) $ afterAll_ cleanupFiles $ describe "HPath.IO.createDirRecursive" $ do -- successes -- it "createDirRecursive, all fine" $ do createDirRecursive' "newDir" deleteDir' "newDir" it "createDirRecursive, parent directories do not exist" $ do createDirRecursive' "some/thing/dada" deleteDir' "some/thing/dada" deleteDir' "some/thing" deleteDir' "some" it "createDirRecursive, destination directory already exists" $ createDirRecursive' "alreadyExists" -- posix failures -- it "createDirRecursive, destination already exists and is a file" $ createDirRecursive' "alreadyExistsF" `shouldThrow` (\e -> ioeGetErrorType e == AlreadyExists) it "createDirRecursive, can't write to output directory" $ createDirRecursive' "noWritePerms/newDir" `shouldThrow` (\e -> ioeGetErrorType e == PermissionDenied) it "createDirRecursive, can't open output directory" $ createDirRecursive' "noPerms/newDir" `shouldThrow` (\e -> ioeGetErrorType e == PermissionDenied)