packages feed

hsec-tools-0.5.0.0: test/Spec/OsvSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Spec.OsvSpec (spec) where

import Data.Aeson (decode, encode)
import Data.ByteString.Lazy (toStrict)
import qualified Data.Text as T
import qualified Data.Text.Encoding as TE
import Security.Advisories.Convert.OSV
import Security.Advisories.Core.Advisory
import Test.Tasty
import Test.Tasty.Hedgehog
import qualified Hedgehog as Gen
import qualified Hedgehog.Gen as Gen
import qualified Hedgehog.Range as Range

spec :: TestTree
spec =
  testGroup
    "OSV"
    [ testGroup
        "AffectedApi"
        [ testProperty "JSON roundtrip" $
            Gen.property $ do
              api <- Gen.forAll genAffectedApi
              let encoded = encode api
                  decoded = decode encoded
              Just api Gen.=== decoded
        ]
    , testGroup
        "HsecEcosystemSpecific"
        [ testProperty "JSON roundtrip" $
            Gen.property $ do
              ecs <- Gen.forAll genHsecEcosystemSpecific
              let encoded = encode ecs
                  decoded = decode encoded
              Just ecs Gen.=== decoded
        , testProperty "encodes affected_api key" $
            Gen.property $ do
              apis <- Gen.forAll (Gen.list (Range.linear 1 5) genAffectedApi)
              let ecs = HsecEcosystemSpecific apis
                  jsonBytes = encode ecs
                  jsonText = TE.decodeUtf8 (toStrict jsonBytes)
              Gen.assert $ "affected_api" `T.isInfixOf` jsonText
        , testProperty "Nothing when empty" $
            Gen.property $ do
              let ecs = HsecEcosystemSpecific []
                  jsonBytes = encode ecs
                  jsonText = TE.decodeUtf8 (toStrict jsonBytes)
              Gen.assert $ "affected_api" `T.isInfixOf` jsonText
        ]
    ]

genAffectedApi :: Gen.Gen AffectedApi
genAffectedApi = AffectedApi <$> genText <*> genText

genHsecEcosystemSpecific :: Gen.Gen HsecEcosystemSpecific
genHsecEcosystemSpecific = HsecEcosystemSpecific <$> Gen.list (Range.linear 0 5) genAffectedApi

genText :: Gen.Gen T.Text
genText = Gen.text (Range.linear 1 20) Gen.alphaNum