packages feed

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)