From 8a40be184060da5fa9b55e16e8a63f9ff31d46a5 Mon Sep 17 00:00:00 2001 From: Mubelotix Date: Mon, 21 Jul 2025 14:39:57 +0200 Subject: [PATCH] Add tests --- .../tests/documents/render_documents.rs | 98 +++++++++++++++++++ crates/meilisearch/tests/vector/mod.rs | 6 +- crates/meilisearch/tests/vector/openai.rs | 23 +++-- crates/meilisearch/tests/vector/rest.rs | 30 +++--- crates/meilisearch/tests/vector/settings.rs | 2 +- 5 files changed, 126 insertions(+), 33 deletions(-) diff --git a/crates/meilisearch/tests/documents/render_documents.rs b/crates/meilisearch/tests/documents/render_documents.rs index 73180e31f..95eab5e3b 100644 --- a/crates/meilisearch/tests/documents/render_documents.rs +++ b/crates/meilisearch/tests/documents/render_documents.rs @@ -554,3 +554,101 @@ async fn fields() { } "#); } + +#[actix_rt::test] +async fn document_not_found() { + let index = shared_index_for_fragments().await; + + let (value, code) = index + .render(json! {{ + "template": { "id": "embedders.rest.indexingFragments.basic" }, + "input": { "documentId": "9999" } + }}) + .await; + snapshot!(code, @"404 Not Found"); + snapshot!(value, @r#" + { + "message": "Document with ID `9999` not found.", + "code": "render_document_not_found", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#render_document_not_found" + } + "#); +} + +#[actix_rt::test] +async fn bad_template() { + let index = shared_index_for_fragments().await; + + let (value, code) = index + .render(json! {{ + "template": { "inline": "{{ doc.name" }, + "input": { "documentId": "0" } + }}) + .await; + snapshot!(code, @"400 Bad Request"); + snapshot!(value, @r#" + { + "message": "Error parsing template: error while parsing template: liquid: --> 1:4\n |\n1 | {{ doc.name\n | ^---\n |\n = expected Literal\n", + "code": "template_parsing_error", + "type": "invalid_request", + "link": "https://docs.meilisearch.com/errors#template_parsing_error" + } + "#); +} + +#[actix_rt::test] +async fn inline_nested() { + let index = shared_index_for_fragments().await; + + let (value, code) = index + .render(json! {{ + "template": { "inline": "{{ doc.name }} is a {{ doc.breed.name }} ({{ doc.breed.kind }})" }, + "input": { "inline": { "doc": { "name": "iko", "breed": { "name": "jack russell", "kind": "terrier" } } } } + }}) + .await; + snapshot!(code, @"200 OK"); + snapshot!(value, @r#" + { + "template": "{{ doc.name }} is a {{ doc.breed.name }} ({{ doc.breed.kind }})", + "rendered": "iko is a jack russell (terrier)" + } + "#); +} + +#[actix_rt::test] +async fn embedder_document_template() { + let (_mock, setting) = crate::vector::rest::create_mock().await; + let server = Server::new().await; + let index = server.index("doggo"); + + let (response, code) = index + .update_settings(json!({ + "embedders": { + "rest": setting, + }, + })) + .await; + snapshot!(code, @"202 Accepted"); + server.wait_task(response.uid()).await.succeeded(); + let documents = json!([ + {"id": 0, "name": "kefir"}, + ]); + let (value, code) = index.add_documents(documents, None).await; + snapshot!(code, @"202 Accepted"); + index.wait_task(value.uid()).await.succeeded(); + + let (value, code) = index + .render(json! {{ + "template": { "id": "embedders.rest.documentTemplate" }, + "input": { "documentId": "0" } + }}) + .await; + snapshot!(code, @"200 OK"); + snapshot!(value, @r#" + { + "template": "{{doc.name}}", + "rendered": "kefir" + } + "#); +} diff --git a/crates/meilisearch/tests/vector/mod.rs b/crates/meilisearch/tests/vector/mod.rs index 7f54489b6..7965ed7b8 100644 --- a/crates/meilisearch/tests/vector/mod.rs +++ b/crates/meilisearch/tests/vector/mod.rs @@ -3,7 +3,7 @@ mod fragments; #[cfg(feature = "test-ollama")] mod ollama; mod openai; -mod rest; +pub mod rest; mod settings; use std::str::FromStr; @@ -15,10 +15,6 @@ use crate::common::index::Index; use crate::common::{default_settings, GetAllDocumentsOptions, Server}; use crate::json; -async fn get_server_vector() -> Server { - Server::new().await -} - #[actix_rt::test] async fn add_remove_user_provided() { let server = Server::new().await; diff --git a/crates/meilisearch/tests/vector/openai.rs b/crates/meilisearch/tests/vector/openai.rs index e207c3eb6..648a28c38 100644 --- a/crates/meilisearch/tests/vector/openai.rs +++ b/crates/meilisearch/tests/vector/openai.rs @@ -7,9 +7,8 @@ use meili_snap::{json_string, snapshot}; use wiremock::matchers::{method, path}; use wiremock::{Mock, MockServer, Request, ResponseTemplate}; -use crate::common::{GetAllDocumentsOptions, Value}; +use crate::common::{GetAllDocumentsOptions, Server, Value}; use crate::json; -use crate::vector::get_server_vector; #[derive(serde::Deserialize)] struct OpenAiResponses(BTreeMap); @@ -349,7 +348,7 @@ async fn create_slow_mock() -> (&'static MockServer, Value) { #[actix_rt::test] async fn it_works() { let (_mock, setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -583,7 +582,7 @@ async fn it_works() { #[actix_rt::test] async fn tokenize_long_text() { let (_mock, setting) = create_mock_tokenized().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -646,7 +645,7 @@ async fn tokenize_long_text() { #[actix_rt::test] async fn bad_api_key() { let (_mock, mut setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let documents = json!([ @@ -794,7 +793,7 @@ async fn bad_api_key() { #[actix_rt::test] async fn bad_model() { let (_mock, mut setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let documents = json!([ @@ -872,7 +871,7 @@ async fn bad_model() { #[actix_rt::test] async fn bad_dimensions() { let (_mock, mut setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let documents = json!([ @@ -971,7 +970,7 @@ async fn bad_dimensions() { #[actix_rt::test] async fn smaller_dimensions() { let (_mock, setting) = create_mock_dimensions().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1203,7 +1202,7 @@ async fn smaller_dimensions() { #[actix_rt::test] async fn small_embedding_model() { let (_mock, setting) = create_mock_small_embedding_model().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1434,7 +1433,7 @@ async fn small_embedding_model() { #[actix_rt::test] async fn legacy_embedding_model() { let (_mock, setting) = create_mock_legacy_embedding_model().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1666,7 +1665,7 @@ async fn legacy_embedding_model() { #[actix_rt::test] async fn it_still_works() { let (_mock, setting) = create_fallible_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1898,7 +1897,7 @@ async fn it_still_works() { #[actix_rt::test] async fn timeout() { let (_mock, setting) = create_slow_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index diff --git a/crates/meilisearch/tests/vector/rest.rs b/crates/meilisearch/tests/vector/rest.rs index 974341cd0..6ae1f6a3c 100644 --- a/crates/meilisearch/tests/vector/rest.rs +++ b/crates/meilisearch/tests/vector/rest.rs @@ -8,11 +8,11 @@ use tokio::sync::mpsc; use wiremock::matchers::{method, path}; use wiremock::{Mock, MockServer, Request, ResponseTemplate}; -use crate::common::Value; +use crate::common::{Server, Value}; use crate::json; -use crate::vector::{get_server_vector, GetAllDocumentsOptions}; +use crate::vector::GetAllDocumentsOptions; -async fn create_mock() -> (&'static MockServer, Value) { +pub async fn create_mock() -> (&'static MockServer, Value) { let mock_server = Box::leak(Box::new(MockServer::start().await)); let text_to_embedding: BTreeMap<_, _> = vec![ @@ -395,7 +395,7 @@ async fn dummy_testing_the_mock() { async fn bad_request() { let (mock, _setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); // No placeholder string appear in the template @@ -631,7 +631,7 @@ async fn bad_request() { async fn bad_response() { let (mock, _setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); // No placeholder string appear in the template @@ -907,7 +907,7 @@ async fn bad_response() { async fn bad_settings() { let (mock, _setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1079,7 +1079,7 @@ async fn bad_settings() { #[actix_rt::test] async fn add_vector_and_user_provided() { let (_mock, setting) = create_mock().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1185,7 +1185,7 @@ async fn add_vector_and_user_provided() { #[actix_rt::test] async fn server_returns_bad_request() { let (mock, _setting) = create_mock_multiple().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1301,7 +1301,7 @@ async fn server_returns_bad_request() { #[actix_rt::test] async fn server_returns_bad_response() { let (mock, _setting) = create_mock_multiple().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1596,7 +1596,7 @@ async fn server_returns_bad_response() { #[actix_rt::test] async fn server_returns_multiple() { let (_mock, setting) = create_mock_multiple().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1702,7 +1702,7 @@ async fn server_returns_multiple() { #[actix_rt::test] async fn server_single_input_returns_in_array() { let (_mock, setting) = create_mock_single_response_in_array().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1808,7 +1808,7 @@ async fn server_single_input_returns_in_array() { #[actix_rt::test] async fn server_raw() { let (_mock, setting) = create_mock_raw().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -1915,7 +1915,7 @@ async fn server_raw() { async fn server_custom_header() { let (mock, setting) = create_mock_raw_with_custom_header().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -2044,7 +2044,7 @@ async fn server_custom_header() { #[actix_rt::test] async fn searchable_reindex() { let (_mock, setting) = create_mock_default_template().await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index @@ -2154,7 +2154,7 @@ async fn searchable_reindex() { async fn last_error_stats() { let (sender, mut receiver) = mpsc::channel(10); let (_mock, setting) = create_faulty_mock_raw(sender).await; - let server = get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index diff --git a/crates/meilisearch/tests/vector/settings.rs b/crates/meilisearch/tests/vector/settings.rs index 50253f930..4f4d0517f 100644 --- a/crates/meilisearch/tests/vector/settings.rs +++ b/crates/meilisearch/tests/vector/settings.rs @@ -258,7 +258,7 @@ async fn reset_embedder_documents() { #[actix_rt::test] async fn ollama_url_checks() { - let server = super::get_server_vector().await; + let server = Server::new().await; let index = server.index("doggo"); let (response, code) = index