{-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE RecordWildCards #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Handler.ZipSpec where import TestImport import Handler.Zip import System.FilePath import Data.Conduit import qualified Data.Conduit.List as Conduit import Data.List (dropWhileEnd) import Data.Time instance Arbitrary ZipEntry where arbitrary = do zipEntryName <- joinPath <$> arbitrary zipEntryTime <- arbitrary zipEntryContents <- arbitrary return ZipEntry{..} spec :: Spec spec = describe "Zip file handling" $ do it "has compatible encoding/decoding to/from zip files" . property $ \zipFiles -> do (_, zipFiles') <- runConduit $ Conduit.sourceList zipFiles =$= produceZip def =$= consumeZip return forM_ (zipFiles `zip` zipFiles') $ \(file, file') -> do let acceptableFilenameChanges = bool (dropWhileEnd isPathSeparator) addTrailingPathSeparator (isNothing $ zipEntryContents file) . normalise . makeValid acceptableTimeDifference t1 t2 = abs (diffUTCTime t1 t2) <= 2 (shouldBe `on` acceptableFilenameChanges) (zipEntryName file') (zipEntryName file) (zipEntryTime file', zipEntryTime file) `shouldSatisfy` uncurry acceptableTimeDifference (zipEntryContents file') `shouldBe` (zipEntryContents file)