packages feed

langchain-hs-0.0.5.0: test/Test/Langchain/Provider/FixturesSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Langchain.Provider.FixturesSpec (tests) where

import Data.Aeson (Value, decode)
import qualified Data.ByteString.Lazy as LBS
import Test.Tasty
import Test.Tasty.HUnit

import Langchain.Core.Model
import Langchain.Core.Stream (TokenUsage (..))
import Langchain.Provider.Gemini (parseGeminiResponse)
import Langchain.Provider.OpenAI (parseOpenAIResponse)

loadFixture :: FilePath -> IO (Either String Value)
loadFixture fp = do
  content <- LBS.readFile fp
  case decode content of
    Nothing -> pure $ Left ("Failed to decode JSON from fixture: " ++ fp)
    Just val -> pure $ Right val

tests :: TestTree
tests =
  testGroup
    "Langchain.Provider.FixturesSpec"
    [ testCase "Parse OpenAI Chat Completion fixture" $ do
        eVal <- loadFixture "test/fixtures/openai_chat_response.json"
        case eVal of
          Left err -> assertFailure err
          Right val -> case parseOpenAIResponse val of
            Left parseErr -> assertFailure ("OpenAI parser error: " ++ parseErr)
            Right (msg, mbUsage) -> do
              messageRole msg @?= Assistant
              extractMessageText msg @?= "Hello! I am OpenAI GPT-4o."
              case mbUsage of
                Nothing -> assertFailure "Expected TokenUsage in response"
                Just usage -> promptTokens usage @?= 9
    , testCase "Parse OpenAI Tool Call fixture" $ do
        eVal <- loadFixture "test/fixtures/openai_tool_call.json"
        case eVal of
          Left err -> assertFailure err
          Right val -> case parseOpenAIResponse val of
            Left parseErr -> assertFailure ("OpenAI parser error: " ++ parseErr)
            Right (msg, _) -> do
              messageRole msg @?= Assistant
              case messageToolCalls msg of
                Just [tc] -> do
                  toolCallName tc @?= "calculator"
                  toolCallId tc @?= "call_abc123"
                _ -> assertFailure "Expected tool call in OpenAI message"
    , testCase "Parse Gemini Chat fixture" $ do
        eVal <- loadFixture "test/fixtures/gemini_response.json"
        case eVal of
          Left err -> assertFailure err
          Right val -> case parseGeminiResponse val of
            Left parseErr -> assertFailure ("Gemini parser error: " ++ parseErr)
            Right msg -> do
              messageRole msg @?= Assistant
              extractMessageText msg @?= "Hello! I am Google Gemini 2.5."
    ]