use trusty_common::memory_core::retrieval::RecallResult;
use uuid::Uuid;
use crate::service::{drawer_content_preview, recall_entry_json, DRAWER_PREVIEW_MAX_CHARS};
#[test]
fn drawer_preview_collapses_whitespace_and_truncates() {
assert_eq!(drawer_content_preview("hello world"), "hello world");
assert_eq!(
drawer_content_preview("first line\n\nsecond\tline third"),
"first line second line third"
);
assert_eq!(drawer_content_preview(" padded "), "padded");
assert_eq!(drawer_content_preview(""), "");
let long = "x".repeat(DRAWER_PREVIEW_MAX_CHARS + 50);
let preview = drawer_content_preview(&long);
assert_eq!(preview.chars().count(), DRAWER_PREVIEW_MAX_CHARS);
assert!(preview.ends_with('…'));
let exact = "y".repeat(DRAWER_PREVIEW_MAX_CHARS);
assert_eq!(drawer_content_preview(&exact), exact);
}
#[test]
fn recall_entry_json_hoists_drawer_fields() {
use trusty_common::memory_core::Drawer;
let room = Uuid::new_v4();
let mut drawer = Drawer::new(room, "the answer is 42");
drawer.tags = vec!["source:kuzu".to_string()];
drawer.importance = 0.7;
let entry = recall_entry_json(RecallResult {
drawer,
score: 0.699,
layer: 1,
});
assert_eq!(
entry.get("content").and_then(|v| v.as_str()),
Some("the answer is 42"),
"content must be at the top level, got {entry:?}"
);
assert!(
entry.get("drawer").is_none(),
"the legacy `drawer` wrapper must not be present, got {entry:?}"
);
assert_eq!(
entry["importance"].as_f64().map(|f| (f * 10.0).round()),
Some(7.0)
);
assert_eq!(
entry["tags"][0].as_str(),
Some("source:kuzu"),
"tags must be hoisted, got {entry:?}"
);
assert_eq!(entry["layer"].as_u64(), Some(1));
assert!(
entry["score"]
.as_f64()
.is_some_and(|s| (s - 0.699).abs() < 1e-6),
"score must be preserved, got {entry:?}"
);
}