mirror of
https://github.com/meilisearch/meilisearch.git
synced 2025-07-27 00:31:02 +00:00
Merge branch 'request-fragments-test' into fragment-filters
This commit is contained in:
@ -2499,7 +2499,7 @@ pub struct LocalMeiliParams {
|
|||||||
|
|
||||||
/// A server that exploits [`MockServer`] to provide an URL for testing network and the network.
|
/// A server that exploits [`MockServer`] to provide an URL for testing network and the network.
|
||||||
pub struct LocalMeili {
|
pub struct LocalMeili {
|
||||||
mock_server: MockServer,
|
mock_server: &'static MockServer,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LocalMeili {
|
impl LocalMeili {
|
||||||
@ -2508,7 +2508,7 @@ impl LocalMeili {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn with_params(server: Arc<Server>, params: LocalMeiliParams) -> Self {
|
pub async fn with_params(server: Arc<Server>, params: LocalMeiliParams) -> Self {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
// tokio won't let us execute asynchronous code from a sync function inside of an async test,
|
// tokio won't let us execute asynchronous code from a sync function inside of an async test,
|
||||||
// so instead we spawn another thread that will call the service on a brand new tokio runtime
|
// so instead we spawn another thread that will call the service on a brand new tokio runtime
|
||||||
@ -2572,7 +2572,7 @@ impl LocalMeili {
|
|||||||
response.set_body_json(value)
|
response.set_body_json(value)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
Self { mock_server }
|
Self { mock_server }
|
||||||
}
|
}
|
||||||
|
@ -33,7 +33,7 @@ async fn fragment_mock_server() -> String {
|
|||||||
.into_iter()
|
.into_iter()
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
Mock::given(method("POST"))
|
Mock::given(method("POST"))
|
||||||
.and(path("/"))
|
.and(path("/"))
|
||||||
@ -50,7 +50,7 @@ async fn fragment_mock_server() -> String {
|
|||||||
}
|
}
|
||||||
ResponseTemplate::new(200).set_body_json(json!({ "data": data }))
|
ResponseTemplate::new(200).set_body_json(json!({ "data": data }))
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
mock_server.uri()
|
mock_server.uri()
|
||||||
@ -2203,6 +2203,7 @@ async fn both_fragments_and_document_template() {
|
|||||||
"#);
|
"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[ignore = "failing due to issue #5746"]
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
async fn set_fragments_then_document_template() {
|
async fn set_fragments_then_document_template() {
|
||||||
let (server, uid, settings) = init_fragments_index().await;
|
let (server, uid, settings) = init_fragments_index().await;
|
||||||
@ -2232,87 +2233,7 @@ async fn set_fragments_then_document_template() {
|
|||||||
|
|
||||||
let (settings, code) = index.settings().await;
|
let (settings, code) = index.settings().await;
|
||||||
snapshot!(code, @"200 OK");
|
snapshot!(code, @"200 OK");
|
||||||
snapshot!(settings, @r#"
|
snapshot!(settings, @r#""#); // Should have removed fragments
|
||||||
{
|
|
||||||
"displayedAttributes": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"searchableAttributes": [
|
|
||||||
"*"
|
|
||||||
],
|
|
||||||
"filterableAttributes": [],
|
|
||||||
"sortableAttributes": [],
|
|
||||||
"rankingRules": [
|
|
||||||
"words",
|
|
||||||
"typo",
|
|
||||||
"proximity",
|
|
||||||
"attribute",
|
|
||||||
"sort",
|
|
||||||
"exactness"
|
|
||||||
],
|
|
||||||
"stopWords": [],
|
|
||||||
"nonSeparatorTokens": [],
|
|
||||||
"separatorTokens": [],
|
|
||||||
"dictionary": [],
|
|
||||||
"synonyms": {},
|
|
||||||
"distinctAttribute": null,
|
|
||||||
"proximityPrecision": "byWord",
|
|
||||||
"typoTolerance": {
|
|
||||||
"enabled": true,
|
|
||||||
"minWordSizeForTypos": {
|
|
||||||
"oneTypo": 5,
|
|
||||||
"twoTypos": 9
|
|
||||||
},
|
|
||||||
"disableOnWords": [],
|
|
||||||
"disableOnAttributes": [],
|
|
||||||
"disableOnNumbers": false
|
|
||||||
},
|
|
||||||
"faceting": {
|
|
||||||
"maxValuesPerFacet": 100,
|
|
||||||
"sortFacetValuesBy": {
|
|
||||||
"*": "alpha"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pagination": {
|
|
||||||
"maxTotalHits": 1000
|
|
||||||
},
|
|
||||||
"embedders": {
|
|
||||||
"rest": {
|
|
||||||
"source": "rest",
|
|
||||||
"dimensions": 3,
|
|
||||||
"url": "http://127.0.0.1:55578",
|
|
||||||
"indexingFragments": {
|
|
||||||
"basic": {
|
|
||||||
"value": "{{ doc.name }} is a dog"
|
|
||||||
},
|
|
||||||
"withBreed": {
|
|
||||||
"value": "{{ doc.name }} is a {{ doc.breed }}"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"searchFragments": {
|
|
||||||
"justBreed": {
|
|
||||||
"value": "It's a {{ media.breed }}"
|
|
||||||
},
|
|
||||||
"justName": {
|
|
||||||
"value": "{{ media.name }} is a dog"
|
|
||||||
},
|
|
||||||
"query": {
|
|
||||||
"value": "Some pre-prompt for query {{ q }}"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"request": "{{fragment}}",
|
|
||||||
"response": {
|
|
||||||
"data": "{{embedding}}"
|
|
||||||
},
|
|
||||||
"headers": {}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"searchCutoffMs": null,
|
|
||||||
"localizedAttributes": null,
|
|
||||||
"facetSearch": true,
|
|
||||||
"prefixSearch": "indexingTime"
|
|
||||||
}
|
|
||||||
"#);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[actix_rt::test]
|
#[actix_rt::test]
|
||||||
@ -2340,4 +2261,29 @@ async fn composite() {
|
|||||||
"semanticHitCount": 1
|
"semanticHitCount": 1
|
||||||
}
|
}
|
||||||
"#);
|
"#);
|
||||||
|
|
||||||
|
let (value, code) = index
|
||||||
|
.search_post(
|
||||||
|
json!({"q": "bulldog", "hybrid": {"semanticRatio": 1.0, "embedder": "rest"}, "limit": 1}
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await;
|
||||||
|
snapshot!(code, @"200 OK");
|
||||||
|
snapshot!(value, @r#"
|
||||||
|
{
|
||||||
|
"hits": [
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"name": "dustin",
|
||||||
|
"breed": "bulldog"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"query": "bulldog",
|
||||||
|
"processingTimeMs": "[duration]",
|
||||||
|
"limit": 1,
|
||||||
|
"offset": 0,
|
||||||
|
"estimatedTotalHits": 4,
|
||||||
|
"semanticHitCount": 1
|
||||||
|
}
|
||||||
|
"#);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ fn long_text() -> &'static str {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_tokenized() -> (MockServer, Value) {
|
async fn create_mock_tokenized() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template("{{doc.text}}", ModelDimensions::Large, false, false).await
|
create_mock_with_template("{{doc.text}}", ModelDimensions::Large, false, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,8 +145,8 @@ async fn create_mock_with_template(
|
|||||||
model_dimensions: ModelDimensions,
|
model_dimensions: ModelDimensions,
|
||||||
fallible: bool,
|
fallible: bool,
|
||||||
slow: bool,
|
slow: bool,
|
||||||
) -> (MockServer, Value) {
|
) -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
const API_KEY: &str = "my-api-key";
|
const API_KEY: &str = "my-api-key";
|
||||||
const API_KEY_BEARER: &str = "Bearer my-api-key";
|
const API_KEY_BEARER: &str = "Bearer my-api-key";
|
||||||
|
|
||||||
@ -299,7 +299,7 @@ async fn create_mock_with_template(
|
|||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -321,27 +321,27 @@ const DOGGO_TEMPLATE: &str = r#"{%- if doc.gender == "F" -%}Une chienne nommée
|
|||||||
Un chien nommé {{doc.name}}, né en {{doc.birthyear}}
|
Un chien nommé {{doc.name}}, né en {{doc.birthyear}}
|
||||||
{%- endif %}, de race {{doc.breed}}."#;
|
{%- endif %}, de race {{doc.breed}}."#;
|
||||||
|
|
||||||
async fn create_mock() -> (MockServer, Value) {
|
async fn create_mock() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, false, false).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, false, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_dimensions() -> (MockServer, Value) {
|
async fn create_mock_dimensions() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large512, false, false).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large512, false, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_small_embedding_model() -> (MockServer, Value) {
|
async fn create_mock_small_embedding_model() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Small, false, false).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Small, false, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_legacy_embedding_model() -> (MockServer, Value) {
|
async fn create_mock_legacy_embedding_model() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Ada, false, false).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Ada, false, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_fallible_mock() -> (MockServer, Value) {
|
async fn create_fallible_mock() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, true, false).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, true, false).await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_slow_mock() -> (MockServer, Value) {
|
async fn create_slow_mock() -> (&'static MockServer, Value) {
|
||||||
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, true, true).await
|
create_mock_with_template(DOGGO_TEMPLATE, ModelDimensions::Large, true, true).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,8 @@ use crate::common::Value;
|
|||||||
use crate::json;
|
use crate::json;
|
||||||
use crate::vector::{get_server_vector, GetAllDocumentsOptions};
|
use crate::vector::{get_server_vector, GetAllDocumentsOptions};
|
||||||
|
|
||||||
async fn create_mock() -> (MockServer, Value) {
|
async fn create_mock() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -32,7 +32,7 @@ async fn create_mock() -> (MockServer, Value) {
|
|||||||
json!({ "data": text_to_embedding.get(text.as_str()).unwrap_or(&[99., 99., 99.]) }),
|
json!({ "data": text_to_embedding.get(text.as_str()).unwrap_or(&[99., 99., 99.]) }),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -50,8 +50,8 @@ async fn create_mock() -> (MockServer, Value) {
|
|||||||
(mock_server, embedder_settings)
|
(mock_server, embedder_settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_default_template() -> (MockServer, Value) {
|
async fn create_mock_default_template() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -73,7 +73,7 @@ async fn create_mock_default_template() -> (MockServer, Value) {
|
|||||||
.set_body_json(json!({"error": "text not found", "text": text})),
|
.set_body_json(json!({"error": "text not found", "text": text})),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -106,8 +106,8 @@ struct SingleResponse {
|
|||||||
embedding: Vec<f32>,
|
embedding: Vec<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_multiple() -> (MockServer, Value) {
|
async fn create_mock_multiple() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -146,7 +146,7 @@ async fn create_mock_multiple() -> (MockServer, Value) {
|
|||||||
|
|
||||||
ResponseTemplate::new(200).set_body_json(response)
|
ResponseTemplate::new(200).set_body_json(response)
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -176,8 +176,8 @@ struct SingleRequest {
|
|||||||
input: String,
|
input: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_single_response_in_array() -> (MockServer, Value) {
|
async fn create_mock_single_response_in_array() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -212,7 +212,7 @@ async fn create_mock_single_response_in_array() -> (MockServer, Value) {
|
|||||||
|
|
||||||
ResponseTemplate::new(200).set_body_json(response)
|
ResponseTemplate::new(200).set_body_json(response)
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -236,8 +236,8 @@ async fn create_mock_single_response_in_array() -> (MockServer, Value) {
|
|||||||
(mock_server, embedder_settings)
|
(mock_server, embedder_settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_raw_with_custom_header() -> (MockServer, Value) {
|
async fn create_mock_raw_with_custom_header() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -277,7 +277,7 @@ async fn create_mock_raw_with_custom_header() -> (MockServer, Value) {
|
|||||||
|
|
||||||
ResponseTemplate::new(200).set_body_json(output)
|
ResponseTemplate::new(200).set_body_json(output)
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -293,8 +293,8 @@ async fn create_mock_raw_with_custom_header() -> (MockServer, Value) {
|
|||||||
(mock_server, embedder_settings)
|
(mock_server, embedder_settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_mock_raw() -> (MockServer, Value) {
|
async fn create_mock_raw() -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
|
|
||||||
let text_to_embedding: BTreeMap<_, _> = vec![
|
let text_to_embedding: BTreeMap<_, _> = vec![
|
||||||
// text -> embedding
|
// text -> embedding
|
||||||
@ -321,7 +321,7 @@ async fn create_mock_raw() -> (MockServer, Value) {
|
|||||||
|
|
||||||
ResponseTemplate::new(200).set_body_json(output)
|
ResponseTemplate::new(200).set_body_json(output)
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
|
||||||
@ -337,8 +337,8 @@ async fn create_mock_raw() -> (MockServer, Value) {
|
|||||||
(mock_server, embedder_settings)
|
(mock_server, embedder_settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn create_faulty_mock_raw(sender: mpsc::Sender<()>) -> (MockServer, Value) {
|
async fn create_faulty_mock_raw(sender: mpsc::Sender<()>) -> (&'static MockServer, Value) {
|
||||||
let mock_server = MockServer::start().await;
|
let mock_server = Box::leak(Box::new(MockServer::start().await));
|
||||||
let count = AtomicUsize::new(0);
|
let count = AtomicUsize::new(0);
|
||||||
|
|
||||||
Mock::given(method("POST"))
|
Mock::given(method("POST"))
|
||||||
@ -355,7 +355,7 @@ async fn create_faulty_mock_raw(sender: mpsc::Sender<()>) -> (MockServer, Value)
|
|||||||
ResponseTemplate::new(500).set_body_string("Service Unavailable")
|
ResponseTemplate::new(500).set_body_string("Service Unavailable")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.mount(&mock_server)
|
.mount(mock_server)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
let url = mock_server.uri();
|
let url = mock_server.uri();
|
||||||
|
Reference in New Issue
Block a user