packages feed

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