packages feed

hpath-0.8.0: test/HPath/IO/DeleteDirRecursiveSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module HPath.IO.DeleteDirRecursiveSpec where


import Test.Hspec
import System.IO.Error
  (
    ioeGetErrorType
  )
import System.Posix.Files.ByteString
  (
    getSymbolicLinkStatus
  )
import GHC.IO.Exception
  (
    IOErrorType(..)
  )
import Utils



upTmpDir :: IO ()
upTmpDir = do
  setTmpDir "DeleteDirRecursiveSpec"
  createTmpDir


setupFiles :: IO ()
setupFiles = do
  createRegularFile' "file"
  createDir' "dir"
  createRegularFile' "dir/.keep"
  createSymlink' "dirSym" "dir/"
  createDir' "noPerms"
  createRegularFile' "noPerms/.keep"
  createDir' "noWritable"
  createRegularFile' "noWritable/.keep"


cleanupFiles :: IO ()
cleanupFiles = do
  deleteFile' "file"
  deleteFile' "dir/.keep"
  deleteDir' "dir"
  deleteFile' "dirSym"
  deleteFile' "noPerms/.keep"
  deleteDir' "noPerms"
  deleteFile' "noWritable/.keep"
  deleteDir' "noWritable"


spec :: Spec
spec = beforeAll_ (upTmpDir >> setupFiles) $ afterAll_ cleanupFiles $
  describe "HPath.IO.deleteDirRecursive" $ do

    -- successes --
    it "deleteDirRecursive, empty directory, all fine" $ do
      createDir' "testDir"
      deleteDirRecursive' "testDir"
      getSymbolicLinkStatus "testDir"
        `shouldThrow`
        (\e -> ioeGetErrorType e == NoSuchThing)

    it "deleteDirRecursive, empty directory with null permissions, all fine" $ do
      createDir' "noPerms/testDir"
      noPerms "noPerms/testDir"
      deleteDirRecursive' "noPerms/testDir"

    it "deleteDirRecursive, non-empty directory, all fine" $ do
      createDir' "nonEmpty"
      createDir' "nonEmpty/dir1"
      createDir' "nonEmpty/dir2"
      createDir' "nonEmpty/dir2/dir3"
      createRegularFile' "nonEmpty/file1"
      createRegularFile' "nonEmpty/dir1/file2"
      deleteDirRecursive' "nonEmpty"
      getSymbolicLinkStatus "nonEmpty"
        `shouldThrow`
        (\e -> ioeGetErrorType e == NoSuchThing)

    -- posix failures --
    it "deleteDirRecursive, can't open parent directory" $ do
      createDir' "noPerms/foo"
      noPerms "noPerms"
      (deleteDirRecursive' "noPerms/foo")
        `shouldThrow`
        (\e -> ioeGetErrorType e == PermissionDenied)
      normalDirPerms "noPerms"
      deleteDir' "noPerms/foo"

    it "deleteDirRecursive, can't write to parent directory" $ do
      createDir' "noWritable/foo"
      noWritableDirPerms "noWritable"
      (deleteDirRecursive' "noWritable/foo")
        `shouldThrow`
        (\e -> ioeGetErrorType e == PermissionDenied)
      normalDirPerms "noWritable"
      deleteDir' "noWritable/foo"

    it "deleteDirRecursive, wrong file type (symlink to directory)" $
      deleteDirRecursive' "dirSym"
        `shouldThrow`
        (\e -> ioeGetErrorType e == InappropriateType)

    it "deleteDirRecursive, wrong file type (regular file)" $
      deleteDirRecursive' "file"
        `shouldThrow`
        (\e -> ioeGetErrorType e == InappropriateType)

    it "deleteDirRecursive, directory does not exist" $
      deleteDirRecursive' "doesNotExist"
        `shouldThrow`
        (\e -> ioeGetErrorType e == NoSuchThing)