packages feed

hsec-tools-0.2.0.2: test/Spec.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Data.Aeson.Encode.Pretty (encodePretty)
import Data.List (isSuffixOf)
import qualified Data.Text.IO as T
import qualified Data.Text.Lazy as LText
import qualified Data.Text.Lazy.Encoding as LText
import Data.Time (UTCTime(UTCTime))
import Data.Time.Calendar.OrdinalDate (fromOrdinalDate)
import Paths_hsec_tools (getDataFileName)
import qualified Security.Advisories.Convert.OSV as OSV
import Security.Advisories.Parse
import qualified Spec.FormatSpec as FormatSpec
import qualified Spec.QueriesSpec as QueriesSpec
import System.Directory (listDirectory)
import Test.Tasty (defaultMain, testGroup, TestTree)
import Test.Tasty.Golden (goldenVsString)
import Text.Pretty.Simple (pShowNoColor)

main :: IO ()
main = do
    goldenFiles <- listGoldenFiles
    defaultMain $
        testGroup
            "Tests"
            [ goldenTestsSpec goldenFiles
            , QueriesSpec.spec
            , FormatSpec.spec
            ]

listGoldenFiles :: IO [FilePath]
listGoldenFiles = map (mappend dpath) . filter (not . isSuffixOf ".golden") <$> (getDataFileName dpath >>= listDirectory)
  where
    dpath = "test/golden/"

goldenTestsSpec :: [FilePath] -> TestTree
goldenTestsSpec goldenFiles = testGroup "Golden test" $ map doGoldenTest goldenFiles

doGoldenTest :: FilePath -> TestTree
doGoldenTest fp = goldenVsString fp (fp <> ".golden") (LText.encodeUtf8 <$> doCheck)
  where
    doCheck :: IO LText.Text
    doCheck = do
        input <- getDataFileName fp >>= T.readFile
        let fakeDate = UTCTime (fromOrdinalDate 1970 0) 0
            attr = OutOfBandAttributes
              { oobPublished = fakeDate
              , oobModified = fakeDate
              , oobComponentIdentifier = Nothing
              }
            res = parseAdvisory NoOverrides (Right attr) input
            osvExport = case res of
                Right adv ->
                    let osv = OSV.convert adv
                     in LText.unlines
                            [ pShowNoColor osv
                            , LText.decodeUtf8 (encodePretty osv)
                            ]
                Left _ -> ""
        pure (LText.unlines [pShowNoColor res, osvExport])