packages feed

mismi-s3-0.0.2: test/Test/IO/Mismi/S3/Internal.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.IO.Mismi.S3.Internal where

import           Control.Monad.Catch (catchIOError)
import           Control.Monad.IO.Class (liftIO)

import           Data.Text.IO as T

import           Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import           Mismi.S3.Internal

import           P

import           System.Directory (doesFileExist)
import           System.IO.Temp (withSystemTempDirectory)

prop_withFileSafe :: Property
prop_withFileSafe =
  property $ do
    t <- forAll $ Gen.text (Range.constant 5 15) Gen.alphaNum
    (f2e, t2) <- liftIO . withSystemTempPath $ \f -> do
      f2 <- withFileSafe f $ \f2 -> do
        T.writeFile f2 t
        pure f2
      t2 <- T.readFile f
      f2e <- doesFileExist f2
      pure (f2e, t2)
    (t, f2e) === (t2, False)


prop_withFileSafe_empty :: Property
prop_withFileSafe_empty =
  property $ do
  f2 <- liftIO . withSystemTempPath $ \f ->
    flip catchIOError (\_ -> pure Nothing) $ withFileSafe f (pure . Just)
  f2 === Nothing

prop_withFileSafe_error :: Property
prop_withFileSafe_error =
  property $ do
    result <- liftIO . withSystemTempPath $ \f -> do
      flip catchIOError (\_ -> pure ()) . withFileSafe f $ \_ -> fail ""
      fmap not $ doesFileExist f
    assert result

prop_withFileSafe_error_exists :: Property
prop_withFileSafe_error_exists =
  property $ do
    t <- forAll $ Gen.text (Range.constant 5 15) Gen.alphaNum
    result <- liftIO . withSystemTempPath $ \f -> do
      flip catchIOError (\_ -> pure ()) . withFileSafe f $ \f2 -> T.writeFile f2 t >> fail ""
      fmap not $ doesFileExist f
    assert result

withSystemTempPath :: (FilePath -> IO t) -> IO t
withSystemTempPath run =
  withSystemTempDirectory "mismi-s3-file-safe" $ \dir ->
    run $ dir <> "/file"


tests :: IO Bool
tests =
  checkSequential $$(discover)
-- TODO
--tests = $forAllProperties $ quickCheckWithResult (stdArgs { maxSuccess = 20 })