packages feed

mismi-s3-0.0.2: test/Test/Reliability/Mismi/S3/Commands.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.Reliability.Mismi.S3.Commands where

import           Control.Monad (replicateM_)
import           Control.Monad.Catch (throwM)
import           Control.Monad.IO.Class (liftIO)
import           Control.Monad.Trans.Class (lift)
import           Control.Monad.Trans.Except (runExceptT)

import           Data.Either (isRight)
import qualified Data.Text.IO as T

import           Hedgehog
import           Hedgehog.Internal.Property (TestLimit (..))
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

import           Mismi.S3
import qualified Mismi.S3.Unsafe as Unsafe

import           P

import           System.FilePath ((</>))
import           System.IO.Error (userError)
import qualified System.IO.Unsafe as Unsafe

import           Test.Mismi.S3
import qualified Test.Reliability.Reliability as Reliability

testSize :: TestLimit
testSize =
  TestLimit $
    Unsafe.unsafePerformIO Reliability.getMaxSuccess

prop_sync :: Property
prop_sync =
  withTests testSize . property . liftAWS $ do
    m <- forAll $ Gen.text (Range.linear 10 20) Gen.alphaNum
    a <- newAddress
    b <- newAddress
    i <- Reliability.testSize
    createSmallFiles a m i
    r <- lift . runExceptT $ syncWithMode OverwriteSync a b 10
    lift . forM_ (files a m i) $ \e ->
      exists e >>= \e' ->
        when (e' == False) (throwM $ userError "Output files do not exist")
    assert $ isRight r

prop_list :: Property
prop_list =
  withTests testSize . property . liftAWS $ do
    m <- forAll $ Gen.text (Range.linear 10 20) Gen.alphaNum
    a <- newAddress
    i <- Reliability.testSize
    createSmallFiles a m i
    lift $ replicateM_ 100 (list a >>= \z -> when (length z /=  i) (throwM $ userError "List is not the same as original response"))


prop_upload_single :: Property
prop_upload_single =
  withTests testSize . property . liftAWS $ do
    m <- forAll $ Gen.text (Range.linear 10 20) Gen.alphaNum
    a <- newAddress
    i <- Reliability.testSize
    p <- newFilePath
    l <- forAll $ genLocalPath
    let f = p </> localPath l
    liftIO $ T.writeFile f "data"
    lift . mapM_ (Unsafe.upload f) $ files a m i


tests :: IO Bool
tests =
  checkSequential $$(discover)