#![ cfg( feature = "enabled" ) ]
use api_openai_compatible::OpenAiCompatError;
#[ test ]
fn api_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Api( "rate limit exceeded".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "API error" ),
"Api display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "rate limit exceeded" ),
"Api display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn http_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Http( "502 Bad Gateway".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "HTTP error" ),
"Http display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "502 Bad Gateway" ),
"Http display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn network_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Network( "connection refused".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "Network error" ),
"Network display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "connection refused" ),
"Network display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn timeout_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Timeout( "30s elapsed".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "Timeout" ),
"Timeout display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "30s elapsed" ),
"Timeout display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn invalid_api_key_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::InvalidApiKey( "non-ASCII char".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "Invalid API key" ),
"InvalidApiKey display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "non-ASCII char" ),
"InvalidApiKey display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn environment_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Environment( "bad URL".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "Environment error" ),
"Environment display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "bad URL" ),
"Environment display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn deserialise_error_display_contains_category_and_detail()
{
let err = OpenAiCompatError::Deserialise( "missing field".to_string() );
let msg = err.to_string();
assert!(
msg.contains( "Deserialisation error" ),
"Deserialise display must contain category prefix; got: {msg}",
);
assert!(
msg.contains( "missing field" ),
"Deserialise display must contain the detail string; got: {msg}",
);
}
#[ test ]
fn from_serde_json_error_produces_deserialise_variant()
{
let serde_err = serde_json::from_str::< i32 >( "not-a-number" )
.expect_err( "parsing \"not-a-number\" as i32 must fail" );
let converted : OpenAiCompatError = serde_err.into();
match &converted
{
OpenAiCompatError::Deserialise( detail ) =>
{
assert!(
!detail.is_empty(),
"Deserialise detail must contain the serde error message",
);
},
other =>
{
panic!( "expected Deserialise variant, got: {other:?}" );
},
}
}
#[ test ]
fn from_invalid_header_value_produces_invalid_api_key_variant()
{
let header_err = reqwest::header::HeaderValue::from_bytes( &[ 0x00_u8 ] )
.expect_err( "NUL byte must be invalid in HTTP header values" );
let converted : OpenAiCompatError = header_err.into();
match &converted
{
OpenAiCompatError::InvalidApiKey( detail ) =>
{
assert!(
!detail.is_empty(),
"InvalidApiKey detail must contain the header error message",
);
},
other =>
{
panic!( "expected InvalidApiKey variant, got: {other:?}" );
},
}
}