packages feed

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

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

import           Control.Lens ((.~))
import           Control.Monad.IO.Class (liftIO)

import qualified Data.List as DL
import           Data.Maybe (mapMaybe)
import           Data.Map.Strict (Map)
import qualified Data.Map.Strict as DM
import           Data.Time.Clock (NominalDiffTime, addUTCTime, getCurrentTime)

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

import           Mismi.S3.Commands
import qualified Mismi.S3.Amazonka as A

import           P

import qualified Test.Mismi.S3.Core.Gen as Gen

-- Positive NominalDiffTime
prop_filter_old :: Property
prop_filter_old =
  property $ do
    i <- fromInteger <$> forAll (Gen.integral $ Range.linear 1 10000)
    n <- liftIO getCurrentTime
    let
      t = addUTCTime ((-1 * ((60 * 60 * 24 * 7) + i)) :: NominalDiffTime) n
      r = filterOld n $ A.multipartUpload & A.muInitiated .~ Just t
    r === True

prop_filter_failure :: Property
prop_filter_failure =
  property $ do
    n <- liftIO getCurrentTime
    let
      r = filterOld n $ A.multipartUpload & A.muInitiated .~ Just n
    r === False

prop_chunk_files_by_size :: Property
prop_chunk_files_by_size =
  property $ do
    maxFilesPerChunk <- forAll (Gen.int $ Range.linear 2 10)
    fileCount <- forAll (Gen.int $ Range.linear 10 100)
    maxChunkSize <- forAll (Gen.int64 $ Range.linear 1000 10000)
    pairs <- forAll (Gen.fileNameSizePairs fileCount)
    let
      chunks = chunkFilesBySize maxFilesPerChunk maxChunkSize pairs
      chunkSizes = DL.map (multiChunkSum (DM.fromList pairs) . DL.map fst) chunks

    DL.filter (> maxChunkSize) chunkSizes === []

    where
      multiChunkSum :: Map FilePath Int64 -> [FilePath] -> Int64
      multiChunkSum _ [] = 0
      multiChunkSum _ [_] = 0  -- Don't care about size of single file chunk.
      multiChunkSum sizes xs =
        sum $ mapMaybe (\ x -> DM.lookup x sizes) xs

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