diff --git a/meilisearch/tests/search/distinct.rs b/meilisearch/tests/search/distinct.rs new file mode 100644 index 000000000..068bd12b1 --- /dev/null +++ b/meilisearch/tests/search/distinct.rs @@ -0,0 +1,63 @@ +use meili_snap::snapshot; +use once_cell::sync::Lazy; +use serde_json::{json, Value}; + +use crate::common::Server; + +pub(self) static DOCUMENTS: Lazy = Lazy::new(|| { + json!([ + {"productId": 1, "shopId": 1}, + {"productId": 2, "shopId": 1}, + {"productId": 3, "shopId": 2}, + {"productId": 4, "shopId": 2}, + {"productId": 5, "shopId": 3}, + {"productId": 6, "shopId": 3}, + {"productId": 7, "shopId": 4}, + {"productId": 8, "shopId": 4}, + {"productId": 9, "shopId": 5}, + {"productId": 10, "shopId": 5} + ]) +}); + +pub(self) static DOCUMENT_PRIMARY_KEY: &str = "productId"; +pub(self) static DOCUMENT_DISTINCT_KEY: &str = "shopId"; + +/// testing: https://github.com/meilisearch/meilisearch/issues/4078 +#[actix_rt::test] +async fn distinct_search_with_offset_no_ranking() { + let server = Server::new().await; + let index = server.index("test"); + + let documents = DOCUMENTS.clone(); + index.add_documents(documents, Some(DOCUMENT_PRIMARY_KEY)).await; + index.update_distinct_attribute(json!(DOCUMENT_DISTINCT_KEY)).await; + index.wait_task(1).await; + + fn get_hits(response: Value) -> Vec { + let hits_array = response["hits"].as_array().unwrap(); + hits_array.iter().map(|h| h[DOCUMENT_DISTINCT_KEY].as_i64().unwrap()).collect::>() + } + + let (response, code) = index.search_post(json!({"limit": 2, "offset": 0})).await; + let hits = get_hits(response); + snapshot!(code, @"200 OK"); + snapshot!(hits.len(), @"2"); + snapshot!(format!("{:?}", hits), @"[1, 2]"); + + let (response, code) = index.search_post(json!({"limit": 2, "offset": 2})).await; + let hits = get_hits(response); + snapshot!(code, @"200 OK"); + snapshot!(hits.len(), @"2"); + snapshot!(format!("{:?}", hits), @"[3, 4]"); + + let (response, code) = index.search_post(json!({"limit": 10, "offset": 4})).await; + let hits = get_hits(response); + snapshot!(code, @"200 OK"); + snapshot!(hits.len(), @"1"); + snapshot!(format!("{:?}", hits), @"[5]"); + + let (response, code) = index.search_post(json!({"limit": 10, "offset": 5})).await; + let hits = get_hits(response); + snapshot!(code, @"200 OK"); + snapshot!(hits.len(), @"0"); +} diff --git a/meilisearch/tests/search/mod.rs b/meilisearch/tests/search/mod.rs index 3aefe7e83..61db0cd10 100644 --- a/meilisearch/tests/search/mod.rs +++ b/meilisearch/tests/search/mod.rs @@ -1,6 +1,7 @@ // This modules contains all the test concerning search. Each particular feature of the search // should be tested in its own module to isolate tests and keep the tests readable. +mod distinct; mod errors; mod facet_search; mod formatted;