diff --git a/meilisearch-http/src/error.rs b/meilisearch-http/src/error.rs index eee9d8e8e..295931454 100644 --- a/meilisearch-http/src/error.rs +++ b/meilisearch-http/src/error.rs @@ -146,7 +146,7 @@ impl fmt::Display for ResponseError { Self::SearchDocuments(err) => write!(f, "impossible to search documents; {}", err), Self::FacetExpression(e) => write!(f, "error parsing facet filter expression: {}", e), Self::PayloadTooLarge => f.write_str("Payload to large"), - Self::UnsupportedMediaType => f.write_str("Unsupported media type") + Self::UnsupportedMediaType => f.write_str("Unsupported media type"), Self::FacetCount(e) => write!(f, "error with facet count: {}", e), } } diff --git a/meilisearch-http/tests/search.rs b/meilisearch-http/tests/search.rs index 635f46560..58a66cd39 100644 --- a/meilisearch-http/tests/search.rs +++ b/meilisearch-http/tests/search.rs @@ -1292,3 +1292,54 @@ async fn test_faceted_search_invalid() { let (_response, status_code) = server.search(query).await; assert_ne!(status_code, 202); } + +#[actix_rt::test] +async fn test_facet_count() { + let mut server = common::Server::test_server().await; + + // test no facets set, search on color + let query = "q=a&facets=%5B%22color%22%5D"; + let (_response, status_code) = server.search(query).await; + assert_eq!(status_code, 400); + + let body = json!({ + "attributesForFaceting": ["color", "tags"] + }); + server.update_all_settings(body).await; + // same as before, but now facets are set: + let (response, _status_code) = server.search(query).await; + assert_eq!(response.get("facets").unwrap().as_object().unwrap().values().count(), 1); + // searching on color and tags + let query = "q=a&facets=%5B%22color%22,%20%22tags%22%5D"; + let (response, _status_code) = server.search(query).await; + let facets = response.get("facets").unwrap().as_object().unwrap(); + eprintln!("response: {:#?}", response); + assert_eq!(facets.values().count(), 2); + assert_ne!(!facets.get("color").unwrap().as_object().unwrap().values().count(), 0); + assert_ne!(!facets.get("tags").unwrap().as_object().unwrap().values().count(), 0); + // wildcard + let query = "q=a&facets=%5B%22*%22%5D"; + let (response, _status_code) = server.search(query).await; + assert_eq!(response.get("facets").unwrap().as_object().unwrap().values().count(), 2); + // wildcard with other attributes: + let query = "q=a&facets=%5B%22color%22,%20%22*%22%5D"; + let (response, _status_code) = server.search(query).await; + assert_eq!(response.get("facets").unwrap().as_object().unwrap().values().count(), 2); + // empty facet list + let query = "q=a&facets=%5B%5D"; + let (response, _status_code) = server.search(query).await; + assert_eq!(response.get("facets").unwrap().as_object().unwrap().values().count(), 0); + + // attr not set as facet passed: + let query = "q=a&facets=%5B%22gender%22%5D"; + let (_response, status_code) = server.search(query).await; + assert_eq!(status_code, 400); + // string instead of array: + let query = "q=a&facets=%22gender%22"; + let (_response, status_code) = server.search(query).await; + assert_eq!(status_code, 400); + // invalid value in array: + let query = "q=a&facets=%5B%22color%22,%20true%5D"; + let (_response, status_code) = server.search(query).await; + assert_eq!(status_code, 400); +}