chore(pandoc): improved tests for helper functions like addMeta

This commit is contained in:
Steffen Jost 2022-07-15 17:45:15 +02:00
parent e63a3af926
commit ea2873476b
2 changed files with 68 additions and 20 deletions

View File

@ -1,10 +1,10 @@
module Utils.Print where module Utils.Print where
-- import Import.NoModel -- import Import.NoModel
-- import qualified Data.Foldable as Fold import qualified Data.Foldable as Fold
-- hiding (foldr) import Data.Foldable (foldr) import qualified Data.Text as T
import qualified Data.CaseInsensitive as CI
-- import qualified Data.Text as T
import qualified Data.ByteString.Lazy as LBS import qualified Data.ByteString.Lazy as LBS
import Control.Monad.Except import Control.Monad.Except
import Import hiding (embedFile) import Import hiding (embedFile)
@ -67,8 +67,8 @@ appMeta f (P.Pandoc m bs) = P.Pandoc (f m) bs
-- appMeta f = _Meta %~ f -- lens version. Not sure this is better -- appMeta f = _Meta %~ f -- lens version. Not sure this is better
-- Add tests for applyMetas, if ever needed -- Add tests for applyMetas, if ever needed
-- applyMetas :: (P.HasMeta p, Foldable t, P.ToMetaValue a) => t (Text, a) -> p -> p applyMetas :: (P.HasMeta p, Foldable t, P.ToMetaValue a) => t (Text, a) -> p -> p
-- applyMetas metas doc = Fold.foldr (uncurry P.setMeta) doc metas applyMetas metas doc = Fold.foldr (uncurry P.setMeta) doc metas
-- | Add meta to pandoc. Existing variables will be overwritten. -- | Add meta to pandoc. Existing variables will be overwritten.
addMeta :: P.Meta -> P.Pandoc -> P.Pandoc addMeta :: P.Meta -> P.Pandoc -> P.Pandoc
@ -221,11 +221,19 @@ pdfRenewal' meta = do
-- PrintJobs -- -- PrintJobs --
--------------- ---------------
sendLetter :: Text -> LBS.ByteString -> Maybe UserId -> Maybe UserId -> Maybe CourseId -> Maybe QualificationId -> DB () sendLetter :: Text -> LBS.ByteString -> Maybe UserId -> Maybe UserId -> Maybe CourseId -> Maybe QualificationId -> DB FilePath
sendLetter printJobName pdf printJobRecipient printJobSender printJobCourse printJobQualification = do sendLetter printJobName pdf printJobRecipient printJobSender printJobCourse printJobQualification = do
recipient <- fmap userDisplayName . join <$> mapM get printJobRecipient
sender <- fmap userDisplayName . join <$> mapM get printJobRecipient
course <- fmap (CI.original . courseShorthand ) . join <$> mapM get printJobCourse
quali <- fmap (CI.original . qualificationShorthand) . join <$> mapM get printJobQualification
let printJobAcknowledged = Nothing let printJobAcknowledged = Nothing
printJobFile <- sinkFileDB True $ yield $ LBS.toStrict pdf -- sinkFileDB: Boolean Field problematic? Hashing? printJobFilename = unpack . T.intercalate "_" . catMaybes $ [Just printJobName, quali, course, sender, recipient]
-- printJobFile <- sinkFileDB True $ yield $ LBS.toStrict pdf -- for PrintJobFile :: FileContentReference use this code
printJobFile = LBS.toStrict pdf
-- TODO: system call to lpr here!
printJobCreated <- liftIO getCurrentTime printJobCreated <- liftIO getCurrentTime
insert_ PrintJob {..} insert_ PrintJob {..}
return printJobFilename

View File

@ -4,39 +4,79 @@ import TestImport
import Utils.Print import Utils.Print
import qualified Data.Set as Set
import qualified Data.Map.Lazy as Map import qualified Data.Map.Lazy as Map
import qualified Data.Foldable as Fold
import Text.Pandoc import Text.Pandoc
import Text.Pandoc.Builder
import Text.Pandoc.Arbitrary () import Text.Pandoc.Arbitrary ()
-- Instance Arbitrary Meta is somewhat useless, as it always generates the same 3 keys.
newtype ArbitraryMeta = ArbitraryMeta { unArbitraryMeta :: Meta }
deriving newtype (Eq, Ord, Semigroup, Monoid, Show, Read)
instance Arbitrary ArbitraryMeta where
arbitrary
= do (x1 :: Inlines) <- arbitrary
(x2 :: [Inlines]) <- filter (not . Fold.null) <$> arbitrary
(x3 :: Inlines) <- arbitrary
(x4 :: [(Text, Text)]) <- arbitrary
(x5 :: [(Text, Bool)]) <- arbitrary
return $ ArbitraryMeta
$ setMeta "title" x1
$ setMeta "author" x2
$ setMeta "date" x3
$ applyMetas x4
$ applyMetas x5
nullMeta
-- For Lens Check _Meta required: -- For Lens Check _Meta required:
--instance CoArbitrary Inline --instance CoArbitrary Inline
--instance CoArbitrary MetaValue --instance CoArbitrary MetaValue
--instance CoArbitrary Meta --instance CoArbitrary Meta
--instance Function Inline --instance Function Inline
--instance Function MetaValue --instance Function MetaValue
--instance Function Meta --instance Function Meta
spec :: Spec spec :: Spec
spec = -- do spec = do
let mlist = Map.toList . unMeta
describe "applyMetas" $ do
it "should actually set values" $ do
(ml, pd) <- generate arbitrary
let
mlKeys = Set.fromList $ fst <$> ml
(Pandoc newMeta _) = applyMetas (fmap MetaString <$> ml) pd
ml' = [(k,t) | (k, MetaString t) <- mlist newMeta, Set.member k mlKeys]
ml `shouldMatchList` ml'
describe "addMeta" $ do describe "addMeta" $ do
it "should overwrite existing settings" $ do it "should possibly overwrite existing settings" $ do
(metaOverwrite, pd) <- generate arbitrary (abMetaOverwrite, abMetaOriginal, blocks) <- generate arbitrary
let (Pandoc newMeta _) = addMeta metaOverwrite pd let
Map.toList (unMeta newMeta) `shouldContain` Map.toList (unMeta metaOverwrite) metaOverwrite = unArbitraryMeta abMetaOverwrite
metaOriginal = unArbitraryMeta abMetaOriginal
pd = Pandoc metaOriginal blocks
(Pandoc newMeta _) = addMeta metaOverwrite pd
mlist newMeta `shouldContain` mlist metaOverwrite
it "should preserve untouched settings" $ do it "should preserve untouched settings" $ do
(metaOverwrite, pd) <- generate arbitrary (abMetaOverwrite, abMetaOriginal, blocks) <- generate arbitrary
let let
(Pandoc keptMeta _) = pd metaOverwrite = unArbitraryMeta abMetaOverwrite
metaOriginal = unArbitraryMeta abMetaOriginal
pd = Pandoc metaOriginal blocks
(Pandoc newMeta _) = addMeta metaOverwrite pd (Pandoc newMeta _) = addMeta metaOverwrite pd
Map.toList (unMeta newMeta) `shouldContain` Map.toList (unMeta keptMeta `Map.difference` unMeta metaOverwrite) mlist newMeta `shouldContain` Map.toList (unMeta metaOriginal `Map.difference` unMeta metaOverwrite)
it "should preserve document block" $ do it "should preserve document blocks" $ do
(metaOverwrite, pd) <- generate arbitrary (metaOverwrite, pd) <- generate arbitrary
let let
(Pandoc _ oldBlocks) = pd (Pandoc _ oldBlocks) = pd
(Pandoc _ newBlocks) = addMeta metaOverwrite pd (Pandoc _ newBlocks) = addMeta (unArbitraryMeta metaOverwrite) pd
oldBlocks `shouldBe` newBlocks oldBlocks `shouldBe` newBlocks
-- describe "_Meta" . it "is a lens" . property $ isLens _Meta -- describe "_Meta" . it "is a lens" . property $ isLens _Meta