{-# LANGUAGE OverloadedStrings #-}
module Main where
import Ollama qualified
import Ollama (defaultGenerateOps, GenerateOps(..), defaultChatOps, Role(..))
import Data.Ollama.Chat qualified as Chat
import Data.Text.IO qualified as T
import Test.Tasty
import Test.Tasty.HUnit
import System.IO.Silently (capture)
import Data.Either
import Data.List.NonEmpty hiding (length)
import Data.Maybe
tests :: TestTree
tests = testGroup "Tests" [
generateTest
, chatTest
, psTest
, showTest
]
generateTest :: TestTree
generateTest = testGroup "Generate tests" [
testCase "generate stream" $ do
output <- capture $ Ollama.generate defaultGenerateOps { modelName = "smollm:360m"
, prompt = "what is 4 + 2?"
, stream = Just (T.putStr . Ollama.response_, pure ()) }
assertBool "Checking if generate function is printing anything" (length output > 0)
, testCase "Generate non-stream" $ do
eRes <- Ollama.generate defaultGenerateOps { modelName = "smollm:360m"
, prompt = "what is 4 + 2?" }
assertBool "Checking if generate function returns a valid value" (isRight eRes)
, testCase "Generate with invalid model" $ do
eRes <- Ollama.generate defaultGenerateOps { modelName = "invalid-model" }
assertBool "Expecting generation to fail with invalid model" (isLeft eRes)
]
chatTest :: TestTree
chatTest = testGroup "Chat tests" [
testCase "chat stream" $ do
let msg = Ollama.Message User "What is 29 + 3?" Nothing
defaultMsg = Ollama.Message User "" Nothing
output <- capture $ Ollama.chat defaultChatOps {
Chat.chatModelName = "smollm:360m"
, Chat.messages = msg :| []
, Chat.stream = Just (T.putStr . Chat.content . fromMaybe defaultMsg . Chat.message, pure ())
}
assertBool "Checking if chat function is printing anything" (length output > 0)
, testCase "Chat non-stream" $ do
let msg = Ollama.Message User "What is 29 + 3?" Nothing
eRes <- Ollama.chat defaultChatOps {
Chat.chatModelName = "smollm:360m"
, Chat.messages = msg :| []
}
assertBool "Checking if chat function returns a valid value" (isRight eRes)
]
psTest :: TestTree
psTest = testGroup "PS test" [
testCase "check ps" $ do
mRes <- Ollama.ps
assertBool "Check if ps returns anything" (isJust mRes)
]
showTest :: TestTree
showTest = testGroup "Show test" [
testCase "check show" $ do
mRes <- Ollama.showModel "smollm:360m"
assertBool "Check if model exists or not" (isJust mRes)
]
main :: IO ()
main = defaultMain tests