From 19c9caed39624a627bb4bdc7a08e0fd1a81cf24d Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Mon, 3 Mar 2025 16:53:36 +0100 Subject: [PATCH] Fix tests --- .../tests/documents/get_documents.rs | 315 +++++++++++++++++- crates/meilisearch/tests/similar/errors.rs | 9 +- 2 files changed, 317 insertions(+), 7 deletions(-) diff --git a/crates/meilisearch/tests/documents/get_documents.rs b/crates/meilisearch/tests/documents/get_documents.rs index 1394e5e8d..2b30d15b1 100644 --- a/crates/meilisearch/tests/documents/get_documents.rs +++ b/crates/meilisearch/tests/documents/get_documents.rs @@ -492,9 +492,8 @@ async fn get_document_by_filter() { } "###); - let (response, code) = index - .get_document_by_filter(json!({ "filter": [["color != blue"], "color EXISTS"] })) - .await; + let (response, code) = + index.fetch_documents(json!({ "filter": [["color != blue"], "color EXISTS"] })).await; snapshot!(code, @"200 OK"); snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" { @@ -511,6 +510,316 @@ async fn get_document_by_filter() { "###); } +#[actix_rt::test] +async fn get_document_by_ids() { + let server = Server::new_shared(); + let index = server.unique_index(); + let (task, _code) = index + .add_documents( + json!([ + { "id": 0, "color": "red" }, + { "id": 1, "color": "blue" }, + { "id": 2, "color": "blue" }, + { "id": 3 }, + ]), + Some("id"), + ) + .await; + index.wait_task(task.uid()).await.succeeded(); + + let (response, code) = index + .fetch_documents(json!({ + "ids": ["0", 1, 2, 3] + })) + .await; + let (response2, code2) = index.get_all_documents_raw("?ids=0,1,2,3").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 0, + "color": "red" + }, + { + "id": 1, + "color": "blue" + }, + { + "id": 2, + "color": "blue" + }, + { + "id": 3 + } + ], + "offset": 0, + "limit": 20, + "total": 4 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + let (response, code) = index.fetch_documents(json!({ "ids": [2, "1"] })).await; + let (response2, code2) = index.get_all_documents_raw("?ids=2,1").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 1, + "color": "blue" + }, + { + "id": 2, + "color": "blue" + } + ], + "offset": 0, + "limit": 20, + "total": 2 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + let (response, code) = + index.fetch_documents(json!({ "offset": 1, "limit": 1, "ids": ["0", 0, 3] })).await; + let (response2, code2) = index.get_all_documents_raw("?ids=3,0&offset=1&limit=1").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 3 + } + ], + "offset": 1, + "limit": 1, + "total": 2 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + let (response, code) = + index.fetch_documents(json!({ "limit": 1, "ids": [0, 3], "fields": ["color"] })).await; + let (response2, code2) = index.get_all_documents_raw("?limit=1&ids=0,3&fields=color").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "color": "red" + } + ], + "offset": 0, + "limit": 1, + "total": 2 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + // Now testing more complex requests that the get route can't represent + + let (response, code) = index.fetch_documents(json!({ "ids": [] })).await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [], + "offset": 0, + "limit": 20, + "total": 0 + } + "###); +} + +#[actix_rt::test] +async fn get_document_invalid_ids() { + let server = Server::new_shared(); + let index = server.unique_index(); + let (task, _code) = index + .add_documents( + json!([ + { "id": 0, "color": "red" }, + { "id": 1, "color": "blue" }, + { "id": 2, "color": "blue" }, + { "id": 3 }, + ]), + Some("id"), + ) + .await; + index.wait_task(task.uid()).await.succeeded(); + + let (response, code) = index.fetch_documents(json!({"ids": ["0", "illegal/docid"] })).await; + let (response2, code2) = index.get_all_documents_raw("?ids=0,illegal/docid").await; + snapshot!(code, @"400 Bad Request"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "message": "In `.ids[1]`:Document identifier `\"illegal/docid\"` is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_), and can not be more than 511 bytes.", + "code": "invalid_document_ids", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#invalid_document_ids" + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); +} + +#[actix_rt::test] +async fn get_document_not_found_ids() { + let server = Server::new_shared(); + let index = server.unique_index(); + let (task, _code) = index + .add_documents( + json!([ + { "id": 0, "color": "red" }, + { "id": 1, "color": "blue" }, + { "id": 2, "color": "blue" }, + { "id": 3 }, + ]), + Some("id"), + ) + .await; + index.wait_task(task.uid()).await.succeeded(); + + let (response, code) = index.fetch_documents(json!({"ids": ["0", 3, 42] })).await; + let (response2, code2) = index.get_all_documents_raw("?ids=0,3,42").await; + snapshot!(code, @"400 Bad Request"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "message": "In `.ids[2]`: Document `42` not found.", + "code": "not_found_document_id", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#not_found_document_id" + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); +} + +#[actix_rt::test] +async fn get_document_by_ids_and_filter() { + let server = Server::new_shared(); + let index = server.unique_index(); + index.update_settings_filterable_attributes(json!(["color"])).await; + let (task, _code) = index + .add_documents( + json!([ + { "id": 0, "color": "red" }, + { "id": 1, "color": "blue" }, + { "id": 2, "color": "blue" }, + { "id": 3 }, + ]), + Some("id"), + ) + .await; + index.wait_task(task.uid()).await.succeeded(); + + let (response, code) = + index.fetch_documents(json!({"ids": [2], "filter": "color = blue" })).await; + let (response2, code2) = index.get_all_documents_raw("?ids=2&filter=color=blue").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 2, + "color": "blue" + } + ], + "offset": 0, + "limit": 20, + "total": 1 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + let (response, code) = index + .fetch_documents( + json!({ "offset": 1, "limit": 1, "ids": [0, 1, 2, 3], "filter": "color != blue" }), + ) + .await; + let (response2, code2) = + index.get_all_documents_raw("?ids=0,1,2,3&filter=color!=blue&offset=1&limit=1").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 3 + } + ], + "offset": 1, + "limit": 1, + "total": 2 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + let (response, code) = index + .fetch_documents(json!({ "limit": 1, "ids": [0, 1, 2,3], "filter": "color != blue", "fields": ["color"] })) + .await; + let (response2, code2) = + index.get_all_documents_raw("?ids=0,1,2,3&limit=1&filter=color!=blue&fields=color").await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "color": "red" + } + ], + "offset": 0, + "limit": 1, + "total": 2 + } + "###); + assert_eq!(code, code2); + assert_eq!(response, response2); + + // Now testing more complex filter that the get route can't represent + + let (response, code) = index + .fetch_documents(json!({ "ids": [0, "2"], "filter": [["color = blue", "color = red"]] })) + .await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [ + { + "id": 0, + "color": "red" + }, + { + "id": 2, + "color": "blue" + } + ], + "offset": 0, + "limit": 20, + "total": 2 + } + "###); + + let (response, code) = index + .fetch_documents(json!({ "filter": [["color != blue"], "color EXISTS"], "ids": [1, 2, 3] })) + .await; + snapshot!(code, @"200 OK"); + snapshot!(json_string!(response, { ".enqueuedAt" => "[date]" }), @r###" + { + "results": [], + "offset": 0, + "limit": 20, + "total": 0 + } + "###); +} + #[actix_rt::test] async fn get_document_with_vectors() { let server = Server::new().await; diff --git a/crates/meilisearch/tests/similar/errors.rs b/crates/meilisearch/tests/similar/errors.rs index 75bd6e46b..5d9b00def 100644 --- a/crates/meilisearch/tests/similar/errors.rs +++ b/crates/meilisearch/tests/similar/errors.rs @@ -55,11 +55,11 @@ async fn similar_bad_id() { snapshot!(code, @"202 Accepted"); server.wait_task(response.uid()).await; - let (response, code) = index.similar_post(json!({"id": ["doggo"]})).await; + let (response, code) = index.similar_post(json!({"id": ["doggo"], "embedder": "manual"})).await; snapshot!(code, @"400 Bad Request"); snapshot!(json_string!(response), @r###" { - "message": "Invalid value at `.id`: the value of `id` is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_), and can not be more than 511 bytes.", + "message": "Invalid value at `.id`: Document identifier `[\"doggo\"]` is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_), and can not be more than 511 bytes.", "code": "invalid_similar_id", "type": "invalid_request", "link": "https://docs.meilisearch.com/errors#invalid_similar_id" @@ -145,11 +145,12 @@ async fn similar_invalid_id() { snapshot!(code, @"202 Accepted"); server.wait_task(response.uid()).await; - let (response, code) = index.similar_post(json!({"id": "http://invalid-docid/"})).await; + let (response, code) = + index.similar_post(json!({"id": "http://invalid-docid/", "embedder": "manual"})).await; snapshot!(code, @"400 Bad Request"); snapshot!(json_string!(response), @r###" { - "message": "Invalid value at `.id`: the value of `id` is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_), and can not be more than 511 bytes.", + "message": "Invalid value at `.id`: Document identifier `\"http://invalid-docid/\"` is invalid. A document identifier can be of type integer or string, only composed of alphanumeric characters (a-z A-Z 0-9), hyphens (-) and underscores (_), and can not be more than 511 bytes.", "code": "invalid_similar_id", "type": "invalid_request", "link": "https://docs.meilisearch.com/errors#invalid_similar_id"