use std::sync::Arc;
use wabot_addon_chat_bot_openai::{OpenaiChatAdapter, OpenaiConfig};
use wabot_addon_chat_bot_openrouter::{OpenRouterChatAdapter, OpenRouterConfig};
use wabot_feature_chat_bot::ChatAdapter;
use wabot_testing::conformance::chat_adapter_conformance;
fn adapter() -> Option<(Arc<dyn ChatAdapter>, String)> {
let key = std::env::var("WABOT_TEST_LLM_KEY").ok()?;
let provider = std::env::var("WABOT_TEST_LLM_PROVIDER").unwrap_or_else(|_| "openrouter".into());
Some(match provider.as_str() {
"openai" => (
Arc::new(OpenaiChatAdapter::new(OpenaiConfig::new(key))),
"gpt-4o-mini".to_string(),
),
"openrouter" => (
Arc::new(OpenRouterChatAdapter::new(OpenRouterConfig::new(key))),
"openai/gpt-4o-mini".to_string(),
),
other => panic!("unknown WABOT_TEST_LLM_PROVIDER {other:?}"),
})
}
#[tokio::test]
async fn the_adapter_conforms() {
let Some((adapter, model)) = adapter() else {
eprintln!("skipping: WABOT_TEST_LLM_KEY not set");
return;
};
let mut failures = Vec::new();
for case in chat_adapter_conformance(adapter, &model) {
let name = case.name;
let asserts = case.asserts;
match case.run().await {
Ok(()) => eprintln!(" ok {name}"),
Err(error) => {
eprintln!(" FAIL {name} — {asserts}\n {error}");
failures.push(format!("{name}: {error}"));
}
}
}
assert!(
failures.is_empty(),
"{} of the conformance cases failed:\n{}",
failures.len(),
failures.join("\n")
);
}