use super::{SearchContext, handle_get, handle_list, handle_search};
use crate::commands::output::{GetResponse, ListResponse, SearchResponse};
use crate::config::Config;
use crate::memory::crud::test_fake_embedder;
use crate::memory::{MemoryStore, SearchOptions};
use crate::sqlite::Database;
#[test]
fn test_get_json_response_includes_memory_type_and_status() {
let dir = tempfile::TempDir::new().expect("temp dir for issue 178 test");
let db_path = dir.path().join(format!("178_{}.db", uuid::Uuid::new_v4()));
let db = Database::open(&db_path).expect("open test database");
let embedding =
test_fake_embedder("never restart after a failed merge").expect("fake embedder");
let id = db
.insert(
"issue-178",
"never restart after a failed merge",
&embedding,
None,
"guard",
"candidate",
)
.expect("insert row");
let mut store = MemoryStore::from_db_with_test_embedder(db);
let exit = handle_get(&mut store, &id, "issue-178", true, false).expect("handle_get ok");
assert_eq!(exit, std::process::ExitCode::SUCCESS);
let memory = store.get(&id, "issue-178").unwrap().expect("memory found");
let response = GetResponse {
id: memory.id.clone(),
content: memory.content.clone(),
project_id: memory.project_id,
metadata: memory.metadata,
created_at: memory.created_at,
updated_at: memory.updated_at,
retrieval_count: memory.retrieval_count,
last_retrieved_at: memory.last_retrieved_at,
memory_type: memory.memory_type.clone(),
status: memory.status.clone(),
importance: memory.importance.clone(),
};
assert_eq!(memory.memory_type, "guard");
assert_eq!(memory.status, "candidate");
let json = serde_json::to_string_pretty(&response).expect("serialize get response");
assert!(
json.contains("\"memory_type\": \"guard\""),
"get JSON must carry memory_type: {json}"
);
assert!(
json.contains("\"status\": \"candidate\""),
"get JSON must carry status: {json}"
);
}
#[test]
fn test_search_list_json_response_includes_memory_type_and_status() {
let dir = tempfile::TempDir::new().expect("temp dir for issue 178 test");
let db_path = dir.path().join(format!("178_{}.db", uuid::Uuid::new_v4()));
let db = Database::open(&db_path).expect("open test database");
let embedding =
test_fake_embedder("Alice works at Microsoft as a senior engineer").expect("fake embedder");
let _ = db
.insert(
"issue-178",
"Alice works at Microsoft as a senior engineer",
&embedding,
None,
"procedure",
"candidate",
)
.expect("insert row");
let mut store = MemoryStore::from_db_with_test_embedder(db);
let exit =
handle_list(&mut store, "issue-178", 10, None, None, true, true).expect("handle_list ok");
assert_eq!(exit, std::process::ExitCode::SUCCESS);
let exit = handle_search(
&mut store,
"issue-178",
&SearchContext {
query: "senior engineer".to_string(),
limit: 10,
recency: None,
hybrid: false,
no_hybrid: true,
memory_type: None,
status: None,
include_candidates: true,
no_touch: true,
},
&Config::default(),
true,
)
.expect("handle_search ok");
assert_eq!(exit, std::process::ExitCode::SUCCESS);
let memories = store
.list("issue-178", 10, Some(&["procedure"]), Some(&["candidate"]))
.expect("list rows")
.into_iter()
.map(|m| crate::commands::output::ListItem {
id: m.id,
content: m.content,
created_at: m.created_at,
retrieval_count: m.retrieval_count,
last_retrieved_at: m.last_retrieved_at,
memory_type: m.memory_type,
status: m.status,
importance: m.importance,
})
.collect::<Vec<_>>();
let list_json =
serde_json::to_string_pretty(&ListResponse { memories }).expect("serialize list");
assert!(
list_json.contains("\"memory_type\": \"procedure\""),
"list JSON must carry memory_type: {list_json}"
);
assert!(
list_json.contains("\"status\": \"candidate\""),
"list JSON must carry status: {list_json}"
);
let results = store
.search(
"issue-178",
"senior engineer",
10,
0.0,
SearchOptions {
memory_types: Some(vec!["procedure"]),
statuses: Some(vec!["candidate"]),
},
)
.expect("search rows")
.into_iter()
.map(|m| crate::commands::output::SearchResultItem {
id: m.id,
content: m.content,
similarity: m.similarity.unwrap_or(0.0),
created_at: m.created_at,
retrieval_count: m.retrieval_count,
last_retrieved_at: m.last_retrieved_at,
memory_type: m.memory_type,
status: m.status,
importance: m.importance,
})
.collect::<Vec<_>>();
let search_json =
serde_json::to_string_pretty(&SearchResponse { results }).expect("serialize search");
assert!(
search_json.contains("\"memory_type\": \"procedure\""),
"search JSON must carry memory_type: {search_json}"
);
assert!(
search_json.contains("\"status\": \"candidate\""),
"search JSON must carry status: {search_json}"
);
}