sd-jwt-0.1.0.0: test/DoctestSpec.hs
{-# LANGUAGE CPP #-}
-- | Run doctest on documentation examples
--
-- This test suite runs doctest on:
-- - Haddock examples in persona modules (Issuer, Holder, Verifier)
-- - README.md examples (converted to doctest format)
module DoctestSpec (spec) where
import Test.Hspec
import System.Process (readProcessWithExitCode)
import System.Exit (ExitCode(..))
import System.Directory (doesFileExist)
-- Get stack yaml file to use (prefer stack-ci.yaml if it exists, otherwise default)
getStackYaml :: IO [String]
getStackYaml = do
ciExists <- doesFileExist "stack-ci.yaml"
if ciExists
then return ["--stack-yaml", "stack-ci.yaml"]
else return []
spec :: Spec
spec = describe "Doctest" $ do
it "runs doctest on Haddock examples" $ do
-- Run doctest on persona modules
-- Use --fast flag to use already-compiled modules and avoid recompilation
stackArgs <- getStackYaml
(exitCode, stdout, stderr) <- readProcessWithExitCode "stack"
(stackArgs ++ ["exec", "--", "doctest", "--fast",
"src/SDJWT/Issuer.hs",
"src/SDJWT/Holder.hs",
"src/SDJWT/Verifier.hs"]) ""
case exitCode of
ExitSuccess -> return ()
ExitFailure code ->
expectationFailure $
"doctest failed with exit code " ++ show code ++
"\nstdout: " ++ stdout ++
"\nstderr: " ++ stderr
it "runs doctest on README.md examples" $ do
-- First, ensure README examples are converted to doctest format
(exitCode1, _, _) <- readProcessWithExitCode "bash"
["./scripts/extract-doc-examples.sh"] ""
case exitCode1 of
ExitSuccess -> return ()
ExitFailure code ->
expectationFailure $
"Failed to extract README examples: exit code " ++ show code
-- Then run doctest on the generated file
-- Use --fast flag to use already-compiled modules and avoid recompilation
stackArgs <- getStackYaml
(exitCode2, stdout, stderr) <- readProcessWithExitCode "stack"
(stackArgs ++ ["exec", "--", "doctest", "--fast", "test/ReadmeExamplesDoctest.hs"]) ""
case exitCode2 of
ExitSuccess -> return ()
ExitFailure code ->
expectationFailure $
"doctest failed with exit code " ++ show code ++
"\nstdout: " ++ stdout ++
"\nstderr: " ++ stderr