use super::*;
#[test]
fn test_generate_page_session_token() {
let csrf_token = "test_csrf_token";
let page_token = generate_page_session_token(csrf_token);
assert!(!page_token.is_empty());
let page_token2 = generate_page_session_token(csrf_token);
assert_eq!(page_token, page_token2);
let different_token = generate_page_session_token("different_token");
assert_ne!(page_token, different_token);
}
#[test]
fn test_generate_page_session_token_hmac_properties() {
let token1 = "token1";
let token2 = "token2";
let page_token1 = generate_page_session_token(token1);
let page_token2 = generate_page_session_token(token2);
assert_ne!(page_token1, page_token2);
assert!(!page_token1.contains('+'));
assert!(!page_token1.contains('/'));
assert!(!page_token1.contains('='));
assert!(!page_token2.contains('+'));
assert!(!page_token2.contains('/'));
assert!(!page_token2.contains('='));
}
#[test]
fn test_generate_page_session_token_with_empty_string() {
let empty_token = "";
let page_token = generate_page_session_token(empty_token);
assert!(!page_token.is_empty());
}
fn create_test_session(csrf_token: &str) -> serde_json::Value {
use chrono::Utc;
serde_json::json!({
"user_id": "test_user",
"csrf_token": csrf_token,
"expires_at": Utc::now().to_rfc3339(),
"ttl": 3600_u64,
})
}
fn get_session_cookie_name() -> &'static str {
"__Host-SessionId" }
#[tokio::test]
async fn test_verify_page_session_token_success() {
use crate::storage::CacheData;
use crate::test_utils::init_test_environment;
use http::HeaderMap;
use http::header::{COOKIE, HeaderValue};
init_test_environment().await;
let session_id = "test_session_123";
let csrf_token = "test_csrf_token_456";
let session_json = create_test_session(csrf_token);
let cache_data = CacheData {
value: session_json.to_string(),
};
let cache_prefix = CachePrefix::new("session".to_string()).unwrap();
let cache_key = CacheKey::new(session_id.to_string()).unwrap();
GENERIC_CACHE_STORE
.lock()
.await
.put_with_ttl(cache_prefix, cache_key, cache_data, 3600)
.await
.unwrap();
let mut headers = HeaderMap::new();
headers.insert(
COOKIE,
HeaderValue::from_str(&format!("{}={}", get_session_cookie_name(), session_id)).unwrap(),
);
let page_token = generate_page_session_token(csrf_token);
let result = verify_page_session_token(&headers, Some(&page_token)).await;
assert!(result.is_ok());
}
#[tokio::test]
async fn test_verify_page_session_token_invalid_token() {
use crate::storage::CacheData;
use crate::test_utils::init_test_environment;
use http::HeaderMap;
use http::header::{COOKIE, HeaderValue};
init_test_environment().await;
let session_id = "test_session_789";
let csrf_token = "actual_csrf_token";
let session_json = create_test_session(csrf_token);
let cache_data = CacheData {
value: session_json.to_string(),
};
let cache_prefix = CachePrefix::new("session".to_string()).unwrap();
let cache_key = CacheKey::new(session_id.to_string()).unwrap();
GENERIC_CACHE_STORE
.lock()
.await
.put_with_ttl(cache_prefix, cache_key, cache_data, 3600)
.await
.unwrap();
let mut headers = HeaderMap::new();
headers.insert(
COOKIE,
HeaderValue::from_str(&format!("{}={}", get_session_cookie_name(), session_id)).unwrap(),
);
let invalid_token = "invalid_token".to_string();
let result = verify_page_session_token(&headers, Some(&invalid_token)).await;
assert!(result.is_err());
if let Err(SessionError::PageSessionToken(msg)) = result {
assert!(msg.contains("does not match"));
} else {
panic!("Expected PageSessionToken error");
}
}
#[tokio::test]
async fn test_verify_page_session_token_missing_token() {
use crate::storage::CacheData;
use crate::test_utils::init_test_environment;
use http::HeaderMap;
use http::header::{COOKIE, HeaderValue};
init_test_environment().await;
let session_id = "test_session_012";
let csrf_token = "csrf_token_exists";
let session_json = create_test_session(csrf_token);
let cache_data = CacheData {
value: session_json.to_string(),
};
let cache_prefix = CachePrefix::new("session".to_string()).unwrap();
let cache_key = CacheKey::new(session_id.to_string()).unwrap();
GENERIC_CACHE_STORE
.lock()
.await
.put_with_ttl(cache_prefix, cache_key, cache_data, 3600)
.await
.unwrap();
let mut headers = HeaderMap::new();
headers.insert(
COOKIE,
HeaderValue::from_str(&format!("{}={}", get_session_cookie_name(), session_id)).unwrap(),
);
let result = verify_page_session_token(&headers, None).await;
assert!(result.is_err());
if let Err(SessionError::PageSessionToken(msg)) = result {
assert!(msg.contains("missing"));
} else {
panic!("Expected PageSessionToken error");
}
}
#[tokio::test]
async fn test_verify_page_session_token_missing_session() {
use crate::test_utils::init_test_environment;
use http::HeaderMap;
init_test_environment().await;
let headers = HeaderMap::new();
let page_token = "some_token".to_string();
let result = verify_page_session_token(&headers, Some(&page_token)).await;
assert!(result.is_err());
if let Err(SessionError::PageSessionToken(msg)) = result {
assert!(msg.contains("Session ID missing"));
} else {
panic!("Expected PageSessionToken error");
}
}