From 7ad2fd255e2e53e44f43ec7292d704df583e4ce0 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 10 May 2026 10:25:20 -0400 Subject: [PATCH] tests --- .../src/core/providers/payload/api_key.rs | 51 +++++++ .../src/core/providers/payload/web_login.rs | 129 ++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/crates/desktop/artcraft/src/core/providers/payload/api_key.rs b/crates/desktop/artcraft/src/core/providers/payload/api_key.rs index cba9e2b976..e09756b11a 100644 --- a/crates/desktop/artcraft/src/core/providers/payload/api_key.rs +++ b/crates/desktop/artcraft/src/core/providers/payload/api_key.rs @@ -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()); + } +} diff --git a/crates/desktop/artcraft/src/core/providers/payload/web_login.rs b/crates/desktop/artcraft/src/core/providers/payload/web_login.rs index b4f44e6bb9..d3ada891f4 100644 --- a/crates/desktop/artcraft/src/core/providers/payload/web_login.rs +++ b/crates/desktop/artcraft/src/core/providers/payload/web_login.rs @@ -119,3 +119,132 @@ struct WebLoginDataSerializable { #[serde(skip_serializing_if = "Option::is_none")] updated_at: Option>, } + +#[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()); + } +}