This commit is contained in:
Brandon Thomas committed 2026-05-11 21:14:13 -04:00
1 parent e5a2d3176e
commit 7ad2fd255e
2 files changed
+180

No files matched your search

@@ -46,3 +46,54 @@ impl Display for ApiKeyDataError {
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::NamedTempFile;
use std::io::Write;
#[test]
fn load_trims_whitespace() {
let mut file = NamedTempFile::new().unwrap();
write!(file, " sk-abc123 \n").unwrap();
let data = ApiKeyData::load_from_file(file.path()).unwrap();
assert_eq!(data.as_str(), "sk-abc123");
}
#[test]
fn load_trims_newlines() {
let mut file = NamedTempFile::new().unwrap();
write!(file, "\nmy_secret_key\n\n").unwrap();
let data = ApiKeyData::load_from_file(file.path()).unwrap();
assert_eq!(data.as_str(), "my_secret_key");
}
#[test]
fn save_trims_whitespace() {
let file = NamedTempFile::new().unwrap();
let data = ApiKeyData::from_str(" sk-padded ");
data.save_to_file(file.path()).unwrap();
let contents = std::fs::read_to_string(file.path()).unwrap();
assert_eq!(contents, "sk-padded");
}
#[test]
fn round_trip() {
let file = NamedTempFile::new().unwrap();
let original = ApiKeyData::from_str("sk-round-trip-test-key");
original.save_to_file(file.path()).unwrap();
let loaded = ApiKeyData::load_from_file(file.path()).unwrap();
assert_eq!(loaded.as_str(), "sk-round-trip-test-key");
}
#[test]
fn load_nonexistent_file_returns_io_error() {
let result = ApiKeyData::load_from_file("/tmp/nonexistent_api_key_file_12345.txt");
assert!(result.is_err());
}
}
@@ -119,3 +119,132 @@ struct WebLoginDataSerializable {
#[serde(skip_serializing_if = "Option::is_none")]
updated_at: Option<DateTime<Utc>>,
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::NamedTempFile;
use std::io::Write;
#[test]
fn save_writes_version() {
let file = NamedTempFile::new().unwrap();
let data = WebLoginData::new();
data.save_to_file(file.path()).unwrap();
let contents = std::fs::read_to_string(file.path()).unwrap();
assert!(contents.contains("\"version\": 1"));
}
#[test]
fn load_reads_all_fields() {
let mut file = NamedTempFile::new().unwrap();
write!(file, r#"{{
"version": 1,
"cookies_header": "session=abc123; visitor=xyz",
"additional_headers": {{"Authorization": "Bearer tok"}},
"username": "testuser",
"email_address": "test@example.com",
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-05-10T12:00:00Z"
}}"#).unwrap();
let data = WebLoginData::load_from_file(file.path()).unwrap();
assert_eq!(data.cookies_header.as_deref(), Some("session=abc123; visitor=xyz"));
assert_eq!(data.username.as_deref(), Some("testuser"));
assert_eq!(data.email_address.as_deref(), Some("test@example.com"));
assert!(data.additional_headers.is_some());
let headers = data.additional_headers.unwrap();
assert_eq!(headers.get("Authorization").unwrap(), "Bearer tok");
assert!(data.created_at.is_some());
assert!(data.updated_at.is_some());
}
#[test]
fn load_tolerates_absent_optional_fields() {
let mut file = NamedTempFile::new().unwrap();
write!(file, r#"{{"version": 1}}"#).unwrap();
let data = WebLoginData::load_from_file(file.path()).unwrap();
assert!(data.cookies_header.is_none());
assert!(data.additional_headers.is_none());
assert!(data.username.is_none());
assert!(data.email_address.is_none());
assert!(data.created_at.is_none());
assert!(data.updated_at.is_none());
}
#[test]
fn load_tolerates_null_fields() {
let mut file = NamedTempFile::new().unwrap();
write!(file, r#"{{
"version": 1,
"cookies_header": null,
"username": null,
"email_address": null
}}"#).unwrap();
let data = WebLoginData::load_from_file(file.path()).unwrap();
assert!(data.cookies_header.is_none());
assert!(data.username.is_none());
assert!(data.email_address.is_none());
}
#[test]
fn load_invalid_json_returns_error() {
let mut file = NamedTempFile::new().unwrap();
write!(file, "not valid json at all").unwrap();
let result = WebLoginData::load_from_file(file.path());
assert!(result.is_err());
}
#[test]
fn load_nonexistent_file_returns_io_error() {
let result = WebLoginData::load_from_file("/tmp/nonexistent_web_login_12345.json");
assert!(result.is_err());
}
#[test]
fn round_trip_full() {
let file = NamedTempFile::new().unwrap();
let mut headers = HashMap::new();
headers.insert("X-Custom".to_string(), "value".to_string());
let now = Utc::now();
let original = WebLoginData {
cookies_header: Some("session=roundtrip".to_string()),
additional_headers: Some(headers),
username: Some("round_trip_user".to_string()),
email_address: Some("rt@example.com".to_string()),
created_at: Some(now),
updated_at: Some(now),
};
original.save_to_file(file.path()).unwrap();
let loaded = WebLoginData::load_from_file(file.path()).unwrap();
assert_eq!(loaded.cookies_header.as_deref(), Some("session=roundtrip"));
assert_eq!(loaded.username.as_deref(), Some("round_trip_user"));
assert_eq!(loaded.email_address.as_deref(), Some("rt@example.com"));
assert_eq!(loaded.additional_headers.as_ref().unwrap().get("X-Custom").unwrap(), "value");
assert!(loaded.created_at.is_some());
assert!(loaded.updated_at.is_some());
}
#[test]
fn round_trip_minimal() {
let file = NamedTempFile::new().unwrap();
let original = WebLoginData::new();
original.save_to_file(file.path()).unwrap();
let loaded = WebLoginData::load_from_file(file.path()).unwrap();
assert!(loaded.cookies_header.is_none());
assert!(loaded.additional_headers.is_none());
assert!(loaded.username.is_none());
assert!(loaded.email_address.is_none());
}
}