Docx tests: rewrite mediabag tests.
This will allow us to test the whole mediabag (making sure, for example, that images are added with the correct keys) instead of just individual extracted images. We compare each entry in the media bag to an image extracted on the fly from the docx. As a result, we only need one file to test with. The image in the current tests was also replaced with a smaller one.
This commit is contained in:
parent
6dd2418476
commit
ed71e9b31d
6 changed files with 45 additions and 23 deletions
|
@ -386,7 +386,6 @@ Test-Suite test-pandoc
|
||||||
syb >= 0.1 && < 0.5,
|
syb >= 0.1 && < 0.5,
|
||||||
pandoc,
|
pandoc,
|
||||||
pandoc-types >= 1.12.3.3 && < 1.13,
|
pandoc-types >= 1.12.3.3 && < 1.13,
|
||||||
base64-bytestring >= 0.1 && < 1.1,
|
|
||||||
bytestring >= 0.9 && < 0.11,
|
bytestring >= 0.9 && < 0.11,
|
||||||
text >= 0.11 && < 1.2,
|
text >= 0.11 && < 1.2,
|
||||||
directory >= 1 && < 1.3,
|
directory >= 1 && < 1.3,
|
||||||
|
@ -400,7 +399,8 @@ Test-Suite test-pandoc
|
||||||
QuickCheck >= 2.4 && < 2.8,
|
QuickCheck >= 2.4 && < 2.8,
|
||||||
HUnit >= 1.2 && < 1.3,
|
HUnit >= 1.2 && < 1.3,
|
||||||
containers >= 0.1 && < 0.6,
|
containers >= 0.1 && < 0.6,
|
||||||
ansi-terminal >= 0.5 && < 0.7
|
ansi-terminal >= 0.5 && < 0.7,
|
||||||
|
zip-archive >= 0.2.3.2 && < 0.3
|
||||||
Other-Modules: Tests.Old
|
Other-Modules: Tests.Old
|
||||||
Tests.Helpers
|
Tests.Helpers
|
||||||
Tests.Arbitrary
|
Tests.Arbitrary
|
||||||
|
|
|
@ -5,14 +5,15 @@ import Text.Pandoc.Readers.Native
|
||||||
import Text.Pandoc.Definition
|
import Text.Pandoc.Definition
|
||||||
import Tests.Helpers
|
import Tests.Helpers
|
||||||
import Test.Framework
|
import Test.Framework
|
||||||
import qualified Data.ByteString as BS
|
import Test.HUnit (assertBool)
|
||||||
|
import Test.Framework.Providers.HUnit
|
||||||
import qualified Data.ByteString.Lazy as B
|
import qualified Data.ByteString.Lazy as B
|
||||||
import qualified Data.ByteString.Char8 as B8
|
|
||||||
import qualified Data.ByteString.Base64 as B64
|
|
||||||
import Text.Pandoc.Readers.Docx
|
import Text.Pandoc.Readers.Docx
|
||||||
import Text.Pandoc.Writers.Native (writeNative)
|
import Text.Pandoc.Writers.Native (writeNative)
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import Text.Pandoc.MediaBag (lookupMedia)
|
import Text.Pandoc.MediaBag (MediaBag, lookupMedia, mediaDirectory)
|
||||||
|
import Codec.Archive.Zip
|
||||||
|
import System.FilePath (combine)
|
||||||
|
|
||||||
-- We define a wrapper around pandoc that doesn't normalize in the
|
-- We define a wrapper around pandoc that doesn't normalize in the
|
||||||
-- tests. Since we do our own normalization, we want to make sure
|
-- tests. Since we do our own normalization, we want to make sure
|
||||||
|
@ -56,22 +57,44 @@ testCompareWithOpts opts name docxFile nativeFile =
|
||||||
testCompare :: String -> FilePath -> FilePath -> Test
|
testCompare :: String -> FilePath -> FilePath -> Test
|
||||||
testCompare = testCompareWithOpts def
|
testCompare = testCompareWithOpts def
|
||||||
|
|
||||||
testCompareMediaIO :: String -> FilePath -> FilePath -> FilePath -> IO Test
|
getMedia :: FilePath -> FilePath -> IO (Maybe B.ByteString)
|
||||||
testCompareMediaIO name docxFile mediaPath mediaFile = do
|
getMedia archivePath mediaPath = do
|
||||||
df <- B.readFile docxFile
|
zf <- B.readFile archivePath >>= return . toArchive
|
||||||
mf <- B.readFile mediaFile
|
return $ findEntryByPath (combine "word" mediaPath) zf >>= (Just . fromEntry)
|
||||||
let (_, mb) = readDocx def df
|
|
||||||
dBytes = case lookupMedia mediaPath mb of
|
compareMediaPathIO :: FilePath -> MediaBag -> FilePath -> IO Bool
|
||||||
|
compareMediaPathIO mediaPath mediaBag docxPath = do
|
||||||
|
docxMedia <- getMedia docxPath mediaPath
|
||||||
|
let mbBS = case lookupMedia mediaPath mediaBag of
|
||||||
Just (_, bs) -> bs
|
Just (_, bs) -> bs
|
||||||
Nothing -> error "Media file not found"
|
Nothing -> error ("couldn't find " ++
|
||||||
d64 = B8.unpack $ B64.encode $ BS.concat $ B.toChunks dBytes
|
mediaPath ++
|
||||||
m64 = B8.unpack $ B64.encode $ BS.concat $ B.toChunks mf
|
" in media bag")
|
||||||
return $ test id name (d64, m64)
|
docxBS = case docxMedia of
|
||||||
|
Just bs -> bs
|
||||||
|
Nothing -> error ("couldn't find " ++
|
||||||
|
mediaPath ++
|
||||||
|
" in media bag")
|
||||||
|
return $ mbBS == docxBS
|
||||||
|
|
||||||
testCompareMedia :: String -> FilePath -> FilePath -> FilePath -> Test
|
compareMediaBagIO :: FilePath -> IO Bool
|
||||||
testCompareMedia name docxFile mediaPath mediaFile =
|
compareMediaBagIO docxFile = do
|
||||||
buildTest $ testCompareMediaIO name docxFile mediaPath mediaFile
|
df <- B.readFile docxFile
|
||||||
|
let (_, mb) = readDocx def df
|
||||||
|
bools <- mapM
|
||||||
|
(\(fp, _, _) -> compareMediaPathIO fp mb docxFile)
|
||||||
|
(mediaDirectory mb)
|
||||||
|
return $ and bools
|
||||||
|
|
||||||
|
testMediaBagIO :: String -> FilePath -> IO Test
|
||||||
|
testMediaBagIO name docxFile = do
|
||||||
|
outcome <- compareMediaBagIO docxFile
|
||||||
|
return $ testCase name (assertBool
|
||||||
|
("Media didn't match media bag in file " ++ docxFile)
|
||||||
|
outcome)
|
||||||
|
|
||||||
|
testMediaBag :: String -> FilePath -> Test
|
||||||
|
testMediaBag name docxFile = buildTest $ testMediaBagIO name docxFile
|
||||||
|
|
||||||
tests :: [Test]
|
tests :: [Test]
|
||||||
tests = [ testGroup "inlines"
|
tests = [ testGroup "inlines"
|
||||||
|
@ -186,11 +209,9 @@ tests = [ testGroup "inlines"
|
||||||
"docx.track_changes_deletion_all.native"
|
"docx.track_changes_deletion_all.native"
|
||||||
]
|
]
|
||||||
, testGroup "media"
|
, testGroup "media"
|
||||||
[ testCompareMedia
|
[ testMediaBag
|
||||||
"image extraction"
|
"image extraction"
|
||||||
"docx.image.docx"
|
"docx.image.docx"
|
||||||
"media/image1.jpeg"
|
|
||||||
"docx.image1.jpeg"
|
|
||||||
]
|
]
|
||||||
, testGroup "metadata"
|
, testGroup "metadata"
|
||||||
[ testCompareWithOpts def{readerStandalone=True}
|
[ testCompareWithOpts def{readerStandalone=True}
|
||||||
|
|
Binary file not shown.
1
tests/docx.image.mediabag.json
Normal file
1
tests/docx.image.mediabag.json
Normal file
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 46 KiB |
|
@ -1,2 +1,2 @@
|
||||||
[Header 2 ("an-image",[],[]) [Str "An",Space,Str "image"]
|
[Para [Str "An",Space,Str "image:"]
|
||||||
,Para [Image [] ("media/image1.jpeg","")]]
|
,Para [Image [] ("media/image1.jpg","")]]
|
||||||
|
|
Loading…
Reference in a new issue