packages feed

qnap-decrypt-0.3.0: test/Spec.hs

{-# LANGUAGE ScopedTypeVariables #-}

import           Control.Exception    (IOException, catch)
import           Control.Monad        (forM_)
import qualified Data.ByteString.Lazy as BL
import           Data.Maybe           (isNothing)
import           System.Directory     (listDirectory, removeFile)
import           System.FilePath      ((</>))
import           System.IO            (hClose)
import           System.IO.Temp       (withSystemTempFile)
import           Test.Hspec           (describe, hspec, it, shouldSatisfy)
import           Test.HUnit.Base      ((@?))

import           Crypto.QNAP

encryptedDirectory :: FilePath
encryptedDirectory = "test/encrypted"

referenceDirectory :: FilePath
referenceDirectory = "test/reference"

password :: String
password = "qORFZQiilzCz5JIxiOOuVE2TsJ6Xn5Rk"

main :: IO ()
main =
  withSystemTempFile "decrypt" $ \tempFile tempFileHandle -> do
    hClose tempFileHandle
    files <- listDirectory encryptedDirectory
    hspec $ describe "Crypto.QNAP.dectypt" $
      forM_ files $ \file -> it ("Verify file " ++ file) $ do
        removeFile tempFile `catch` (\(_ :: IOException) -> return ())
        decrypt password (encryptedDirectory </> file) tempFile >>= (`shouldSatisfy` isNothing)
        decrypted <- BL.readFile tempFile
        reference <- BL.readFile (referenceDirectory </> file)
        decrypted == reference @? "Decrypted file does not match reference"