mismi-s3-core-0.0.1: test/Test/Mismi/S3/Core/Data.hs
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Test.Mismi.S3.Core.Data (tests) where
import qualified Data.Text as T
import qualified Data.List as L
import Hedgehog
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range
import Mismi.S3.Core.Data
import P
import Test.Mismi.S3.Core.Gen
prop_append :: Property
prop_append =
property $ do
p1 <- forAll genKey
p2 <- forAll genKey
T.count "//" (unKey (p1 // p2)) === 0
prop_appendEdge :: Property
prop_appendEdge =
property $ do
m <- forAll $ Gen.text (Range.singleton 5) Gen.alphaNum
s <- forAll $ Gen.text (Range.singleton 5) Gen.alphaNum
Key (m <> "/") // Key s === Key (m <> "/" <> s)
Key m // Key ("/" <> s) === Key (m <> "/" <> s)
Key m // Key s === Key (m <> "/" <> s)
prop_parse :: Property
prop_parse =
property $ do
a <- forAll genAddress
addressFromText (addressToText a) === Just a
prop_parse_bucket :: Property
prop_parse_bucket =
property $ do
b <- forAll genBucket
addressFromText ("s3://" <> unBucket b) === Just (Address b (Key ""))
prop_sorted :: Property
prop_sorted =
withTests 10 . property $ do
addresses <- forAll $ Gen.list (Range.linear 0 100) genAddress
fmap addressToText (L.sort addresses) === L.sort (fmap addressToText addresses)
prop_withKey :: Property
prop_withKey =
property $ do
a <- forAll genAddress
withKey id a === a
prop_withKey_dirname :: Property
prop_withKey_dirname =
property $ do
a <- forAll genAddress
key (withKey dirname a) === (dirname . key) a
prop_withKey_key :: Property
prop_withKey_key =
property $ do
a <- forAll genAddress
k <- forAll genKey
key (withKey (// k) a) === (key a) // k
prop_basename :: Property
prop_basename =
property $ do
k <- forAll genKey
bn <- forAll $ Gen.text (Range.linear 1 20) Gen.alphaNum
basename (k // (Key bn)) === Just bn
prop_basename_prefix :: Property
prop_basename_prefix =
property $ do
k <- forAll genKey
bn <- forAll $ Gen.text (Range.linear 1 20) Gen.alphaNum
basename (k // (Key $ bn <> "/")) === Nothing
prop_basename_root :: Property
prop_basename_root =
property $
basename (Key "") === Nothing
prop_dirname :: Property
prop_dirname =
property $ do
a <- forAll genAddress
t <- forAll $ Gen.text (Range.linear 1 20) Gen.alphaNum
let
k = Key t
dirname (key a // k) === Key (T.dropWhileEnd ('/' ==) . unKey . key $ a)
prop_commonPrefix :: Property
prop_commonPrefix =
property $ do
a <- forAll genAddress
k <- forAll genKey
removeCommonPrefix a (withKey (// k) a) === Just k
prop_commonPrefix_fail :: Property
prop_commonPrefix_fail =
property $ do
a <- forAll genAddress
k <- forAll genKey
removeCommonPrefix (withKey (// k) a) a === Nothing
tests :: IO Bool
tests =
checkSequential $$(discover)