packages feed

langchain-hs-gemini-0.0.6.0: test/Test/Gemini/Client/TypesSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Gemini.Client.TypesSpec (tests) where

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

import Gemini.Client.Types

tests :: TestTree
tests =
  testGroup
    "Gemini.Client.TypesSpec"
    [ testGroup
        "InteractionStatus JSON"
        [ testCase "encodes and decodes all statuses" $ do
            let statuses =
                  [ (StatusInProgress, "\"in_progress\"")
                  , (StatusRequiresAction, "\"requires_action\"")
                  , (StatusCompleted, "\"completed\"")
                  , (StatusFailed, "\"failed\"")
                  , (StatusCancelled, "\"cancelled\"")
                  , (StatusIncomplete, "\"incomplete\"")
                  ]
            mapM_ (\(st, raw) -> encode st @?= raw) statuses
            mapM_ (\(st, raw) -> decode raw @?= Just st) statuses
        ]
    , testGroup
        "SSE Events JSON"
        [ testCase "SseStepDelta TextDelta" $ do
            let raw =
                  "{\"event_type\": \"step.delta\", \"index\": 0, \"delta\": {\"type\": \"text\", \"text\": \"chunk\"}}" ::
                    LBS.ByteString
            case decode raw of
              Just (SseStepDelta idx (TextDelta txt)) -> do
                idx @?= 0
                txt @?= "chunk"
              other -> assertFailure ("Unexpected decode result: " ++ show other)
        , testCase "SseInteractionCompleted" $ do
            let raw =
                  "{\"event_type\": \"interaction.completed\", \"interaction\": {\"id\": \"v1_abc\", \"status\": \"completed\", \"steps\": []}}" ::
                    LBS.ByteString
            case decode raw of
              Just (SseInteractionCompleted inter) -> do
                interactionId inter @?= "v1_abc"
                interactionStatus inter @?= StatusCompleted
              other -> assertFailure ("Unexpected decode result: " ++ show other)
        ]
    ]