feat(search): search_objects returns highlighted hits + estimated total

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-04 10:46:54 +02:00
parent 38e4525404
commit 84c4c2807b
3 changed files with 169 additions and 1 deletions
+50 -1
View File
@@ -1,4 +1,4 @@
use search::{SearchClient, SearchDocument};
use search::{self, SearchClient, SearchDocument};
fn meili() -> (String, String) {
(
@@ -51,6 +51,55 @@ async fn index_search_and_remove() {
assert!(client.search("wood").await.unwrap().is_empty());
}
#[tokio::test]
async fn search_objects_returns_hits_with_highlight_filter_and_paging() {
let (url, key) = meili();
let client = SearchClient::connect(&url, &key, &unique_index()).unwrap();
client.ensure_index().await.unwrap();
let a = domain::ObjectId::new();
let b = domain::ObjectId::new();
let c = domain::ObjectId::new();
let mut bronze_a = doc(
&a.to_string(),
"Bronze figurine",
&["cast bronze with green patina"],
);
bronze_a.visibility = "public".to_string();
let mut bronze_b = doc(&b.to_string(), "Ceremonial bowl", &["bronze alloy rim"]);
bronze_b.visibility = "public".to_string();
let mut bronze_c = doc(&c.to_string(), "Door fitting", &["bronze hinge"]);
bronze_c.visibility = "draft".to_string();
client.index_object(&bronze_a).await.unwrap();
client.index_object(&bronze_b).await.unwrap();
client.index_object(&bronze_c).await.unwrap();
let results = client.search_objects("bronze", None, 0, 20).await.unwrap();
assert_eq!(results.estimated_total, 3);
assert_eq!(results.hits.len(), 3);
let hit = results.hits.iter().find(|h| h.id == a.to_string()).unwrap();
assert_eq!(hit.object_name, "Bronze figurine");
assert_eq!(hit.object_number, format!("N-{a}"));
let snippet = hit.snippet.as_ref().expect("a matched snippet");
assert!(
snippet.contains(search::HL_PRE),
"snippet must mark the match"
);
assert!(snippet.contains(search::HL_POST));
let public = client
.search_objects("bronze", Some("public"), 0, 20)
.await
.unwrap();
assert_eq!(public.estimated_total, 2);
assert!(public.hits.iter().all(|h| h.visibility == "public"));
let page = client.search_objects("bronze", None, 0, 1).await.unwrap();
assert_eq!(page.hits.len(), 1);
assert_eq!(page.estimated_total, 3);
}
#[tokio::test]
async fn ensure_index_is_idempotent() {
let (url, key) = meili();