use base64::{Engine as _, engine::general_purpose};
use tower_sessions::cookie::Key;
pub struct SessionKey {
key: Vec<u8>,
}
impl SessionKey {
pub fn new() -> Self {
let key = Key::generate().master().to_vec();
Self { key }
}
pub fn as_bytes(&self) -> &[u8] {
&self.key
}
pub fn print_encoded(&self) {
println!("{:?}", general_purpose::STANDARD.encode(&self.key));
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_session_key_new() {
let session_key = SessionKey::new();
assert_eq!(session_key.key.len(), 64);
}
#[test]
fn test_session_key_as_bytes() {
let session_key = SessionKey::new();
let bytes = session_key.as_bytes();
assert_eq!(bytes.len(), 64);
assert_eq!(bytes, session_key.key.as_slice());
}
#[test]
fn test_session_key_uniqueness() {
let key1 = SessionKey::new();
let key2 = SessionKey::new();
assert_ne!(key1.as_bytes(), key2.as_bytes());
}
#[test]
fn test_encoded_key_is_valid_base64() {
let session_key = SessionKey::new();
let encoded = general_purpose::STANDARD.encode(&session_key.key);
let decoded = general_purpose::STANDARD.decode(&encoded).unwrap();
assert_eq!(decoded, session_key.key);
}
#[test]
fn test_encoded_key_length() {
let session_key = SessionKey::new();
let encoded = general_purpose::STANDARD.encode(&session_key.key);
assert_eq!(encoded.len(), 88);
}
#[test]
fn test_multiple_keys_produce_different_encodings() {
let key1 = SessionKey::new();
let key2 = SessionKey::new();
let encoded1 = general_purpose::STANDARD.encode(&key1.key);
let encoded2 = general_purpose::STANDARD.encode(&key2.key);
assert_ne!(encoded1, encoded2);
}
}