packages feed

wai-saml2-0.7.0: tests/Parser.hs

{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE TypeApplications #-}

module Parser where

import Network.Wai.SAML2.EntityDescriptor
import Network.Wai.SAML2.Response
import Network.Wai.SAML2.XML
import System.FilePath
import Test.Tasty
import Test.Tasty.Golden
import Text.Show.Pretty
import Text.XML.Cursor
import qualified Data.ByteString.Lazy.Char8 as BC
import qualified Text.XML as XML

run :: forall t. (FromXML t, Show t) => FilePath -> IO BC.ByteString
run src = do
    doc <- XML.readFile XML.def src
    resp <- parseXML (fromDocument doc)
    pure $ BC.pack $ ppShow (resp :: t)

tests :: TestTree
tests = testGroup "Parse SAML2 response"
    [ mkGolden @Response $ prefix </> "keycloak.xml"
    , mkGolden @Response $ prefix </> "okta.xml"
    , mkGolden @Response $ prefix </> "google.xml"
    , mkGolden @IDPSSODescriptor $ prefix </> "metadata/keycloak.xml"
    , mkGolden @IDPSSODescriptor $ prefix </> "metadata/google.xml"
    ]
    where
        prefix = "tests/data"
        mkGolden :: forall t. (FromXML t, Show t) => FilePath -> TestTree
        mkGolden path = goldenVsStringDiff
                (takeBaseName path)
                (\ref new -> ["diff", "-u", ref, new])
                (path <.> "expected")
                (run @t path)