use claude_auth::{ TokenRefreshResult, AuthError, parse_response };
#[ allow( unused_imports ) ]
use core::convert::identity;
#[ test ]
fn t01_parse_response_valid()
{
let body = r#"{"access_token":"sk-ant-abc","refresh_token":"sk-ant-ort01-xyz","expires_in":3600}"#;
let result : TokenRefreshResult = parse_response( body, 1000 )
.expect( "T01: should parse valid JSON" );
assert_eq!( result.access_token, "sk-ant-abc", "T01: access_token mismatch" );
assert_eq!( result.refresh_token, "sk-ant-ort01-xyz", "T01: refresh_token mismatch" );
assert_eq!( result.expires_at_ms, 3_601_000, "T01: expires_at_ms = 1000 + 3600*1000" );
}
#[ test ]
fn t02_parse_response_missing_access_token()
{
let body = r#"{"refresh_token":"sk-ant-ort01-xyz","expires_in":3600}"#;
let err = parse_response( body, 0 )
.expect_err( "T02: should fail on missing access_token" );
assert!(
matches!( err, AuthError::ResponseParse( _ ) ),
"T02: expected ResponseParse, got {err:?}"
);
}
#[ test ]
fn t03_parse_response_missing_refresh_token()
{
let body = r#"{"access_token":"sk-ant-abc","expires_in":3600}"#;
let err = parse_response( body, 0 )
.expect_err( "T03: should fail on missing refresh_token" );
assert!(
matches!( err, AuthError::ResponseParse( _ ) ),
"T03: expected ResponseParse, got {err:?}"
);
}
#[ test ]
fn t04_parse_response_missing_expires_in()
{
let body = r#"{"access_token":"sk-ant-abc","refresh_token":"sk-ant-ort01-xyz"}"#;
let err = parse_response( body, 0 )
.expect_err( "T04: should fail on missing expires_in" );
assert!(
matches!( err, AuthError::ResponseParse( _ ) ),
"T04: expected ResponseParse, got {err:?}"
);
}
#[ test ]
fn t05_parse_response_expires_in_string_not_integer()
{
let body = r#"{"access_token":"sk-ant-abc","refresh_token":"sk-ant-ort01-xyz","expires_in":"bad"}"#;
let err = parse_response( body, 0 )
.expect_err( "T05: should fail on string expires_in" );
assert!(
matches!( err, AuthError::ResponseParse( _ ) ),
"T05: expected ResponseParse, got {err:?}"
);
}
#[ test ]
fn t06_auth_error_display_and_error_bound()
{
let transport = AuthError::HttpTransport( "timeout".to_string() );
let s = transport.to_string();
assert!( s.contains( "timeout" ), "T06: HttpTransport display missing 'timeout', got {s:?}" );
let parse_err = AuthError::ResponseParse( "expires_in".to_string() );
let s = parse_err.to_string();
assert!(
s.contains( "expires_in" ),
"T06: ResponseParse display missing field name, got {s:?}"
);
let rate = AuthError::RateLimited;
let s = rate.to_string();
assert!(
s.contains( "rate" ) || s.contains( "429" ),
"T06: RateLimited display must contain 'rate' or '429', got {s:?}"
);
fn assert_error< E : std::error::Error >() {}
assert_error::< AuthError >();
}