diff --git a/Cargo.lock b/Cargo.lock index aa6f99b8a..d985635be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,7 +37,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "assert-json-diff" version = "1.0.1" -source = "git+https://github.com/qdequele/assert-json-diff#29bdf99315e510abb2824ccb9353b3a7a330cbc4" +source = "git+https://github.com/qdequele/assert-json-diff#9012a0c8866d0f2db0ef9a6242e4a19d1e8c67e4" dependencies = [ "serde 1.0.102 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/meilisearch-http/src/routes/mod.rs b/meilisearch-http/src/routes/mod.rs index 31be1cacf..93b7e1391 100644 --- a/meilisearch-http/src/routes/mod.rs +++ b/meilisearch-http/src/routes/mod.rs @@ -96,7 +96,7 @@ pub fn load_routes(app: &mut tide::Server) { .post(|ctx| into_response(setting::update_displayed(ctx))) .delete(|ctx| into_response(setting::delete_displayed(ctx))); - app.at("/indexes/:index/settings/index-new-field") + app.at("/indexes/:index/settings/accept-new-fields") .get(|ctx| into_response(setting::get_accept_new_fields(ctx))) .post(|ctx| into_response(setting::update_accept_new_fields(ctx))); diff --git a/meilisearch-http/tests/common.rs b/meilisearch-http/tests/common.rs index 3836d4d74..7acb1c8a2 100644 --- a/meilisearch-http/tests/common.rs +++ b/meilisearch-http/tests/common.rs @@ -58,7 +58,7 @@ impl Server { let response: Value = serde_json::from_slice(&buf).unwrap(); if response["status"] == "processed" { - eprintln!("{:?}", response); + eprintln!("{:#?}", response); return; } block_on(sleep(Duration::from_secs(1))); diff --git a/meilisearch-http/tests/settings.rs b/meilisearch-http/tests/settings.rs index ecd5e107a..2f9c7c43c 100644 --- a/meilisearch-http/tests/settings.rs +++ b/meilisearch-http/tests/settings.rs @@ -117,8 +117,8 @@ fn write_all_and_delete() { "vote_average", "popularity" ], - "stopWords": null, - "synonyms": null, + "stopWords": [], + "synonyms": {}, "acceptNewFields": true, }); @@ -242,7 +242,7 @@ fn write_all_and_update() { "rank", "poster", ], - "stopWords": null, + "stopWords": [], "synonyms": { "wolverine": ["xmen", "logan"], "logan": ["wolverine", "xmen"], diff --git a/meilisearch-http/tests/settings_accept_new_fields.rs b/meilisearch-http/tests/settings_accept_new_fields.rs new file mode 100644 index 000000000..6157e7cb5 --- /dev/null +++ b/meilisearch-http/tests/settings_accept_new_fields.rs @@ -0,0 +1,290 @@ +use assert_json_diff::assert_json_eq; +use serde_json::json; + +mod common; + +#[test] +fn index_new_fields_default() { + let mut server = common::Server::with_uid("movies"); + let body = json!({ + "uid": "movies", + "identifier": "id", + }); + server.create_index(body); + + // 1 - Add a document + + let body = json!([{ + "id": 1, + "title": "I'm a legend", + }]); + + server.add_or_replace_multiple_documents(body); + + // 2 - Get the complete document + + let expected = json!({ + "id": 1, + "title": "I'm a legend", + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + // 3 - Add a document with more fields + + let body = json!([{ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }]); + + server.add_or_replace_multiple_documents(body); + + // 4 - Get the complete document + + let expected = json!({ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }); + + let (response, status_code) = server.get_document(2); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); +} + +#[test] +fn index_new_fields_true() { + let mut server = common::Server::with_uid("movies"); + let body = json!({ + "uid": "movies", + "identifier": "id", + }); + server.create_index(body); + + // 1 - Set indexNewFields = true + + server.update_accept_new_fields(json!(true)); + + // 2 - Add a document + + let body = json!([{ + "id": 1, + "title": "I'm a legend", + }]); + + server.add_or_replace_multiple_documents(body); + + // 3 - Get the complete document + + let expected = json!({ + "id": 1, + "title": "I'm a legend", + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + // 4 - Add a document with more fields + + let body = json!([{ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }]); + + server.add_or_replace_multiple_documents(body); + + // 5 - Get the complete document + + let expected = json!({ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }); + + let (response, status_code) = server.get_document(2); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); +} + +#[test] +fn index_new_fields_false() { + let mut server = common::Server::with_uid("movies"); + let body = json!({ + "uid": "movies", + "identifier": "id", + }); + server.create_index(body); + + // 1 - Set indexNewFields = false + + server.update_accept_new_fields(json!(false)); + + // 2 - Add a document + + let body = json!([{ + "id": 1, + "title": "I'm a legend", + }]); + + server.add_or_replace_multiple_documents(body); + + // 3 - Get the complete document + + let expected = json!({ + "id": 1, + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + // 4 - Add a document with more fields + + let body = json!([{ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }]); + + server.add_or_replace_multiple_documents(body); + + // 5 - Get the complete document + + let expected = json!({ + "id": 2, + }); + + let (response, status_code) = server.get_document(2); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); +} + +#[test] +fn index_new_fields_true_then_false() { + let mut server = common::Server::with_uid("movies"); + let body = json!({ + "uid": "movies", + "identifier": "id", + }); + server.create_index(body); + + // 1 - Set indexNewFields = true + + server.update_accept_new_fields(json!(true)); + + // 2 - Add a document + + let body = json!([{ + "id": 1, + "title": "I'm a legend", + }]); + + server.add_or_replace_multiple_documents(body); + + // 3 - Get the complete document + + let expected = json!({ + "id": 1, + "title": "I'm a legend", + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + // 4 - Set indexNewFields = false + + server.update_accept_new_fields(json!(false)); + + // 5 - Add a document with more fields + + let body = json!([{ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }]); + + server.add_or_replace_multiple_documents(body); + + // 6 - Get the complete document + + let expected = json!({ + "id": 2, + "title": "I'm not a legend", + }); + + let (response, status_code) = server.get_document(2); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); +} + +#[test] +fn index_new_fields_false_then_true() { + let mut server = common::Server::with_uid("movies"); + let body = json!({ + "uid": "movies", + "identifier": "id", + }); + server.create_index(body); + + // 1 - Set indexNewFields = false + + server.update_accept_new_fields(json!(false)); + + // 2 - Add a document + + let body = json!([{ + "id": 1, + "title": "I'm a legend", + }]); + + server.add_or_replace_multiple_documents(body); + + // 3 - Get the complete document + + let expected = json!({ + "id": 1, + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + // 4 - Set indexNewFields = false + + server.update_accept_new_fields(json!(true)); + + // 5 - Add a document with more fields + + let body = json!([{ + "id": 2, + "title": "I'm not a legend", + "description": "A bad copy of the original movie I'm a lengend" + }]); + + server.add_or_replace_multiple_documents(body); + + // 6 - Get the complete document + + let expected = json!({ + "id": 1, + }); + + let (response, status_code) = server.get_document(1); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); + + let expected = json!({ + "id": 2, + "description": "A bad copy of the original movie I'm a lengend" + }); + + let (response, status_code) = server.get_document(2); + assert_eq!(status_code, 200); + assert_json_eq!(response, expected); +}