use std::collections::HashMap;
use crab_vault_auth::{
error::AuthError, Jwt, JwtEncoder,
};
use jsonwebtoken::{Algorithm, EncodingKey, Header};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
struct TestPayload {
message: String,
}
#[test]
fn encode_success_with_kid() {
let mut map: HashMap<String, EncodingKey> = HashMap::new();
map.insert("kid1".to_string(), EncodingKey::from_secret(b"my-secret"));
let encoder = JwtEncoder::new(map);
let payload = TestPayload {
message: "hello".into(),
};
let claims = Jwt::new("issuer-1", &["aud1"], payload);
let mut header = Header::new(Algorithm::HS256);
header.kid = Some("kid1".into());
let token_res = encoder.encode(&header, &claims, "kid1");
assert!(token_res.is_ok(), "expected encoding to succeed: {:?}", token_res);
let token = token_res.unwrap();
assert!(!token.is_empty());
assert_eq!(token.split('.').count(), 3);
}
#[test]
fn encode_error_when_kid_missing_in_encoder() {
let map: HashMap<String, EncodingKey> = HashMap::new();
let encoder = JwtEncoder::new(map);
let payload = TestPayload {
message: "no-kid".into(),
};
let claims = Jwt::new("iss", &["aud"], payload);
let mut header = Header::new(Algorithm::HS256);
header.kid = Some("nonexistent".into());
let token_res = encoder.encode(&header, &claims, "nonexistent");
assert!(
matches!(token_res, Err(AuthError::InternalError(_))),
"expected InternalError when kid not found, got: {:?}",
token_res
);
}
#[test]
fn encode_error_when_header_alg_mismatch_key() {
let mut map: HashMap<String, EncodingKey> = HashMap::new();
map.insert("kid-hmac".to_string(), EncodingKey::from_secret(b"hmac-secret"));
let encoder = JwtEncoder::new(map);
let payload = TestPayload {
message: "alg-mismatch".into(),
};
let claims = Jwt::new("iss", &["aud"], payload);
let mut header = Header::new(Algorithm::RS256);
header.kid = Some("kid-hmac".into());
let token_res = encoder.encode(&header, &claims, "kid-hmac");
assert!(
token_res.is_err(),
"expected error when header alg doesn't match key type"
);
assert!(
matches!(token_res, Err(AuthError::InternalError(_))),
"expected InternalError on alg mismatch, got: {:?}",
token_res
);
}