use crate::{claims, jwks};
pub use serde_json::json;
pub use std::time::{SystemTime, UNIX_EPOCH};
pub use wiremock::{Mock, MockServer, ResponseTemplate};
pub const TEST_USER_ID: &str = "550e8400-e29b-41d4-a716-446655440000";
pub const TEST_EMAIL: &str = "test@example.com";
pub const TEST_PHONE: &str = "+1234567890";
pub const TEST_SESSION_ID: &str = "test-session-id";
pub const TEST_ISSUER: &str = "https://test.supabase.co/auth/v1";
pub const TEST_KID: &str = "test-key-id";
pub const TEST_JWKS_URL: &str = "https://test.supabase.co/auth/v1/jwks";
pub fn create_test_claims() -> claims::Claims {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs() as usize;
claims::Claims {
sub: TEST_USER_ID.to_string(),
exp: now + 3600, iat: Some(now),
jti: Some("test-jti".to_string()),
email: Some(TEST_EMAIL.to_string()),
phone: Some(TEST_PHONE.to_string()),
role: Some("authenticated".to_string()),
app_metadata: Some(json!({"provider": "email"})),
user_metadata: Some(json!({"name": "Test User"})),
aud: Some("authenticated".to_string()),
iss: Some(TEST_ISSUER.to_string()),
aal: Some("aal1".to_string()),
amr: Some(vec![json!({"method": "password"})]),
session_id: Some(TEST_SESSION_ID.to_string()),
is_anonymous: Some(false),
kid: Some(TEST_KID.to_string()),
}
}
pub fn create_minimal_claims() -> claims::Claims {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs() as usize;
claims::Claims {
sub: TEST_USER_ID.to_string(),
exp: now + 3600,
iat: None,
jti: None,
email: None,
phone: None,
role: None,
app_metadata: None,
user_metadata: None,
aud: None,
iss: None,
aal: None,
amr: None,
session_id: None,
is_anonymous: None,
kid: None,
}
}
pub fn create_test_jwk() -> jwks::Jwk {
jwks::Jwk {
kid: TEST_KID.to_string(),
kty: "EC".to_string(),
alg: Some("ES256".to_string()),
key_use: Some("sig".to_string()),
key_ops: Some(vec!["verify".to_string()]),
crv: Some("P-256".to_string()),
x: Some("ykCi3ZomyYBFS21ZKk6ajc56O1SUFzhCNp0ziDYd6mw".to_string()),
y: Some("okXySUHOrPVxWBr0HlCw4yWY_TMq8EyhKhTugGoRCQU".to_string()),
n: None,
e: None,
ext: Some(true),
}
}
pub fn create_test_jwks_response() -> jwks::JwksResponse {
jwks::JwksResponse {
keys: vec![create_test_jwk()],
}
}
pub fn create_empty_jwks_response() -> jwks::JwksResponse {
jwks::JwksResponse { keys: vec![] }
}
pub fn create_mock_jwt_token() -> String {
let header = "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6InRlc3Qta2V5LWlkIn0";
let payload = "eyJzdWIiOiI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDAiLCJhdWQiOiJhdXRoZW50aWNhdGVkIiwicm9sZSI6ImF1dGhlbnRpY2F0ZWQiLCJlbWFpbCI6InRlc3RAZXhhbXBsZS5jb20iLCJpc3MiOiJodHRwczovL3Rlc3Quc3VwYWJhc2UuY28vYXV0aC92MSIsImlhdCI6MTY0MDk5NTIwMCwiZXhwIjo5OTk5OTk5OTk5fQ";
let signature = "MOCK_SIGNATURE_FOR_TESTING_ONLY_NOT_VALID";
format!("{header}.{payload}.{signature}")
}
pub async fn create_mock_jwks_server() -> MockServer {
let mock_server = MockServer::start().await;
let jwks_response = create_test_jwks_response();
Mock::given(wiremock::matchers::method("GET"))
.and(wiremock::matchers::path("/jwks"))
.respond_with(ResponseTemplate::new(200).set_body_json(&jwks_response))
.mount(&mock_server)
.await;
mock_server
}
pub async fn create_error_mock_jwks_server() -> MockServer {
let mock_server = MockServer::start().await;
Mock::given(wiremock::matchers::method("GET"))
.and(wiremock::matchers::path("/jwks"))
.respond_with(ResponseTemplate::new(500))
.mount(&mock_server)
.await;
mock_server
}