module Archive ( tests ) where import Codec.Archive.Zip import Control.Monad.Except import Data.List ( isPrefixOf ) import Data.Maybe ( listToMaybe ) import System.Directory import System.FilePath import Test.HUnit import Codec.Epub.Data.Package import Codec.Epub.IO import Codec.Epub.Parse tests :: Test tests = TestList [ testMkArchive , testDamagedZip , testIllegalCharsBeforeDecl ] {- Test that the mimetype file is the first Entry in archives we create -} testMkArchive :: Test testMkArchive = TestCase $ do origDir <- getCurrentDirectory a <- mkEpubArchive $ "util" "resources" "bookfiles" setCurrentDirectory origDir let maybeFirstFile = listToMaybe . filesInArchive $ a assertEqual "mimetype file is FIRST" (Just "mimetype") maybeFirstFile {- Occasionally epub zip files come along that are damaged in this way. It's not fatal to the UNIX zip utility or to book readers, but had to be specially handled in the Haskell zip-archive library or it causes a fatal exception. -} testDamagedZip :: Test testDamagedZip = TestCase $ do let label = "damaged zip" let expectedErrorPrefix = "Data.Binary.Get.runGet at position 138: Did not find end of central directory signature" actual <- runExceptT $ getPkgXmlFromZip $ "util" "resources" "damagedZipCentralDir.epub" case actual of Left actualMessage -> assertBool label $ isPrefixOf expectedErrorPrefix actualMessage Right _ -> assertFailure label {- Found books coming from Barnes & Noble (for their NOOK reader) to contain illegal characters before the XML declaration. This is strictly not allowed by the XML specification. I am very disappointed with Barnes & Noble for selling garbage like this. -} testIllegalCharsBeforeDecl :: Test testIllegalCharsBeforeDecl = TestCase $ do xmlString <- readFile $ "util" "resources" "testIllegalCharsBeforeDecl.opf" actual <- runExceptT $ getPackage xmlString let expected = Right Package {pkgVersion = "2.0", pkgUniqueId = "uuid_id"} assertEqual "illegal chars before XML declaration" expected actual