content: {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  module ApiParserTest (tests) where
  
  -- Import the module and function we are testing
  import qualified Convex.Parser as APIParser
  import Test.HUnit
  import Text.Parsec (parse)
  
  -- The test suite for the apiFileParser, exported to be used by Main.
  tests :: Test
  tests =
    "API File Parser"
      ~: runTest
        "parses module paths from api.d.ts"
        (APIParser.apiFileParser)
        sampleApiFile
        expectedApiPaths
    where
      runTest testName parser input expected =
        testName ~: TestCase $ do
          -- Use the pure `parse` function since this parser is stateless.
          case parse parser "(test input)" input of
            Left err -> assertFailure ("Parser failed: " ++ show err)
            Right actual -> actual @?= expected
  
  -- A sample input string that mimics the structure of a real api.d.ts file.
  sampleApiFile :: String
  sampleApiFile =
    unlines
      [ "/* eslint-disable */",
        "import type * as admin_actions from \"../admin/actions.js\";",
        "import type * as custom from \"../custom.js\";",
        "declare const fullApi: ApiFromModules<{",
        "  \"admin/actions\": typeof admin_actions;",
        "  custom: typeof custom;",
        "  \"stripe/checkout\": typeof stripe_checkout;",
        "}>;"
      ]
  
  -- The list of module paths we expect the parser to extract.
  expectedApiPaths :: [String]
  expectedApiPaths =
    [ "admin/actions",
      "custom",
      "stripe/checkout"
    ]
  