packages feed

seihou-cli-0.5.0.0: test/Seihou/CLI/AgentModelsSpec.hs

module Seihou.CLI.AgentModelsSpec (tests) where

import Baikai.Model (Model)
import Baikai.Model qualified as BaikaiModel
import Data.Set qualified as Set
import Data.Text (Text)
import Data.Text qualified as Text
import Seihou.CLI.AgentCompletion (AgentProvider (..))
import Seihou.CLI.AgentModels
import Test.Hspec
import Test.Tasty (TestTree)
import Test.Tasty.Hspec (testSpec)

tests :: IO TestTree
tests = testSpec "Seihou.CLI.AgentModels" $ do
  describe "availableAgentModels" $ do
    it "contains 31 unique Anthropic and OpenAI model IDs" $ do
      let ids = modelIds availableAgentModels
      length ids `shouldBe` 31
      Set.size (Set.fromList ids) `shouldBe` 31
      Set.fromList (map BaikaiModel.provider availableAgentModels)
        `shouldBe` Set.fromList ["anthropic", "openai"]

    it "contains the newest Claude and GPT-5.6 models" $
      modelIds availableAgentModels
        `shouldSatisfy` \ids ->
          all
            (`elem` ids)
            ["claude-sonnet-5", "gpt-5.6", "gpt-5.6-luna", "gpt-5.6-sol", "gpt-5.6-terra"]

  describe "filterAgentModels" $ do
    it "maps the Anthropic API and Claude CLI providers to the same 9 models" $ do
      let anthropicIds = filteredIds AgentProviderAnthropic
          claudeCliIds = filteredIds AgentProviderClaudeCli
      anthropicIds `shouldBe` claudeCliIds
      length anthropicIds `shouldBe` 9

    it "maps the OpenAI API and Codex CLI providers to the same 22 models" $ do
      let openAIIds = filteredIds AgentProviderOpenAI
          codexCliIds = filteredIds AgentProviderCodexCli
      openAIIds `shouldBe` codexCliIds
      length openAIIds `shouldBe` 22

  describe "formatAgentModels" $ do
    it "renders model names, compatible providers, count, and alias guidance" $ do
      let output = formatAgentModels Nothing availableAgentModels
      output `shouldSatisfy` Text.isInfixOf "MODEL"
      output `shouldSatisfy` Text.isInfixOf "Claude Sonnet 5"
      output `shouldSatisfy` Text.isInfixOf "anthropic, claude-cli"
      output `shouldSatisfy` Text.isInfixOf "GPT-5.6 Terra"
      output `shouldSatisfy` Text.isInfixOf "openai, codex-cli"
      output `shouldSatisfy` Text.isInfixOf "31 models found."
      output `shouldSatisfy` Text.isInfixOf "aliases and custom model IDs remain accepted"

    it "reports the filtered model count" $ do
      formatAgentModels (Just AgentProviderAnthropic) availableAgentModels
        `shouldSatisfy` Text.isInfixOf "9 models found."
      formatAgentModels (Just AgentProviderCodexCli) availableAgentModels
        `shouldSatisfy` Text.isInfixOf "22 models found."

modelIds :: [Model] -> [Text]
modelIds = map BaikaiModel.modelId

filteredIds :: AgentProvider -> [Text]
filteredIds provider =
  modelIds (filterAgentModels (Just provider) availableAgentModels)