mismi-s3-core-0.0.1: test/Test/Mismi/S3/Core/Gen.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
module Test.Mismi.S3.Core.Gen (
genWriteMode
, genBucket
, genKey
, genAddress
, fileNameSizePairs
) where
import qualified Data.List as L
import qualified Data.Text as T
import Mismi.S3.Core.Data
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import P
genWriteMode :: Gen WriteMode
genWriteMode =
Gen.element [Fail, Overwrite]
genBucket :: Gen Bucket
genBucket =
Bucket <$>
Gen.text (Range.linear 10 20) Gen.alphaNum
-- The max length of S3 Paths is 1024 - and we append some of them in the tests
-- Unfortunately unicode characters aren't supported in the Haskell AWS library
genKey :: Gen Key
genKey =
let
genPath = Gen.element ["happy", "sad", ".", ":", "-"]
listOf1 gen = Gen.list (Range.linear 1 50) gen
path = do
sep <- Gen.element ["-", "=", "#", ""]
T.take 256 . T.intercalate "/" <$> listOf1 (T.intercalate sep <$> listOf1 genPath)
in
(Key . T.append "tests/") <$> path
genAddress :: Gen Address
genAddress =
Gen.frequency [
(9, Address <$> genBucket <*> genKey)
, (1, Address <$> genBucket <*> (pure $ Key ""))
]
fileNameSizePairs :: Int -> Gen [(FilePath, Int64)]
fileNameSizePairs len = do
names <- Gen.list (Range.singleton len) $ Gen.string (Range.linear 10 20) Gen.alphaNum
lengths <- Gen.list (Range.singleton len) $ Gen.int64 (Range.linear 1 1000000000)
let
zipper n i l = (n <> show i, l)
pure $ L.zipWith3 zipper names [(0::Int) ..] lengths