From a95f92fe71b75634238b4aabcd4fee0bdcbb5ed5 Mon Sep 17 00:00:00 2001 From: adlee-was-taken Date: Sun, 19 Apr 2026 13:11:08 -0400 Subject: [PATCH] test(core): exhaustive round-trip for all seven ItemCore variants Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/idfoto-core/src/item_types/mod.rs | 52 ++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/crates/idfoto-core/src/item_types/mod.rs b/crates/idfoto-core/src/item_types/mod.rs index f8a6e22..6f3452e 100644 --- a/crates/idfoto-core/src/item_types/mod.rs +++ b/crates/idfoto-core/src/item_types/mod.rs @@ -73,4 +73,56 @@ mod tests { let json = serde_json::to_string(&ItemType::SecureNote).unwrap(); assert_eq!(json, "\"secure_note\""); } + + #[test] + fn item_core_login_round_trip_via_tag() { + use zeroize::Zeroizing; + let core = ItemCore::Login(LoginCore { + username: Some("alice".into()), + password: Some(Zeroizing::new("hunter2".into())), + url: None, + totp: None, + }); + let json = serde_json::to_string(&core).unwrap(); + // Tag-based: outer object has "type": "login" + assert!(json.contains("\"type\":\"login\"")); + let parsed: ItemCore = serde_json::from_str(&json).unwrap(); + assert_eq!(parsed.item_type(), ItemType::Login); + } + + #[test] + fn item_core_secure_note_round_trip_via_tag() { + use zeroize::Zeroizing; + let core = ItemCore::SecureNote(SecureNoteCore { body: Zeroizing::new("hello".into()) }); + let json = serde_json::to_string(&core).unwrap(); + assert!(json.contains("\"type\":\"secure_note\"")); + let parsed: ItemCore = serde_json::from_str(&json).unwrap(); + assert_eq!(parsed.item_type(), ItemType::SecureNote); + } + + #[test] + fn item_core_round_trips_for_all_seven_types() { + use zeroize::Zeroizing; + use crate::ids::AttachmentId; + + let cores = vec![ + ItemCore::Login(LoginCore::default()), + ItemCore::SecureNote(SecureNoteCore::default()), + ItemCore::Identity(IdentityCore::default()), + ItemCore::Card(CardCore::default()), + ItemCore::Key(KeyCore::default()), + ItemCore::Document(DocumentCore { + filename: "x".into(), + mime_type: "text/plain".into(), + primary_attachment: AttachmentId("0123456789abcdef".into()), + }), + ItemCore::Totp(TotpCore::default()), + ]; + for core in cores { + let expected_type = core.item_type(); + let json = serde_json::to_string(&core).unwrap(); + let parsed: ItemCore = serde_json::from_str(&json).expect("round-trip failed"); + assert_eq!(parsed.item_type(), expected_type); + } + } }