mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-26 03:55:07 +08:00
Merge branch 'main' into change-matches-position-phrase-search
This commit is contained in:
commit
6c226a4580
@ -21,6 +21,7 @@ RUN set -eux; \
|
|||||||
|
|
||||||
# Run
|
# Run
|
||||||
FROM alpine:3.20
|
FROM alpine:3.20
|
||||||
|
LABEL org.opencontainers.image.source="https://github.com/meilisearch/meilisearch"
|
||||||
|
|
||||||
ENV MEILI_HTTP_ADDR 0.0.0.0:7700
|
ENV MEILI_HTTP_ADDR 0.0.0.0:7700
|
||||||
ENV MEILI_SERVER_PROVIDER docker
|
ENV MEILI_SERVER_PROVIDER docker
|
||||||
|
@ -272,6 +272,20 @@ impl<'a> Index<'a, Shared> {
|
|||||||
}
|
}
|
||||||
(task, code)
|
(task, code)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn delete_index_fail(&self) -> (Value, StatusCode) {
|
||||||
|
let (mut task, code) = self._delete().await;
|
||||||
|
if code.is_success() {
|
||||||
|
task = self.wait_task(task.uid()).await;
|
||||||
|
if task.is_success() {
|
||||||
|
panic!(
|
||||||
|
"`delete_index_fail` succeeded: {}",
|
||||||
|
serde_json::to_string_pretty(&task).unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(task, code)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
@ -314,6 +328,12 @@ impl<State> Index<'_, State> {
|
|||||||
});
|
});
|
||||||
self.service.post_encoded("/indexes", body, self.encoder).await
|
self.service.post_encoded("/indexes", 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
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn wait_task(&self, update_id: u64) -> Value {
|
pub async fn wait_task(&self, update_id: u64) -> Value {
|
||||||
// try several times to get status, or panic to not wait forever
|
// try several times to get status, or panic to not wait forever
|
||||||
let url = format!("/tasks/{}", update_id);
|
let url = format!("/tasks/{}", update_id);
|
||||||
|
@ -309,6 +309,11 @@ impl<State> Server<State> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn unique_index_with_encoder(&self, encoder: Encoder) -> Index<'_> {
|
||||||
|
let uuid = Uuid::new_v4();
|
||||||
|
Index { uid: uuid.to_string(), service: &self.service, encoder, marker: PhantomData }
|
||||||
|
}
|
||||||
|
|
||||||
pub(super) async fn _create_index(&self, body: Value) -> (Value, StatusCode) {
|
pub(super) async fn _create_index(&self, body: Value) -> (Value, StatusCode) {
|
||||||
self.service.post("/indexes", body).await
|
self.service.post("/indexes", body).await
|
||||||
}
|
}
|
||||||
|
@ -9,15 +9,15 @@ use crate::json;
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_no_primary_key() {
|
async fn create_index_no_primary_key() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("test");
|
let index = server.unique_index();
|
||||||
let (response, code) = index.create(None).await;
|
let (response, code) = index.create(None).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
assert_eq!(response["status"], "enqueued");
|
assert_eq!(response["status"], "enqueued");
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
assert_eq!(response["status"], "succeeded");
|
assert_eq!(response["status"], "succeeded");
|
||||||
assert_eq!(response["type"], "indexCreation");
|
assert_eq!(response["type"], "indexCreation");
|
||||||
@ -26,15 +26,15 @@ async fn create_index_no_primary_key() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_with_gzip_encoded_request() {
|
async fn create_index_with_gzip_encoded_request() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index_with_encoder("test", Encoder::Gzip);
|
let index = server.unique_index_with_encoder(Encoder::Gzip);
|
||||||
let (response, code) = index.create(None).await;
|
let (response, code) = index.create(None).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
assert_eq!(response["status"], "enqueued");
|
assert_eq!(response["status"], "enqueued");
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
assert_eq!(response["status"], "succeeded");
|
assert_eq!(response["status"], "succeeded");
|
||||||
assert_eq!(response["type"], "indexCreation");
|
assert_eq!(response["type"], "indexCreation");
|
||||||
@ -43,7 +43,7 @@ async fn create_index_with_gzip_encoded_request() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_with_gzip_encoded_request_and_receiving_brotli_encoded_response() {
|
async fn create_index_with_gzip_encoded_request_and_receiving_brotli_encoded_response() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let app = server.init_web_app().await;
|
let app = server.init_web_app().await;
|
||||||
|
|
||||||
let body = serde_json::to_string(&json!({
|
let body = serde_json::to_string(&json!({
|
||||||
@ -68,21 +68,20 @@ async fn create_index_with_gzip_encoded_request_and_receiving_brotli_encoded_res
|
|||||||
let parsed_response =
|
let parsed_response =
|
||||||
serde_json::from_slice::<Value>(decoded.into().as_ref()).expect("Expecting valid json");
|
serde_json::from_slice::<Value>(decoded.into().as_ref()).expect("Expecting valid json");
|
||||||
|
|
||||||
assert_eq!(parsed_response["taskUid"], 0);
|
|
||||||
assert_eq!(parsed_response["indexUid"], "test");
|
assert_eq!(parsed_response["indexUid"], "test");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_with_zlib_encoded_request() {
|
async fn create_index_with_zlib_encoded_request() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index_with_encoder("test", Encoder::Deflate);
|
let index = server.unique_index_with_encoder(Encoder::Deflate);
|
||||||
let (response, code) = index.create(None).await;
|
let (response, code) = index.create(None).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
assert_eq!(response["status"], "enqueued");
|
assert_eq!(response["status"], "enqueued");
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
assert_eq!(response["status"], "succeeded");
|
assert_eq!(response["status"], "succeeded");
|
||||||
assert_eq!(response["type"], "indexCreation");
|
assert_eq!(response["type"], "indexCreation");
|
||||||
@ -91,15 +90,15 @@ async fn create_index_with_zlib_encoded_request() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_with_brotli_encoded_request() {
|
async fn create_index_with_brotli_encoded_request() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index_with_encoder("test", Encoder::Brotli);
|
let index = server.unique_index_with_encoder(Encoder::Brotli);
|
||||||
let (response, code) = index.create(None).await;
|
let (response, code) = index.create(None).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
assert_eq!(response["status"], "enqueued");
|
assert_eq!(response["status"], "enqueued");
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
assert_eq!(response["status"], "succeeded");
|
assert_eq!(response["status"], "succeeded");
|
||||||
assert_eq!(response["type"], "indexCreation");
|
assert_eq!(response["type"], "indexCreation");
|
||||||
@ -108,15 +107,15 @@ async fn create_index_with_brotli_encoded_request() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_index_with_primary_key() {
|
async fn create_index_with_primary_key() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("test");
|
let index = server.unique_index();
|
||||||
let (response, code) = index.create(Some("primary")).await;
|
let (response, code) = index.create(Some("primary")).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
assert_eq!(response["status"], "enqueued");
|
assert_eq!(response["status"], "enqueued");
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
assert_eq!(response["status"], "succeeded");
|
assert_eq!(response["status"], "succeeded");
|
||||||
assert_eq!(response["type"], "indexCreation");
|
assert_eq!(response["type"], "indexCreation");
|
||||||
@ -127,12 +126,12 @@ async fn create_index_with_primary_key() {
|
|||||||
async fn create_index_with_invalid_primary_key() {
|
async fn create_index_with_invalid_primary_key() {
|
||||||
let documents = json!([ { "id": 2, "title": "Pride and Prejudice" } ]);
|
let documents = json!([ { "id": 2, "title": "Pride and Prejudice" } ]);
|
||||||
|
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("movies");
|
let index = server.unique_index();
|
||||||
let (_response, code) = index.add_documents(documents, Some("title")).await;
|
let (response, code) = index.add_documents(documents, Some("title")).await;
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
index.wait_task(0).await;
|
index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
let (response, code) = index.get().await;
|
let (response, code) = index.get().await;
|
||||||
assert_eq!(code, 200);
|
assert_eq!(code, 200);
|
||||||
@ -140,10 +139,10 @@ async fn create_index_with_invalid_primary_key() {
|
|||||||
|
|
||||||
let documents = json!([ { "id": "e".repeat(513) } ]);
|
let documents = json!([ { "id": "e".repeat(513) } ]);
|
||||||
|
|
||||||
let (_response, code) = index.add_documents(documents, Some("id")).await;
|
let (response, code) = index.add_documents(documents, Some("id")).await;
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
index.wait_task(1).await;
|
index.wait_task(response.uid()).await;
|
||||||
|
|
||||||
let (response, code) = index.get().await;
|
let (response, code) = index.get().await;
|
||||||
assert_eq!(code, 200);
|
assert_eq!(code, 200);
|
||||||
@ -152,19 +151,19 @@ async fn create_index_with_invalid_primary_key() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn test_create_multiple_indexes() {
|
async fn test_create_multiple_indexes() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index1 = server.index("test1");
|
let index1 = server.unique_index();
|
||||||
let index2 = server.index("test2");
|
let index2 = server.unique_index();
|
||||||
let index3 = server.index("test3");
|
let index3 = server.unique_index();
|
||||||
let index4 = server.index("test4");
|
let index4 = server.unique_index();
|
||||||
|
|
||||||
index1.create(None).await;
|
let (task1, _) = index1.create(None).await;
|
||||||
index2.create(None).await;
|
let (task2, _) = index2.create(None).await;
|
||||||
index3.create(None).await;
|
let (task3, _) = index3.create(None).await;
|
||||||
|
|
||||||
index1.wait_task(0).await;
|
index1.wait_task(task1.uid()).await.succeeded();
|
||||||
index1.wait_task(1).await;
|
index2.wait_task(task2.uid()).await.succeeded();
|
||||||
index1.wait_task(2).await;
|
index3.wait_task(task3.uid()).await.succeeded();
|
||||||
|
|
||||||
assert_eq!(index1.get().await.1, 200);
|
assert_eq!(index1.get().await.1, 200);
|
||||||
assert_eq!(index2.get().await.1, 200);
|
assert_eq!(index2.get().await.1, 200);
|
||||||
@ -174,18 +173,22 @@ async fn test_create_multiple_indexes() {
|
|||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn error_create_existing_index() {
|
async fn error_create_existing_index() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("test");
|
let index = server.unique_index();
|
||||||
let (_, code) = index.create(Some("primary")).await;
|
let (_, code) = index.create(Some("primary")).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
index.create(Some("primary")).await;
|
let (task, _) = index.create(Some("primary")).await;
|
||||||
|
|
||||||
let response = index.wait_task(1).await;
|
let response = index.wait_task(task.uid()).await;
|
||||||
|
let msg = format!(
|
||||||
|
"Index `{}` already exists.",
|
||||||
|
task["indexUid"].as_str().expect("indexUid should exist").trim_matches('"')
|
||||||
|
);
|
||||||
|
|
||||||
let expected_response = json!({
|
let expected_response = json!({
|
||||||
"message": "Index `test` already exists.",
|
"message": msg,
|
||||||
"code": "index_already_exists",
|
"code": "index_already_exists",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link":"https://docs.meilisearch.com/errors#index_already_exists"
|
"link":"https://docs.meilisearch.com/errors#index_already_exists"
|
||||||
|
@ -1,51 +1,50 @@
|
|||||||
use crate::common::Server;
|
use crate::common::{shared_does_not_exists_index, Server};
|
||||||
use crate::json;
|
use crate::json;
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn create_and_delete_index() {
|
async fn create_and_delete_index() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("test");
|
let index = server.unique_index();
|
||||||
let (_response, code) = index.create(None).await;
|
let (response, code) = index.create(None).await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
index.wait_task(0).await;
|
index.wait_task(response.uid()).await.succeeded();
|
||||||
|
|
||||||
assert_eq!(index.get().await.1, 200);
|
assert_eq!(index.get().await.1, 200);
|
||||||
|
|
||||||
let (_response, code) = index.delete().await;
|
let (response, code) = index.delete().await;
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
index.wait_task(1).await;
|
index.wait_task(response.uid()).await.succeeded();
|
||||||
|
|
||||||
assert_eq!(index.get().await.1, 404);
|
assert_eq!(index.get().await.1, 404);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn error_delete_unexisting_index() {
|
async fn error_delete_unexisting_index() {
|
||||||
let server = Server::new().await;
|
let index = shared_does_not_exists_index().await;
|
||||||
let index = server.index("test");
|
let (task, code) = index.delete_index_fail().await;
|
||||||
let (_, code) = index.delete().await;
|
|
||||||
|
|
||||||
assert_eq!(code, 202);
|
assert_eq!(code, 202);
|
||||||
|
|
||||||
let expected_response = json!({
|
let expected_response = json!({
|
||||||
"message": "Index `test` not found.",
|
"message": "Index `DOES_NOT_EXISTS` not found.",
|
||||||
"code": "index_not_found",
|
"code": "index_not_found",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link": "https://docs.meilisearch.com/errors#index_not_found"
|
"link": "https://docs.meilisearch.com/errors#index_not_found"
|
||||||
});
|
});
|
||||||
|
|
||||||
let response = index.wait_task(0).await;
|
let response = index.wait_task(task.uid()).await;
|
||||||
assert_eq!(response["status"], "failed");
|
assert_eq!(response["status"], "failed");
|
||||||
assert_eq!(response["error"], expected_response);
|
assert_eq!(response["error"], expected_response);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn loop_delete_add_documents() {
|
async fn loop_delete_add_documents() {
|
||||||
let server = Server::new().await;
|
let server = Server::new_shared();
|
||||||
let index = server.index("test");
|
let index = server.unique_index();
|
||||||
let documents = json!([{"id": 1, "field1": "hello"}]);
|
let documents = json!([{"id": 1, "field1": "hello"}]);
|
||||||
let mut tasks = Vec::new();
|
let mut tasks = Vec::new();
|
||||||
for _ in 0..50 {
|
for _ in 0..50 {
|
||||||
|
Loading…
Reference in New Issue
Block a user