mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-04 01:18:34 +00:00
tests
This commit is contained in:
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());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user