Skip to main content

llm_optimizer_api_tests/
helpers.rs

1//! Test helper functions
2
3use jsonwebtoken::{decode, encode, DecodingKey, EncodingKey, Header, Validation};
4use serde::{Deserialize, Serialize};
5use std::time::{SystemTime, UNIX_EPOCH};
6
7use crate::fixtures::{MockUser, MOCK_JWT_SECRET};
8
9/// JWT Claims for testing
10#[derive(Debug, Serialize, Deserialize)]
11pub struct Claims {
12    pub sub: String,
13    pub exp: usize,
14    pub role: String,
15}
16
17/// Generate a test JWT token
18pub fn generate_test_jwt(user: &MockUser, expires_in_secs: u64) -> Result<String, jsonwebtoken::errors::Error> {
19    let expiration = SystemTime::now()
20        .duration_since(UNIX_EPOCH)
21        .unwrap()
22        .as_secs() + expires_in_secs;
23
24    let claims = Claims {
25        sub: user.id.to_string(),
26        exp: expiration as usize,
27        role: format!("{:?}", user.role),
28    };
29
30    encode(
31        &Header::default(),
32        &claims,
33        &EncodingKey::from_secret(MOCK_JWT_SECRET.as_bytes()),
34    )
35}
36
37/// Verify a test JWT token
38pub fn verify_test_jwt(token: &str) -> Result<Claims, jsonwebtoken::errors::Error> {
39    let validation = Validation::default();
40    let token_data = decode::<Claims>(
41        token,
42        &DecodingKey::from_secret(MOCK_JWT_SECRET.as_bytes()),
43        &validation,
44    )?;
45    Ok(token_data.claims)
46}
47
48/// Generate a random API key
49pub fn generate_api_key() -> String {
50    use rand::Rng;
51    let mut rng = rand::thread_rng();
52    let bytes: Vec<u8> = (0..32).map(|_| rng.gen()).collect();
53    hex::encode(bytes)
54}
55
56/// HTTP client builder for tests
57pub fn build_test_client() -> reqwest::Client {
58    reqwest::Client::builder()
59        .timeout(std::time::Duration::from_secs(30))
60        .build()
61        .expect("Failed to build HTTP client")
62}
63
64/// Create authorization header with Bearer token
65pub fn bearer_auth_header(token: &str) -> (&'static str, String) {
66    ("Authorization", format!("Bearer {}", token))
67}
68
69/// Create authorization header with API key
70pub fn api_key_auth_header(api_key: &str) -> (&'static str, String) {
71    ("X-API-Key", api_key.to_string())
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use crate::fixtures::MockUser;
78
79    #[test]
80    fn test_generate_and_verify_jwt() {
81        let user = MockUser::admin();
82        let token = generate_test_jwt(&user, 3600).unwrap();
83        let claims = verify_test_jwt(&token).unwrap();
84        assert_eq!(claims.sub, user.id.to_string());
85    }
86
87    #[test]
88    fn test_generate_api_key() {
89        let key = generate_api_key();
90        assert_eq!(key.len(), 64); // 32 bytes = 64 hex characters
91    }
92
93    #[test]
94    fn test_bearer_auth_header() {
95        let (name, value) = bearer_auth_header("token123");
96        assert_eq!(name, "Authorization");
97        assert_eq!(value, "Bearer token123");
98    }
99
100    #[test]
101    fn test_api_key_auth_header() {
102        let (name, value) = api_key_auth_header("key123");
103        assert_eq!(name, "X-API-Key");
104        assert_eq!(value, "key123");
105    }
106}