From 7e9909ee45177f14eb39d77fab76f36858b11c99 Mon Sep 17 00:00:00 2001 From: Martin Tzvetanov Grigorov Date: Mon, 19 May 2025 16:10:17 +0300 Subject: [PATCH 1/7] perf: Faster index::update_index IT tests Use a shared server where possible. Assert succeeded/failed task waits. Signed-off-by: Martin Tzvetanov Grigorov --- crates/meilisearch/tests/common/index.rs | 4 ++ .../meilisearch/tests/index/update_index.rs | 55 ++++++++++--------- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/crates/meilisearch/tests/common/index.rs b/crates/meilisearch/tests/common/index.rs index 09a7d623c..24db6776b 100644 --- a/crates/meilisearch/tests/common/index.rs +++ b/crates/meilisearch/tests/common/index.rs @@ -29,6 +29,10 @@ impl<'a> Index<'a, Owned> { } } + pub fn with_encoder(&self, encoder: Encoder) -> Index<'a, Owned> { + Index { uid: self.uid.clone(), service: self.service, encoder, marker: PhantomData } + } + pub async fn load_test_set(&self) -> u64 { let url = format!("/indexes/{}/documents", urlencode(self.uid.as_ref())); let (response, code) = self diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index a9b02e7d4..8880314d4 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -7,15 +7,16 @@ use crate::json; #[actix_rt::test] async fn update_primary_key() { - let server = Server::new().await; - let index = server.index("test"); - let (_, code) = index.create(None).await; + let server = Server::new_shared(); + let index = server.unique_index(); + let (task, code) = index.create(None).await; assert_eq!(code, 202); + index.wait_task(task.uid()).await.succeeded(); let (task, _status_code) = index.update(Some("primary")).await; - let response = index.wait_task(task.uid()).await; + let response = index.wait_task(task.uid()).await.succeeded(); assert_eq!(response["status"], "succeeded"); @@ -23,7 +24,7 @@ async fn update_primary_key() { assert_eq!(code, 200); - assert_eq!(response["uid"], "test"); + assert_eq!(response["uid"], index.uid); assert!(response.get("createdAt").is_some()); assert!(response.get("updatedAt").is_some()); @@ -39,24 +40,25 @@ async fn update_primary_key() { #[actix_rt::test] async fn create_and_update_with_different_encoding() { - let server = Server::new().await; - let index = server.index_with_encoder("test", Encoder::Gzip); - let (_, code) = index.create(None).await; + let server = Server::new_shared(); + let index = server.unique_index_with_encoder(Encoder::Gzip); + let (create_task, code) = index.create(None).await; assert_eq!(code, 202); + index.wait_task(create_task.uid()).await.succeeded(); - let index = server.index_with_encoder("test", Encoder::Brotli); + let index = index.with_encoder(Encoder::Brotli); let (task, _status_code) = index.update(Some("primary")).await; - let response = index.wait_task(task.uid()).await; + let response = index.wait_task(task.uid()).await.succeeded(); assert_eq!(response["status"], "succeeded"); } #[actix_rt::test] async fn update_nothing() { - let server = Server::new().await; - let index = server.index("test"); + let server = Server::new_shared(); + let index = server.unique_index(); let (task1, code) = index.create(None).await; assert_eq!(code, 202); @@ -67,18 +69,19 @@ async fn update_nothing() { assert_eq!(code, 202); - let response = index.wait_task(task2.uid()).await; + let response = index.wait_task(task2.uid()).await.succeeded(); assert_eq!(response["status"], "succeeded"); } #[actix_rt::test] async fn error_update_existing_primary_key() { - let server = Server::new().await; - let index = server.index("test"); - let (_response, code) = index.create(Some("id")).await; + let server = Server::new_shared(); + let index = server.unique_index(); + let (create_task, code) = index.create(Some("id")).await; assert_eq!(code, 202); + index.wait_task(create_task.uid()).await.succeeded(); let documents = json!([ { @@ -86,16 +89,17 @@ async fn error_update_existing_primary_key() { "content": "foobar" } ]); - index.add_documents(documents, None).await; + let (add_docs_task, add_docs_status_code) = index.add_documents(documents, None).await; + assert_eq!(add_docs_status_code, 202); + index.wait_task(add_docs_task.uid()).await.succeeded(); - let (task, code) = index.update(Some("primary")).await; + let (update_task, code) = index.update(Some("primary")).await; assert_eq!(code, 202); - - let response = index.wait_task(task.uid()).await; + let response = index.wait_task(update_task.uid()).await.failed(); let expected_response = json!({ - "message": "Index `test`: Index already has a primary key: `id`.", + "message": format!("Index `{}`: Index already has a primary key: `id`.", index.uid), "code": "index_primary_key_already_exists", "type": "invalid_request", "link": "https://docs.meilisearch.com/errors#index_primary_key_already_exists" @@ -106,15 +110,16 @@ async fn error_update_existing_primary_key() { #[actix_rt::test] async fn error_update_unexisting_index() { - let server = Server::new().await; - let (task, code) = server.index("test").update(None).await; + let server = Server::new_shared(); + let index = server.unique_index(); + let (task, code) = index.update(None).await; assert_eq!(code, 202); - let response = server.index("test").wait_task(task.uid()).await; + let response = index.wait_task(task.uid()).await.failed(); let expected_response = json!({ - "message": "Index `test` not found.", + "message": format!("Index `{}` not found.", index.uid), "code": "index_not_found", "type": "invalid_request", "link": "https://docs.meilisearch.com/errors#index_not_found" From f77abc9dc833a669eb110a3d5fa38f5d6c437fc5 Mon Sep 17 00:00:00 2001 From: Martin Grigorov Date: Tue, 20 May 2025 11:49:27 +0300 Subject: [PATCH 2/7] Update crates/meilisearch/tests/index/update_index.rs Co-authored-by: Tamo --- crates/meilisearch/tests/index/update_index.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index 8880314d4..bc432fbd9 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -17,9 +17,6 @@ async fn update_primary_key() { let (task, _status_code) = index.update(Some("primary")).await; let response = index.wait_task(task.uid()).await.succeeded(); - - assert_eq!(response["status"], "succeeded"); - let (response, code) = index.get().await; assert_eq!(code, 200); From 025df397c037c0e02bbd2e76f5eddac6c1f7576b Mon Sep 17 00:00:00 2001 From: Martin Grigorov Date: Tue, 20 May 2025 11:49:38 +0300 Subject: [PATCH 3/7] Update crates/meilisearch/tests/index/update_index.rs Co-authored-by: Tamo --- crates/meilisearch/tests/index/update_index.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index bc432fbd9..7f8325020 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -47,9 +47,7 @@ async fn create_and_update_with_different_encoding() { let index = index.with_encoder(Encoder::Brotli); let (task, _status_code) = index.update(Some("primary")).await; - let response = index.wait_task(task.uid()).await.succeeded(); - - assert_eq!(response["status"], "succeeded"); + index.wait_task(task.uid()).await.succeeded(); } #[actix_rt::test] From 65354b414a6af43e06f53cb67677c21d4163cabe Mon Sep 17 00:00:00 2001 From: Martin Grigorov Date: Tue, 20 May 2025 11:49:45 +0300 Subject: [PATCH 4/7] Update crates/meilisearch/tests/index/update_index.rs Co-authored-by: Tamo --- crates/meilisearch/tests/index/update_index.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index 7f8325020..dd7ab9df7 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -64,9 +64,7 @@ async fn update_nothing() { assert_eq!(code, 202); - let response = index.wait_task(task2.uid()).await.succeeded(); - - assert_eq!(response["status"], "succeeded"); + index.wait_task(task2.uid()).await.succeeded(); } #[actix_rt::test] From f87e46cc16fa17f0d9d09150c31e8578b840917c Mon Sep 17 00:00:00 2001 From: Martin Tzvetanov Grigorov Date: Tue, 20 May 2025 13:43:48 +0300 Subject: [PATCH 5/7] Ignore the result from #wait_task() Signed-off-by: Martin Tzvetanov Grigorov --- crates/meilisearch/tests/index/update_index.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index dd7ab9df7..c32828c9e 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -15,8 +15,8 @@ async fn update_primary_key() { index.wait_task(task.uid()).await.succeeded(); let (task, _status_code) = index.update(Some("primary")).await; - - let response = index.wait_task(task.uid()).await.succeeded(); + index.wait_task(task.uid()).await.succeeded(); + let (response, code) = index.get().await; assert_eq!(code, 200); From b658e38acdbc3c2b52b4eebcffc278b0af605c6e Mon Sep 17 00:00:00 2001 From: Martin Tzvetanov Grigorov Date: Tue, 20 May 2025 13:53:51 +0300 Subject: [PATCH 6/7] Fix formatting Signed-off-by: Martin Tzvetanov Grigorov --- crates/meilisearch/tests/index/update_index.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index c32828c9e..a17e7c63f 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -16,7 +16,7 @@ async fn update_primary_key() { let (task, _status_code) = index.update(Some("primary")).await; index.wait_task(task.uid()).await.succeeded(); - + let (response, code) = index.get().await; assert_eq!(code, 200); From b4ca0a8c985b07161550a36fe012f834f961aa00 Mon Sep 17 00:00:00 2001 From: Martin Tzvetanov Grigorov Date: Fri, 23 May 2025 23:44:07 +0300 Subject: [PATCH 7/7] Update the tests related to updating indices Signed-off-by: Martin Tzvetanov Grigorov --- crates/meilisearch/tests/common/index.rs | 22 ++++++++++++++++ .../meilisearch/tests/index/update_index.rs | 26 ++++--------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/crates/meilisearch/tests/common/index.rs b/crates/meilisearch/tests/common/index.rs index 24db6776b..e324d2ff5 100644 --- a/crates/meilisearch/tests/common/index.rs +++ b/crates/meilisearch/tests/common/index.rs @@ -294,6 +294,20 @@ impl Index<'_, Shared> { } (task, code) } + + pub async fn update_index_fail(&self, primary_key: Option<&str>) -> (Value, StatusCode) { + let (mut task, code) = self._update(primary_key).await; + if code.is_success() { + task = self.wait_task(task.uid()).await; + if task.is_success() { + panic!( + "`update_index_fail` succeeded: {}", + serde_json::to_string_pretty(&task).unwrap() + ); + } + } + (task, code) + } } #[allow(dead_code)] @@ -337,6 +351,14 @@ impl Index<'_, State> { self.service.post_encoded("/indexes", body, self.encoder).await } + pub(super) async fn _update(&self, primary_key: Option<&str>) -> (Value, StatusCode) { + let body = json!({ + "primaryKey": primary_key, + }); + let url = format!("/indexes/{}", urlencode(self.uid.as_ref())); + self.service.patch_encoded(url, body, self.encoder).await + } + pub(super) async fn _delete(&self) -> (Value, StatusCode) { let url = format!("/indexes/{}", urlencode(self.uid.as_ref())); self.service.delete(url).await diff --git a/crates/meilisearch/tests/index/update_index.rs b/crates/meilisearch/tests/index/update_index.rs index a17e7c63f..291700728 100644 --- a/crates/meilisearch/tests/index/update_index.rs +++ b/crates/meilisearch/tests/index/update_index.rs @@ -2,7 +2,7 @@ use time::format_description::well_known::Rfc3339; use time::OffsetDateTime; use crate::common::encoder::Encoder; -use crate::common::Server; +use crate::common::{shared_does_not_exists_index, shared_index_with_documents, Server}; use crate::json; #[actix_rt::test] @@ -69,24 +69,9 @@ async fn update_nothing() { #[actix_rt::test] async fn error_update_existing_primary_key() { - let server = Server::new_shared(); - let index = server.unique_index(); - let (create_task, code) = index.create(Some("id")).await; + let index = shared_index_with_documents().await; - assert_eq!(code, 202); - index.wait_task(create_task.uid()).await.succeeded(); - - let documents = json!([ - { - "id": "11", - "content": "foobar" - } - ]); - let (add_docs_task, add_docs_status_code) = index.add_documents(documents, None).await; - assert_eq!(add_docs_status_code, 202); - index.wait_task(add_docs_task.uid()).await.succeeded(); - - let (update_task, code) = index.update(Some("primary")).await; + let (update_task, code) = index.update_index_fail(Some("primary")).await; assert_eq!(code, 202); let response = index.wait_task(update_task.uid()).await.failed(); @@ -103,9 +88,8 @@ async fn error_update_existing_primary_key() { #[actix_rt::test] async fn error_update_unexisting_index() { - let server = Server::new_shared(); - let index = server.unique_index(); - let (task, code) = index.update(None).await; + let index = shared_does_not_exists_index().await; + let (task, code) = index.update_index_fail(Some("my-primary-key")).await; assert_eq!(code, 202);