2023-01-10 17:22:01 +01:00
use meili_snap ::* ;
2021-07-06 11:54:37 +02:00
2021-10-21 14:42:01 +02:00
use super ::DOCUMENTS ;
2022-10-20 18:00:07 +02:00
use crate ::common ::Server ;
2023-09-11 16:50:53 +02:00
use crate ::json ;
2021-10-21 14:42:01 +02:00
2021-07-06 11:54:37 +02:00
#[ actix_rt::test ]
async fn search_unexisting_index ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2021-10-26 19:36:48 +02:00
let expected_response = json! ( {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#index_not_found "
2021-10-26 19:36:48 +02:00
} ) ;
2021-07-06 11:54:37 +02:00
index
. search ( json! ( { " q " : " hello " } ) , | response , code | {
2021-10-26 19:36:48 +02:00
assert_eq! ( code , 404 ) ;
assert_eq! ( response , expected_response ) ;
2021-07-06 11:54:37 +02:00
} )
. await ;
}
#[ actix_rt::test ]
async fn search_unexisting_parameter ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index
. search ( json! ( { " marin " : " hello " } ) , | response , code | {
assert_eq! ( code , 400 , " {} " , response ) ;
2021-10-26 19:36:48 +02:00
assert_eq! ( response [ " code " ] , " bad_request " ) ;
2021-07-06 11:54:37 +02:00
} )
. await ;
}
2021-10-21 14:42:01 +02:00
2022-04-07 11:27:06 +02:00
#[ actix_rt::test ]
2023-01-10 17:22:01 +01:00
async fn search_bad_q ( ) {
2022-04-07 11:27:06 +02:00
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2023-01-10 17:22:01 +01:00
let ( response , code ) = index . search_post ( json! ( { " q " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.q`: expected a string, but found an array: `[ \" doggo \" ]` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_q " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_q "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `q` fail with a get search since it'll accept anything as a string.
}
#[ actix_rt::test ]
async fn search_bad_offset ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " offset " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.offset`: expected a positive integer, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_offset " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_offset "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " offset=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value in parameter `offset`: could not parse `doggo` as a positive integer " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_offset " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_offset "
2023-01-10 17:22:01 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn search_bad_limit ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " limit " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.limit`: expected a positive integer, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_limit " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_limit "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " limit=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value in parameter `limit`: could not parse `doggo` as a positive integer " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_limit " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_limit "
2023-01-10 17:22:01 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn search_bad_page ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " page " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.page`: expected a positive integer, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_page " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_page "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " page=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value in parameter `page`: could not parse `doggo` as a positive integer " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_page " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_page "
2023-01-10 17:22:01 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn search_bad_hits_per_page ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " hitsPerPage " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.hitsPerPage`: expected a positive integer, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_hits_per_page " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_hits_per_page "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " hitsPerPage=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value in parameter `hitsPerPage`: could not parse `doggo` as a positive integer " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_hits_per_page " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_hits_per_page "
2023-01-10 17:22:01 +01:00
}
" ###);
}
2024-06-05 11:49:03 +02:00
#[ actix_rt::test ]
async fn search_bad_attributes_to_retrieve ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " attributesToRetrieve " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value type at `.attributesToRetrieve`: expected an array, but found a string: ` \" doggo \" ` " ,
" code " : " invalid_search_attributes_to_retrieve " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_retrieve "
}
" ###);
// Can't make the `attributes_to_retrieve` fail with a get search since it'll accept anything as an array of strings.
}
#[ actix_rt::test ]
async fn search_bad_retrieve_vectors ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " retrieveVectors " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value type at `.retrieveVectors`: expected a boolean, but found a string: ` \" doggo \" ` " ,
" code " : " invalid_search_retrieve_vectors " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_retrieve_vectors "
}
" ###);
let ( response , code ) = index . search_post ( json! ( { " retrieveVectors " : [ true ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value type at `.retrieveVectors`: expected a boolean, but found an array: `[true]` " ,
" code " : " invalid_search_retrieve_vectors " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_retrieve_vectors "
}
" ###);
let ( response , code ) = index . search_get ( " retrieveVectors= " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value in parameter `retrieveVectors`: could not parse `` as a boolean, expected either `true` or `false` " ,
" code " : " invalid_search_retrieve_vectors " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_retrieve_vectors "
}
" ###);
let ( response , code ) = index . search_get ( " retrieveVectors=doggo " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value in parameter `retrieveVectors`: could not parse `doggo` as a boolean, expected either `true` or `false` " ,
" code " : " invalid_search_retrieve_vectors " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_retrieve_vectors "
}
" ###);
}
2023-01-10 17:22:01 +01:00
#[ actix_rt::test ]
async fn search_bad_attributes_to_crop ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " attributesToCrop " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.attributesToCrop`: expected an array, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_attributes_to_crop " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_crop "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `attributes_to_crop` fail with a get search since it'll accept anything as an array of strings.
}
#[ actix_rt::test ]
async fn search_bad_crop_length ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " cropLength " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.cropLength`: expected a positive integer, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_crop_length " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_crop_length "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " cropLength=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value in parameter `cropLength`: could not parse `doggo` as a positive integer " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_crop_length " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_crop_length "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
}
#[ actix_rt::test ]
2023-01-10 17:22:01 +01:00
async fn search_bad_attributes_to_highlight ( ) {
2022-12-14 13:00:43 +01:00
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2023-01-10 17:22:01 +01:00
let ( response , code ) = index . search_post ( json! ( { " attributesToHighlight " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.attributesToHighlight`: expected an array, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_attributes_to_highlight " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_highlight "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2023-01-10 17:22:01 +01:00
// Can't make the `attributes_to_highlight` fail with a get search since it'll accept anything as an array of strings.
}
#[ actix_rt::test ]
async fn search_bad_filter ( ) {
2023-01-11 11:37:12 +01:00
// Since a filter is deserialized as a json Value it will never fail to deserialize.
// Thus the error message is not generated by deserr but written by us.
2023-01-10 17:22:01 +01:00
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2023-01-11 11:37:12 +01:00
// Also, to trigger the error message we need to effectively create the index or else it'll throw an
// index does not exists error.
let ( _ , code ) = index . create ( None ) . await ;
2023-01-11 14:54:29 +01:00
server . wait_task ( 0 ) . await ;
2023-01-11 11:37:12 +01:00
snapshot! ( code , @ " 202 Accepted " ) ;
2023-01-10 17:22:01 +01:00
let ( response , code ) = index . search_post ( json! ( { " filter " : true } ) ) . await ;
2023-01-11 11:37:12 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
2023-01-10 17:22:01 +01:00
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-11 11:37:12 +01:00
" message " : " Invalid syntax for the filter parameter: `expected String, Array, found: true`. " ,
" code " : " invalid_search_filter " ,
2023-01-10 17:22:01 +01:00
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-11 11:37:12 +01:00
// Can't make the `filter` fail with a get search since it'll accept anything as a strings.
2023-01-10 17:22:01 +01:00
}
#[ actix_rt::test ]
async fn search_bad_sort ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " sort " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.sort`: expected an array, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_sort " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `sort` fail with a get search since it'll accept anything as a strings.
}
#[ actix_rt::test ]
async fn search_bad_show_matches_position ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " showMatchesPosition " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.showMatchesPosition`: expected a boolean, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_show_matches_position " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_show_matches_position "
2023-01-10 17:22:01 +01:00
}
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " showMatchesPosition=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-16 16:59:26 +01:00
" message " : " Invalid value in parameter `showMatchesPosition`: could not parse `doggo` as a boolean, expected either `true` or `false` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_show_matches_position " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_show_matches_position "
2023-01-10 17:22:01 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn search_bad_facets ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " facets " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.facets`: expected an array, but found a string: ` \" doggo \" ` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `attributes_to_highlight` fail with a get search since it'll accept anything as an array of strings.
}
2024-05-30 11:22:26 +02:00
#[ actix_rt::test ]
async fn search_bad_threshold ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " rankingScoreThreshold " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value type at `.rankingScoreThreshold`: expected a number, but found a string: ` \" doggo \" ` " ,
" code " : " invalid_search_ranking_score_threshold " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_ranking_score_threshold "
}
" ###);
}
#[ actix_rt::test ]
async fn search_invalid_threshold ( ) {
let server = Server ::new ( ) . await ;
let index = s erver . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " rankingScoreThreshold " : 42 } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value at `.rankingScoreThreshold`: the value of `rankingScoreThreshold` is invalid, expected a float between `0.0` and `1.0`. " ,
" code " : " invalid_search_ranking_score_threshold " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_ranking_score_threshold "
}
" ###);
}
2023-01-19 11:25:55 +01:00
#[ actix_rt::test ]
async fn search_non_filterable_facets ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
// Wait for the settings update to complete
index . wait_task ( 0 ) . await ;
let ( response , code ) = index . search_post ( json! ( { " facets " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-19 13:37:34 +01:00
" message " : " Invalid facet distribution, attribute `doggo` is not filterable. The available filterable attribute is `title`. " ,
2023-01-19 11:25:55 +01:00
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
2023-01-19 11:25:55 +01:00
}
" ###);
let ( response , code ) = index . search_get ( " facets=doggo " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-19 13:37:34 +01:00
" message " : " Invalid facet distribution, attribute `doggo` is not filterable. The available filterable attribute is `title`. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
}
#[ actix_rt::test ]
async fn search_non_filterable_facets_multiple_filterable ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ " title " , " genres " ] } ) ) . await ;
index . wait_task ( 0 ) . await ;
let ( response , code ) = index . search_post ( json! ( { " facets " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, attribute `doggo` is not filterable. The available filterable attributes are `genres, title`. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
let ( response , code ) = index . search_get ( " facets=doggo " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, attribute `doggo` is not filterable. The available filterable attributes are `genres, title`. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
}
#[ actix_rt::test ]
async fn search_non_filterable_facets_no_filterable ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ ] } ) ) . await ;
index . wait_task ( 0 ) . await ;
let ( response , code ) = index . search_post ( json! ( { " facets " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, this index does not have configured filterable attributes. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
let ( response , code ) = index . search_get ( " facets=doggo " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, this index does not have configured filterable attributes. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
}
#[ actix_rt::test ]
async fn search_non_filterable_facets_multiple_facets ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ " title " , " genres " ] } ) ) . await ;
index . wait_task ( 0 ) . await ;
let ( response , code ) = index . search_post ( json! ( { " facets " : [ " doggo " , " neko " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, attributes `doggo, neko` are not filterable. The available filterable attributes are `genres, title`. " ,
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
}
" ###);
let ( response , code ) = index . search_get ( " facets=doggo,neko " ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid facet distribution, attributes `doggo, neko` are not filterable. The available filterable attributes are `genres, title`. " ,
2023-01-19 11:25:55 +01:00
" code " : " invalid_search_facets " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_facets "
2023-01-19 11:25:55 +01:00
}
" ###);
}
2023-01-10 17:22:01 +01:00
#[ actix_rt::test ]
async fn search_bad_highlight_pre_tag ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " highlightPreTag " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.highlightPreTag`: expected a string, but found an array: `[ \" doggo \" ]` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_highlight_pre_tag " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_highlight_pre_tag "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `highlight_pre_tag` fail with a get search since it'll accept anything as a strings.
}
#[ actix_rt::test ]
async fn search_bad_highlight_post_tag ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , code ) = index . search_post ( json! ( { " highlightPostTag " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.highlightPostTag`: expected a string, but found an array: `[ \" doggo \" ]` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_highlight_post_tag " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_highlight_post_tag "
2023-01-10 17:22:01 +01:00
}
" ###);
// Can't make the `highlight_post_tag` fail with a get search since it'll accept anything as a strings.
}
#[ actix_rt::test ]
async fn search_bad_crop_marker ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-12-14 13:00:43 +01:00
2023-01-10 17:22:01 +01:00
let ( response , code ) = index . search_post ( json! ( { " cropMarker " : [ " doggo " ] } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2023-01-12 13:55:53 +01:00
" message " : " Invalid value type at `.cropMarker`: expected a string, but found an array: `[ \" doggo \" ]` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_crop_marker " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_crop_marker "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2023-01-10 17:22:01 +01:00
// Can't make the `crop_marker` fail with a get search since it'll accept anything as a strings.
2022-12-14 13:00:43 +01:00
}
#[ actix_rt::test ]
2023-01-10 17:22:01 +01:00
async fn search_bad_matching_strategy ( ) {
2022-12-14 13:00:43 +01:00
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2023-01-10 17:22:01 +01:00
let ( response , code ) = index . search_post ( json! ( { " matchingStrategy " : " doggo " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2024-05-30 12:02:42 +02:00
" message " : " Unknown value `doggo` at `.matchingStrategy`: expected one of `last`, `all`, `frequency` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_matching_strategy " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_matching_strategy "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2023-01-19 17:21:08 +01:00
let ( response , code ) = index . search_post ( json! ( { " matchingStrategy " : { " doggo " : " doggo " } } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Invalid value type at `.matchingStrategy`: expected a string, but found an object: `{ \" doggo \" : \" doggo \" }` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_matching_strategy " ,
" type " : " invalid_request " ,
2023-01-23 15:42:58 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_matching_strategy "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2023-01-12 13:55:53 +01:00
let ( response , code ) = index . search_get ( " matchingStrategy=doggo " ) . await ;
2023-01-10 17:22:01 +01:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
2024-05-30 12:02:42 +02:00
" message " : " Unknown value `doggo` for parameter `matchingStrategy`: expected one of `last`, `all`, `frequency` " ,
2023-01-10 17:22:01 +01:00
" code " : " invalid_search_matching_strategy " ,
" type " : " invalid_request " ,
2023-01-19 15:48:20 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_matching_strategy "
2023-01-10 17:22:01 +01:00
}
2022-12-14 13:00:43 +01:00
" ###);
2022-04-07 11:27:06 +02:00
}
2021-10-21 14:42:01 +02:00
#[ actix_rt::test ]
async fn filter_invalid_syntax_object ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-14 18:08:12 +01:00
" message " : " Was expecting an operation `=`, `!=`, `>=`, `>`, `<=`, `<`, `IN`, `NOT IN`, `TO`, `EXISTS`, `NOT EXISTS`, `IS NULL`, `IS NOT NULL`, `IS EMPTY`, `IS NOT EMPTY`, `_geoRadius`, or `_geoBoundingBox` at `title & Glass`. \n 1:14 title & Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2021-10-26 19:36:48 +02:00
. search ( json! ( { " filter " : " title & Glass " } ) , | response , code | {
2021-10-21 14:42:01 +02:00
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_invalid_syntax_array ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-14 18:08:12 +01:00
" message " : " Was expecting an operation `=`, `!=`, `>=`, `>`, `<=`, `<`, `IN`, `NOT IN`, `TO`, `EXISTS`, `NOT EXISTS`, `IS NULL`, `IS NOT NULL`, `IS EMPTY`, `IS NOT EMPTY`, `_geoRadius`, or `_geoBoundingBox` at `title & Glass`. \n 1:14 title & Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-06-28 13:01:18 +02:00
. search ( json! ( { " filter " : [ " title & Glass " ] } ) , | response , code | {
2021-10-26 19:36:48 +02:00
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
2021-10-21 14:42:01 +02:00
. await ;
}
#[ actix_rt::test ]
async fn filter_invalid_syntax_string ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-12-02 16:03:26 +01:00
" message " : " Found unexpected characters at the end of the filter: `XOR title = Glass`. You probably forgot an `OR` or an `AND` rule. \n 15:32 title = Glass XOR title = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-10-20 18:00:07 +02:00
. search ( json! ( { " filter " : " title = Glass XOR title = Glass " } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
2021-10-21 14:42:01 +02:00
. await ;
}
#[ actix_rt::test ]
async fn filter_invalid_attribute_array ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-12-02 16:03:26 +01:00
" message " : " Attribute `many` is not filterable. Available filterable attributes are: `title`. \n 1:5 many = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-06-28 13:01:18 +02:00
. search ( json! ( { " filter " : [ " many = Glass " ] } ) , | response , code | {
2021-10-21 14:42:01 +02:00
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_invalid_attribute_string ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-12-02 16:03:26 +01:00
" message " : " Attribute `many` is not filterable. Available filterable attributes are: `title`. \n 1:5 many = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search ( json! ( { " filter " : " many = Glass " } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_reserved_geo_attribute_array ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-31 22:27:44 +02:00
" message " : " `_geo` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:13 _geo = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-06-28 13:01:18 +02:00
. search ( json! ( { " filter " : [ " _geo = Glass " ] } ) , | response , code | {
2021-10-21 14:42:01 +02:00
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_reserved_geo_attribute_string ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-31 22:27:44 +02:00
" message " : " `_geo` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:13 _geo = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search ( json! ( { " filter " : " _geo = Glass " } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_reserved_attribute_array ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-31 22:27:44 +02:00
" message " : " `_geoDistance` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:21 _geoDistance = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-10-20 18:00:07 +02:00
. search ( json! ( { " filter " : [ " _geoDistance = Glass " ] } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
2021-10-21 14:42:01 +02:00
. await ;
}
#[ actix_rt::test ]
async fn filter_reserved_attribute_string ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-03-31 22:27:44 +02:00
" message " : " `_geoDistance` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:21 _geoDistance = Glass " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_filter " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
2021-10-21 14:42:01 +02:00
} ) ;
index
2022-10-20 18:00:07 +02:00
. search ( json! ( { " filter " : " _geoDistance = Glass " } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
2021-10-21 14:42:01 +02:00
. await ;
}
2023-03-31 23:44:21 +02:00
#[ actix_rt::test ]
async fn filter_reserved_geo_point_array ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
index . wait_task ( 1 ) . await ;
let expected_response = json! ( {
" message " : " `_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:18 _geoPoint = Glass " ,
" code " : " invalid_search_filter " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
} ) ;
index
. search ( json! ( { " filter " : [ " _geoPoint = Glass " ] } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
#[ actix_rt::test ]
async fn filter_reserved_geo_point_string ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings ( json! ( { " filterableAttributes " : [ " title " ] } ) ) . await ;
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
index . wait_task ( 1 ) . await ;
let expected_response = json! ( {
" message " : " `_geoPoint` is a reserved keyword and thus can't be used as a filter expression. Use the `_geoRadius(latitude, longitude, distance)` or `_geoBoundingBox([latitude, longitude], [latitude, longitude])` built-in rules to filter on `_geo` coordinates. \n 1:18 _geoPoint = Glass " ,
" code " : " invalid_search_filter " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_filter "
} ) ;
index
. search ( json! ( { " filter " : " _geoPoint = Glass " } ) , | response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} )
. await ;
}
2021-10-21 14:42:01 +02:00
#[ actix_rt::test ]
async fn sort_geo_reserved_attribute ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " sortableAttributes " : [ " id " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-10-26 19:36:48 +02:00
" message " : " `_geo` is a reserved keyword and thus can't be used as a sort expression. Use the _geoPoint(latitude, longitude) built-in rule to sort on _geo field coordinates. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_sort " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search (
json! ( {
" sort " : [ " _geo:asc " ]
} ) ,
| response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} ,
)
. await ;
}
#[ actix_rt::test ]
async fn sort_reserved_attribute ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " sortableAttributes " : [ " id " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-10-26 19:36:48 +02:00
" message " : " `_geoDistance` is a reserved keyword and thus can't be used as a sort expression. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_sort " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search (
json! ( {
" sort " : [ " _geoDistance:asc " ]
} ) ,
| response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} ,
)
. await ;
}
#[ actix_rt::test ]
async fn sort_unsortable_attribute ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " sortableAttributes " : [ " id " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-10-26 19:36:48 +02:00
" message " : " Attribute `title` is not sortable. Available sortable attributes are: `id`. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_sort " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search (
json! ( {
" sort " : [ " title:asc " ]
} ) ,
| response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} ,
)
. await ;
}
#[ actix_rt::test ]
async fn sort_invalid_syntax ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2022-10-20 18:00:07 +02:00
index . update_settings ( json! ( { " sortableAttributes " : [ " id " ] } ) ) . await ;
2021-10-21 14:42:01 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2021-10-26 19:36:48 +02:00
" message " : " Invalid syntax for the sort parameter: expected expression ending by `:asc` or `:desc`, found `title`. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_sort " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search (
json! ( {
" sort " : [ " title " ]
} ) ,
| response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} ,
)
. await ;
}
#[ actix_rt::test ]
async fn sort_unset_ranking_rule ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index
. update_settings (
2021-10-26 19:36:48 +02:00
json! ( { " sortableAttributes " : [ " title " ] , " rankingRules " : [ " proximity " , " exactness " ] } ) ,
2021-10-21 14:42:01 +02:00
)
. await ;
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2021-12-02 16:03:26 +01:00
index . wait_task ( 1 ) . await ;
2021-10-21 14:42:01 +02:00
let expected_response = json! ( {
2023-05-16 10:57:26 +02:00
" message " : " You must specify where `sort` is listed in the rankingRules setting to use the sort parameter at search time. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_search_sort " ,
2021-10-21 14:42:01 +02:00
" type " : " invalid_request " ,
2023-01-19 16:10:05 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_sort "
2021-10-21 14:42:01 +02:00
} ) ;
index
. search (
json! ( {
2021-10-26 19:36:48 +02:00
" sort " : [ " title:asc " ]
2021-10-21 14:42:01 +02:00
} ) ,
| response , code | {
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
} ,
)
. await ;
}
2023-06-20 17:04:59 +02:00
#[ actix_rt::test ]
async fn search_on_unknown_field ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
2023-07-12 10:36:55 +02:00
index . update_settings_searchable_attributes ( json! ( [ " id " , " title " ] ) ) . await ;
index . wait_task ( 0 ) . await ;
2023-06-20 17:04:59 +02:00
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
2023-07-12 10:36:55 +02:00
index . wait_task ( 1 ) . await ;
2023-06-20 17:04:59 +02:00
index
. search (
json! ( { " q " : " Captain Marvel " , " attributesToSearchOn " : [ " unknown " ] } ) ,
| response , code | {
2023-06-22 14:42:52 +02:00
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Attribute `unknown` is not searchable. Available searchable attributes are: `id, title`. " ,
2023-07-03 11:52:43 +02:00
" code " : " invalid_search_attributes_to_search_on " ,
2023-06-22 14:42:52 +02:00
" type " : " invalid_request " ,
2023-07-03 11:52:43 +02:00
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_search_on "
2023-06-22 14:42:52 +02:00
}
" ###);
2023-06-20 17:04:59 +02:00
} ,
)
. await ;
}
2023-07-12 10:36:55 +02:00
#[ actix_rt::test ]
async fn search_on_unknown_field_plus_joker ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . update_settings_searchable_attributes ( json! ( [ " id " , " title " ] ) ) . await ;
index . wait_task ( 0 ) . await ;
let documents = DOCUMENTS . clone ( ) ;
index . add_documents ( documents , None ) . await ;
index . wait_task ( 1 ) . await ;
index
. search (
json! ( { " q " : " Captain Marvel " , " attributesToSearchOn " : [ " * " , " unknown " ] } ) ,
| response , code | {
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Attribute `unknown` is not searchable. Available searchable attributes are: `id, title`. " ,
" code " : " invalid_search_attributes_to_search_on " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_search_on "
}
" ###);
} ,
)
. await ;
index
. search (
json! ( { " q " : " Captain Marvel " , " attributesToSearchOn " : [ " unknown " , " * " ] } ) ,
| response , code | {
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( json_string! ( response ) , @ r ###"
{
" message " : " Attribute `unknown` is not searchable. Available searchable attributes are: `id, title`. " ,
" code " : " invalid_search_attributes_to_search_on " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_attributes_to_search_on "
}
" ###);
} ,
)
. await ;
}
2024-06-17 15:37:32 +02:00
#[ actix_rt::test ]
async fn distinct_at_search_time ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " tamo " ) ;
let ( task , _ ) = index . create ( None ) . await ;
let task = index . wait_task ( task . uid ( ) ) . await ;
snapshot! ( task , name : " task-succeed " ) ;
let ( response , code ) =
index . search_post ( json! ( { " page " : 0 , " hitsPerPage " : 2 , " distinct " : " doggo.truc " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( response , @ r ###"
{
" message " : " Attribute `doggo.truc` is not filterable and thus, cannot be used as distinct attribute. This index does not have configured filterable attributes. " ,
" code " : " invalid_search_distinct " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_distinct "
}
" ###);
let ( task , _ ) = index . update_settings_filterable_attributes ( json! ( [ " color " , " machin " ] ) ) . await ;
index . wait_task ( task . uid ( ) ) . await ;
let ( response , code ) =
index . search_post ( json! ( { " page " : 0 , " hitsPerPage " : 2 , " distinct " : " doggo.truc " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( response , @ r ###"
{
" message " : " Attribute `doggo.truc` is not filterable and thus, cannot be used as distinct attribute. Available filterable attributes are: `color, machin`. " ,
" code " : " invalid_search_distinct " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_distinct "
}
" ###);
let ( task , _ ) = index . update_settings_displayed_attributes ( json! ( [ " color " ] ) ) . await ;
index . wait_task ( task . uid ( ) ) . await ;
let ( response , code ) =
index . search_post ( json! ( { " page " : 0 , " hitsPerPage " : 2 , " distinct " : " doggo.truc " } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( response , @ r ###"
{
" message " : " Attribute `doggo.truc` is not filterable and thus, cannot be used as distinct attribute. Available filterable attributes are: `color, <..hidden-attributes>`. " ,
" code " : " invalid_search_distinct " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_distinct "
}
" ###);
let ( response , code ) =
index . search_post ( json! ( { " page " : 0 , " hitsPerPage " : 2 , " distinct " : true } ) ) . await ;
snapshot! ( code , @ " 400 Bad Request " ) ;
snapshot! ( response , @ r ###"
{
" message " : " Invalid value type at `.distinct`: expected a string, but found a boolean: `true` " ,
" code " : " invalid_search_distinct " ,
" type " : " invalid_request " ,
" link " : " https://docs.meilisearch.com/errors#invalid_search_distinct "
}
" ###);
}