use oxicode_ai::{
Api, Context, GeminiCliProvider, Model, OpenAiResponsesProvider, Provider, ProviderError,
StreamOptions,
};
fn test_context() -> Context {
Context::new().with_system_prompt("You are a helpful assistant.")
}
fn codex_model(base_url: &str) -> Model {
Model::new(
"codex-test",
"Codex Test Model",
Api::OpenAiCodexResponses,
"openai-codex",
base_url,
)
}
fn gemini_model(base_url: &str) -> Model {
Model::new(
"gemini-cli-test",
"Gemini CLI Test Model",
Api::GoogleGeminiCli,
"google-gemini-cli",
base_url,
)
}
#[tokio::test]
async fn codex_responses_transport_accepts_codex_api() {
let provider = OpenAiResponsesProvider::with_base_url_and_key(
"http://127.0.0.1:1",
Some("test-key".to_string()),
);
let model = codex_model("http://127.0.0.1:1");
assert_eq!(model.api, Api::OpenAiCodexResponses);
let context = test_context();
let result: Result<
std::pin::Pin<Box<dyn futures::Stream<Item = oxicode_ai::ProviderEvent> + Send>>,
ProviderError,
> = <OpenAiResponsesProvider as Provider>::stream(
&provider,
&model,
&context,
Some(StreamOptions::default()),
)
.await;
match result {
Ok(_) => {}
Err(ProviderError::NotImplemented(_)) => {
panic!("Codex Responses transport routed to NotImplemented; factory arm missing")
}
Err(ProviderError::RequestFailed(_)) => {
}
Err(other) => panic!("unexpected Codex Responses error: {other:?}"),
}
}
#[tokio::test]
async fn gemini_cli_stream_returns_not_implemented_error() {
let provider = GeminiCliProvider::new();
let model = gemini_model("https://generativelanguage.googleapis.com");
let context = test_context();
let options = StreamOptions::default();
let result: Result<
std::pin::Pin<Box<dyn futures::Stream<Item = oxicode_ai::ProviderEvent> + Send>>,
ProviderError,
> = Provider::stream(&provider, &model, &context, Some(options)).await;
match result {
Err(ProviderError::NotImplemented(name)) => {
assert!(
name.contains("gemini") || name.contains("Gemini"),
"NotImplemented name should mention gemini-cli, got: {name}"
);
}
Ok(_) => panic!(
"Gemini CLI transport must NOT fake success — stream() must return NotImplemented"
),
Err(other) => panic!("Gemini CLI stream must return NotImplemented, got: {other:?}"),
}
}