llm_optimizer_api_tests/
helpers.rs1use 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#[derive(Debug, Serialize, Deserialize)]
11pub struct Claims {
12 pub sub: String,
13 pub exp: usize,
14 pub role: String,
15}
16
17pub 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
37pub 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
48pub 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
56pub 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
64pub fn bearer_auth_header(token: &str) -> (&'static str, String) {
66 ("Authorization", format!("Bearer {}", token))
67}
68
69pub 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); }
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}