#[cfg(test)]
mod tests {
use crate::jwk::provider::JwkProvider;
use crate::jwk::registry::{JwkProviderRegistry, RegistryError};
use mockito::Server;
use std::time::Duration;
#[test]
fn test_registry_new() {
let registry = JwkProviderRegistry::new();
assert_eq!(registry.count(), 0);
}
#[test]
fn test_registry_register() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
let result = registry.register("test-id", provider);
assert!(result.is_ok());
assert_eq!(registry.count(), 1);
assert!(registry.contains("test-id"));
let server2 = Server::new();
let provider2 = JwkProvider::new_with_base_url(
&server2.url(),
"test-issuer-2",
Duration::from_secs(3600),
)
.expect("Failed to create JwkProvider");
let result = registry.register("test-id", provider2);
assert!(result.is_err());
if let Err(RegistryError::ProviderAlreadyExists(id)) = result {
assert_eq!(id, "test-id");
} else {
panic!("Expected ProviderAlreadyExists error");
}
}
#[test]
fn test_registry_register_new() {
let registry = JwkProviderRegistry::new();
let result = registry.register_new(
"test-id",
"us-east-1",
"us-east-1_example",
Duration::from_secs(3600),
);
assert!(result.is_ok());
assert_eq!(registry.count(), 1);
assert!(registry.contains("test-id"));
}
#[test]
fn test_registry_get() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let result = registry.get("test-id");
assert!(result.is_ok());
let result = registry.get("non-existent");
assert!(result.is_err());
if let Err(RegistryError::ProviderNotFound(id)) = result {
assert_eq!(id, "non-existent");
} else {
panic!("Expected ProviderNotFound error");
}
}
#[test]
fn test_registry_get_by_issuer() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let result = registry.get_by_issuer("test-issuer");
assert!(result.is_ok());
let result = registry.get_by_issuer("non-existent");
assert!(result.is_err());
if let Err(RegistryError::IssuerNotFound(issuer)) = result {
assert_eq!(issuer, "non-existent");
} else {
panic!("Expected IssuerNotFound error");
}
}
#[test]
fn test_registry_find_provider_id_by_issuer() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let result = registry.find_provider_id_by_issuer("test-issuer");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "test-id");
let result = registry.find_provider_id_by_issuer("non-existent");
assert!(result.is_err());
if let Err(RegistryError::IssuerNotFound(issuer)) = result {
assert_eq!(issuer, "non-existent");
} else {
panic!("Expected IssuerNotFound error");
}
}
#[test]
fn test_registry_remove() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let result = registry.remove("test-id");
assert!(result.is_ok());
assert_eq!(registry.count(), 0);
assert!(!registry.contains("test-id"));
let result = registry.remove("non-existent");
assert!(result.is_err());
if let Err(RegistryError::ProviderNotFound(id)) = result {
assert_eq!(id, "non-existent");
} else {
panic!("Expected ProviderNotFound error");
}
}
#[test]
fn test_registry_list_ids() {
let registry = JwkProviderRegistry::new();
let server1 = Server::new();
let server2 = Server::new();
let provider1 = JwkProvider::new_with_base_url(
&server1.url(),
"test-issuer-1",
Duration::from_secs(3600),
)
.expect("Failed to create JwkProvider");
let provider2 = JwkProvider::new_with_base_url(
&server2.url(),
"test-issuer-2",
Duration::from_secs(3600),
)
.expect("Failed to create JwkProvider");
registry
.register("test-id-1", provider1)
.expect("Failed to register provider");
registry
.register("test-id-2", provider2)
.expect("Failed to register provider");
let ids = registry.list_ids();
assert_eq!(ids.len(), 2);
assert!(ids.contains(&"test-id-1".to_string()));
assert!(ids.contains(&"test-id-2".to_string()));
}
#[test]
fn test_registry_create_validation_for_issuer() {
let registry = JwkProviderRegistry::new();
let server = Server::new();
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let result = registry.create_validation_for_issuer(
"test-issuer",
Duration::from_secs(60),
&vec!["test-client-id".to_string()],
);
assert!(result.is_ok());
let validation = result.unwrap();
assert!(validation.validate_exp);
assert!(validation.validate_nbf);
assert_eq!(validation.leeway, 60);
let iss_vec = validation.iss.as_ref().expect("Expected issuer to be set");
assert_eq!(iss_vec.len(), 1);
assert!(iss_vec.contains(&"test-issuer".to_string()));
let result = registry.create_validation_for_issuer(
"non-existent",
Duration::from_secs(60),
&vec!["test-client-id".to_string()],
);
assert!(result.is_err());
if let Err(RegistryError::IssuerNotFound(issuer)) = result {
assert_eq!(issuer, "non-existent");
} else {
panic!("Expected IssuerNotFound error");
}
}
#[tokio::test]
async fn test_registry_prefetch() {
let registry = JwkProviderRegistry::new();
let server = Server::new_async().await;
let provider =
JwkProvider::new_with_base_url(&server.url(), "test-issuer", Duration::from_secs(3600))
.expect("Failed to create JwkProvider");
registry
.register("test-id", provider)
.expect("Failed to register provider");
let _result = registry.prefetch("test-id").await;
let result = registry.prefetch("non-existent").await;
assert!(result.is_err());
if let Err(RegistryError::ProviderNotFound(id)) = result {
assert_eq!(id, "non-existent");
} else {
panic!("Expected ProviderNotFound error");
}
}
#[tokio::test]
async fn test_registry_prefetch_all() {
let registry = JwkProviderRegistry::new();
let (server1, server2) = tokio::join!(Server::new_async(), Server::new_async());
let provider1 = JwkProvider::new_with_base_url(
&server1.url(),
"test-issuer-1",
Duration::from_secs(3600),
)
.expect("Failed to create JwkProvider");
let provider2 = JwkProvider::new_with_base_url(
&server2.url(),
"test-issuer-2",
Duration::from_secs(3600),
)
.expect("Failed to create JwkProvider");
registry
.register("test-id-1", provider1)
.expect("Failed to register provider");
registry
.register("test-id-2", provider2)
.expect("Failed to register provider");
let results = registry.hydrate().await;
assert_eq!(results.len(), 2);
let ids: Vec<String> = results.iter().map(|(id, _)| id.clone()).collect();
assert!(ids.contains(&"test-id-1".to_string()));
assert!(ids.contains(&"test-id-2".to_string()));
}
}