2022-11-28 16:27:41 +01:00
use meili_snap ::insta ::{ self , assert_json_snapshot } ;
2021-12-02 16:03:26 +01:00
use serde_json ::json ;
2022-02-14 15:32:41 +01:00
use time ::format_description ::well_known ::Rfc3339 ;
use time ::OffsetDateTime ;
2021-12-02 16:03:26 +01:00
2022-10-20 18:00:07 +02:00
use crate ::common ::Server ;
2021-12-02 16:03:26 +01:00
#[ actix_rt::test ]
async fn error_get_unexisting_task_status ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
let ( response , code ) = index . get_task ( 1 ) . await ;
let expected_response = json! ( {
" message " : " Task `1` not found. " ,
" code " : " task_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#task-not-found "
2021-12-02 16:03:26 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 404 ) ;
}
#[ actix_rt::test ]
async fn get_task_status ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index
. add_documents (
serde_json ::json! ( [ {
" id " : 1 ,
" content " : " foobar " ,
} ] ) ,
None ,
)
. await ;
index . wait_task ( 0 ) . await ;
let ( _response , code ) = index . get_task ( 1 ) . await ;
assert_eq! ( code , 200 ) ;
2022-06-27 17:58:11 -05:00
// TODO check response format, as per #48
2021-12-02 16:03:26 +01:00
}
#[ actix_rt::test ]
async fn list_tasks ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
index
2022-10-20 18:00:07 +02:00
. add_documents ( serde_json ::from_str ( include_str! ( " ../assets/test_set.json " ) ) . unwrap ( ) , None )
2021-12-02 16:03:26 +01:00
. await ;
let ( response , code ) = index . list_tasks ( ) . await ;
assert_eq! ( code , 200 ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
}
2022-05-30 13:59:27 +02:00
#[ actix_rt::test ]
2022-05-30 17:12:53 +02:00
async fn list_tasks_with_star_filters ( ) {
2022-05-30 13:59:27 +02:00
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
index
2022-10-20 18:00:07 +02:00
. add_documents ( serde_json ::from_str ( include_str! ( " ../assets/test_set.json " ) ) . unwrap ( ) , None )
2022-05-30 13:59:27 +02:00
. await ;
2022-11-28 16:27:41 +01:00
let ( response , code ) = index . service . get ( " /tasks?indexUids=test " ) . await ;
2022-05-30 13:59:27 +02:00
assert_eq! ( code , 200 ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
2022-11-28 16:27:41 +01:00
let ( response , code ) = index . service . get ( " /tasks?indexUids=* " ) . await ;
2022-05-30 13:59:27 +02:00
assert_eq! ( code , 200 ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
2022-11-28 16:27:41 +01:00
let ( response , code ) = index . service . get ( " /tasks?indexUids=*,pasteque " ) . await ;
2022-05-30 13:59:27 +02:00
assert_eq! ( code , 200 ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
2022-05-30 17:12:53 +02:00
2022-11-28 16:27:41 +01:00
let ( response , code ) = index . service . get ( " /tasks?types=* " ) . await ;
2022-05-30 17:12:53 +02:00
assert_eq! ( code , 200 ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
2022-10-20 18:00:07 +02:00
let ( response , code ) =
2022-11-28 16:27:41 +01:00
index . service . get ( " /tasks?types=*,documentAdditionOrUpdate&statuses=* " ) . await ;
2022-05-30 17:12:53 +02:00
assert_eq! ( code , 200 , " {:?} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
let ( response , code ) = index
. service
2022-11-28 16:27:41 +01:00
. get ( " /tasks?types=*,documentAdditionOrUpdate&statuses=*,failed&indexUids=test " )
2022-05-30 17:12:53 +02:00
. await ;
assert_eq! ( code , 200 , " {:?} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
let ( response , code ) = index
. service
2022-11-28 16:27:41 +01:00
. get ( " /tasks?types=*,documentAdditionOrUpdate&statuses=*,failed&indexUids=test,* " )
2022-05-30 17:12:53 +02:00
. await ;
assert_eq! ( code , 200 , " {:?} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
2022-05-30 13:59:27 +02:00
}
2022-05-18 12:07:06 +02:00
#[ actix_rt::test ]
async fn list_tasks_status_filtered ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
index
2022-10-20 18:00:07 +02:00
. add_documents ( serde_json ::from_str ( include_str! ( " ../assets/test_set.json " ) ) . unwrap ( ) , None )
2022-05-18 12:07:06 +02:00
. await ;
let ( response , code ) = index . filtered_tasks ( & [ ] , & [ " succeeded " ] ) . await ;
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 1 ) ;
2022-05-25 12:05:24 +02:00
// We can't be sure that the update isn't already processed so we can't test this
// let (response, code) = index.filtered_tasks(&[], &["processing"]).await;
// assert_eq!(code, 200, "{}", response);
// assert_eq!(response["results"].as_array().unwrap().len(), 1);
2022-05-18 12:07:06 +02:00
index . wait_task ( 1 ) . await ;
let ( response , code ) = index . filtered_tasks ( & [ ] , & [ " succeeded " ] ) . await ;
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
}
#[ actix_rt::test ]
async fn list_tasks_type_filtered ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
index
2022-10-20 18:00:07 +02:00
. add_documents ( serde_json ::from_str ( include_str! ( " ../assets/test_set.json " ) ) . unwrap ( ) , None )
2022-05-18 12:07:06 +02:00
. await ;
let ( response , code ) = index . filtered_tasks ( & [ " indexCreation " ] , & [ ] ) . await ;
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 1 ) ;
2022-10-20 18:00:07 +02:00
let ( response , code ) =
index . filtered_tasks ( & [ " indexCreation " , " documentAdditionOrUpdate " ] , & [ ] ) . await ;
2022-05-18 12:07:06 +02:00
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
}
#[ actix_rt::test ]
async fn list_tasks_status_and_type_filtered ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
index
2022-10-20 18:00:07 +02:00
. add_documents ( serde_json ::from_str ( include_str! ( " ../assets/test_set.json " ) ) . unwrap ( ) , None )
2022-05-18 12:07:06 +02:00
. await ;
let ( response , code ) = index . filtered_tasks ( & [ " indexCreation " ] , & [ " failed " ] ) . await ;
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 0 ) ;
let ( response , code ) = index
. filtered_tasks (
2022-05-25 12:05:24 +02:00
& [ " indexCreation " , " documentAdditionOrUpdate " ] ,
2022-06-02 10:21:19 +02:00
& [ " succeeded " , " processing " , " enqueued " ] ,
2022-05-18 12:07:06 +02:00
)
. await ;
assert_eq! ( code , 200 , " {} " , response ) ;
assert_eq! ( response [ " results " ] . as_array ( ) . unwrap ( ) . len ( ) , 2 ) ;
}
2022-11-28 16:27:41 +01:00
#[ actix_rt::test ]
async fn get_task_filter_error ( ) {
let server = Server ::new ( ) . await ;
let ( response , code ) = server . tasks_filter ( json! ( { " lol " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query deserialize error: unknown field `lol` " ,
" code " : " bad_request " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#bad-request "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . tasks_filter ( json! ( { " uids " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Task uid `pied` is invalid. It should only contain numeric characters. " ,
2022-12-14 13:00:43 +01:00
" code " : " invalid_task_uids " ,
2022-11-28 16:27:41 +01:00
" type " : " invalid_request " ,
2022-12-14 13:00:43 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-task-uids "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . tasks_filter ( json! ( { " from " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query deserialize error: invalid digit found in string " ,
" code " : " bad_request " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#bad-request "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . tasks_filter ( json! ( { " beforeStartedAt " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Task `beforeStartedAt` `pied` is invalid. It should follow the YYYY-MM-DD or RFC 3339 date-time format. " ,
2022-12-14 13:00:43 +01:00
" code " : " invalid_task_before_started_at " ,
2022-11-28 16:27:41 +01:00
" type " : " invalid_request " ,
2022-12-14 13:00:43 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-task-before-started-at "
2022-11-28 16:27:41 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn delete_task_filter_error ( ) {
let server = Server ::new ( ) . await ;
let ( response , code ) = server . delete_tasks ( json! ( null ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query parameters to filter the tasks to delete are missing. Available query parameters are: `uids`, `indexUids`, `statuses`, `types`, `beforeEnqueuedAt`, `afterEnqueuedAt`, `beforeStartedAt`, `afterStartedAt`, `beforeFinishedAt`, `afterFinishedAt`. " ,
" code " : " missing_task_filters " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-task-filters "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . delete_tasks ( json! ( { " lol " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query deserialize error: unknown field `lol` " ,
" code " : " bad_request " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#bad-request "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . delete_tasks ( json! ( { " uids " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Task uid `pied` is invalid. It should only contain numeric characters. " ,
2022-12-14 13:00:43 +01:00
" code " : " invalid_task_uids " ,
2022-11-28 16:27:41 +01:00
" type " : " invalid_request " ,
2022-12-14 13:00:43 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-task-uids "
2022-11-28 16:27:41 +01:00
}
" ###);
}
#[ actix_rt::test ]
async fn cancel_task_filter_error ( ) {
let server = Server ::new ( ) . await ;
let ( response , code ) = server . cancel_tasks ( json! ( null ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query parameters to filter the tasks to cancel are missing. Available query parameters are: `uids`, `indexUids`, `statuses`, `types`, `beforeEnqueuedAt`, `afterEnqueuedAt`, `beforeStartedAt`, `afterStartedAt`, `beforeFinishedAt`, `afterFinishedAt`. " ,
" code " : " missing_task_filters " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-task-filters "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . cancel_tasks ( json! ( { " lol " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Query deserialize error: unknown field `lol` " ,
" code " : " bad_request " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#bad-request "
2022-11-28 16:27:41 +01:00
}
" ###);
let ( response , code ) = server . cancel_tasks ( json! ( { " uids " : " pied " } ) ) . await ;
assert_eq! ( code , 400 , " {} " , response ) ;
insta ::assert_json_snapshot! ( response , @ r ###"
{
" message " : " Task uid `pied` is invalid. It should only contain numeric characters. " ,
2022-12-14 13:00:43 +01:00
" code " : " invalid_task_uids " ,
2022-11-28 16:27:41 +01:00
" type " : " invalid_request " ,
2022-12-14 13:00:43 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-task-uids "
2022-11-28 16:27:41 +01:00
}
" ###);
}
2021-12-02 16:03:26 +01:00
macro_rules ! assert_valid_summarized_task {
( $response :expr , $task_type :literal , $index :literal ) = > { {
assert_eq! ( $response . as_object ( ) . unwrap ( ) . len ( ) , 5 ) ;
2022-05-17 11:17:32 +02:00
assert! ( $response [ " taskUid " ] . as_u64 ( ) . is_some ( ) ) ;
2021-12-02 16:03:26 +01:00
assert_eq! ( $response [ " indexUid " ] , $index ) ;
assert_eq! ( $response [ " status " ] , " enqueued " ) ;
assert_eq! ( $response [ " type " ] , $task_type ) ;
let date = $response [ " enqueuedAt " ] . as_str ( ) . expect ( " missing date " ) ;
2022-02-14 15:32:41 +01:00
OffsetDateTime ::parse ( date , & Rfc3339 ) . unwrap ( ) ;
2021-12-02 16:03:26 +01:00
} } ;
}
#[ actix_web::test ]
async fn test_summarized_task_view ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
let ( response , _ ) = index . create ( None ) . await ;
assert_valid_summarized_task! ( response , " indexCreation " , " test " ) ;
let ( response , _ ) = index . update ( None ) . await ;
assert_valid_summarized_task! ( response , " indexUpdate " , " test " ) ;
let ( response , _ ) = index . update_settings ( json! ( { } ) ) . await ;
assert_valid_summarized_task! ( response , " settingsUpdate " , " test " ) ;
let ( response , _ ) = index . update_documents ( json! ( [ { " id " : 1 } ] ) , None ) . await ;
2022-05-25 12:05:24 +02:00
assert_valid_summarized_task! ( response , " documentAdditionOrUpdate " , " test " ) ;
2021-12-02 16:03:26 +01:00
let ( response , _ ) = index . add_documents ( json! ( [ { " id " : 1 } ] ) , None ) . await ;
2022-05-25 12:05:24 +02:00
assert_valid_summarized_task! ( response , " documentAdditionOrUpdate " , " test " ) ;
2021-12-02 16:03:26 +01:00
let ( response , _ ) = index . delete_document ( 1 ) . await ;
2021-12-15 09:49:39 +01:00
assert_valid_summarized_task! ( response , " documentDeletion " , " test " ) ;
2021-12-02 16:03:26 +01:00
let ( response , _ ) = index . clear_all_documents ( ) . await ;
2022-05-25 12:05:24 +02:00
assert_valid_summarized_task! ( response , " documentDeletion " , " test " ) ;
2021-12-02 16:03:26 +01:00
let ( response , _ ) = index . delete ( ) . await ;
assert_valid_summarized_task! ( response , " indexDeletion " , " test " ) ;
}
2022-10-26 11:09:44 +02:00
#[ actix_web::test ]
async fn test_summarized_document_addition_or_update ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . add_documents ( json! ( { " id " : 42 , " content " : " doggos & fluff " } ) , None ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " documentAdditionOrUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" receivedDocuments " : 1 ,
" indexedDocuments " : 1
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . add_documents ( json! ( { " id " : 42 , " content " : " doggos & fluff " } ) , Some ( " id " ) ) . await ;
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 1 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " documentAdditionOrUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" receivedDocuments " : 1 ,
" indexedDocuments " : 1
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_delete_batch ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . delete_batch ( vec! [ 1 , 2 , 3 ] ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " documentDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-11-28 16:27:41 +01:00
" providedIds " : 3 ,
" deletedDocuments " : 0
2022-10-26 11:09:44 +02:00
} ,
" error " : {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-not-found "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . create ( None ) . await ;
index . delete_batch ( vec! [ 42 ] ) . await ;
index . wait_task ( 2 ) . await ;
let ( task , _ ) = index . get_task ( 2 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 2 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " documentDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-11-28 16:27:41 +01:00
" providedIds " : 1 ,
2022-10-26 11:09:44 +02:00
" deletedDocuments " : 0
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_delete_document ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . delete_document ( 1 ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " documentDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-11-28 16:27:41 +01:00
" providedIds " : 1 ,
" deletedDocuments " : 0
2022-10-26 11:09:44 +02:00
} ,
" error " : {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-not-found "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . create ( None ) . await ;
index . delete_document ( 42 ) . await ;
index . wait_task ( 2 ) . await ;
let ( task , _ ) = index . get_task ( 2 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 2 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " documentDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-11-28 16:27:41 +01:00
" providedIds " : 1 ,
2022-10-26 11:09:44 +02:00
" deletedDocuments " : 0
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_settings_update ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
// here we should find my payload even in the failed task.
index . update_settings ( json! ( { " rankingRules " : [ " custom " ] } ) ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
dbg! ( & task ) ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " settingsUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" rankingRules " : [
" custom "
]
} ,
" error " : {
" message " : " `custom` ranking rule is invalid. Valid ranking rules are words, typo, sort, proximity, attribute, exactness and custom ranking rules. " ,
2023-01-09 18:59:09 +01:00
" code " : " invalid_settings_ranking_rules " ,
2022-10-26 11:09:44 +02:00
" type " : " invalid_request " ,
2023-01-09 18:59:09 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-settings-ranking-rules "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . update_settings ( json! ( { " displayedAttributes " : [ " doggos " , " name " ] , " filterableAttributes " : [ " age " , " nb_paw_pads " ] , " sortableAttributes " : [ " iq " ] } ) ) . await ;
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 1 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " settingsUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" displayedAttributes " : [
" doggos " ,
" name "
] ,
" filterableAttributes " : [
" age " ,
" nb_paw_pads "
] ,
" sortableAttributes " : [
" iq "
]
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_index_creation ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " indexCreation " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : null
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . create ( Some ( " doggos " ) ) . await ;
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 1 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " indexCreation " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : " doggos "
} ,
" error " : {
" message " : " Index `test` already exists. " ,
" code " : " index_already_exists " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-already-exists "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_index_deletion ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
index . delete ( ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " indexDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
" details " : {
" deletedDocuments " : 0
} ,
2022-10-26 11:09:44 +02:00
" error " : {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-not-found "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
// is the details correctly set when documents are actually deleted.
index . add_documents ( json! ( { " id " : 42 , " content " : " doggos & fluff " } ) , Some ( " id " ) ) . await ;
index . delete ( ) . await ;
index . wait_task ( 2 ) . await ;
let ( task , _ ) = index . get_task ( 2 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 2 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " indexDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" deletedDocuments " : 1
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
// What happens when you delete an index that doesn't exists.
index . delete ( ) . await ;
index . wait_task ( 2 ) . await ;
let ( task , _ ) = index . get_task ( 2 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 2 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " indexDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" deletedDocuments " : 1
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_index_update ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " test " ) ;
// If the index doesn't exist yet, we should get errors with or without the primary key.
index . update ( None ) . await ;
index . wait_task ( 0 ) . await ;
let ( task , _ ) = index . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 0 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " indexUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : null
} ,
" error " : {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-not-found "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . update ( Some ( " bones " ) ) . await ;
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 1 ,
" indexUid " : " test " ,
" status " : " failed " ,
" type " : " indexUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : " bones "
} ,
" error " : {
" message " : " Index `test` not found. " ,
" code " : " index_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#index-not-found "
2022-10-26 11:09:44 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
// And run the same two tests once the index do exists.
index . create ( None ) . await ;
index . update ( None ) . await ;
index . wait_task ( 3 ) . await ;
let ( task , _ ) = index . get_task ( 3 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 3 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " indexUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : null
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
index . update ( Some ( " bones " ) ) . await ;
index . wait_task ( 4 ) . await ;
let ( task , _ ) = index . get_task ( 4 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 4 ,
" indexUid " : " test " ,
" status " : " succeeded " ,
" type " : " indexUpdate " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
" primaryKey " : " bones "
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_index_swap ( ) {
let server = Server ::new ( ) . await ;
2022-10-27 00:56:34 +02:00
server
2022-10-26 11:09:44 +02:00
. index_swap ( json! ( [
{ " indexes " : [ " doggos " , " cattos " ] }
] ) )
. await ;
2022-10-27 00:56:34 +02:00
server . wait_task ( 0 ) . await ;
let ( task , _ ) = server . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
2022-10-26 11:09:44 +02:00
{
2022-10-27 00:56:34 +02:00
" uid " : 0 ,
" indexUid " : null ,
" status " : " failed " ,
" type " : " indexSwap " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-27 00:56:34 +02:00
" details " : {
" swaps " : [
{
" indexes " : [
" doggos " ,
" cattos "
]
}
]
} ,
" error " : {
2022-10-27 09:41:32 +02:00
" message " : " Indexes `cattos`, `doggos` not found. " ,
2023-01-05 23:21:44 +01:00
" code " : " invalid_swap_indexes " ,
2022-10-27 00:56:34 +02:00
" type " : " invalid_request " ,
2023-01-05 23:21:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-swap-indexes "
2022-10-27 00:56:34 +02:00
} ,
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
2022-10-26 11:09:44 +02:00
}
" ###);
2022-10-26 13:58:38 +02:00
2022-10-26 11:09:44 +02:00
server . index ( " doggos " ) . create ( None ) . await ;
server . index ( " cattos " ) . create ( None ) . await ;
2022-10-27 01:06:03 +02:00
server
2022-10-26 11:09:44 +02:00
. index_swap ( json! ( [
{ " indexes " : [ " doggos " , " cattos " ] }
] ) )
. await ;
2022-10-27 00:56:34 +02:00
server . wait_task ( 3 ) . await ;
let ( task , _ ) = server . get_task ( 3 ) . await ;
2022-10-26 11:09:44 +02:00
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
2022-10-27 00:56:34 +02:00
" uid " : 3 ,
2022-10-26 11:09:44 +02:00
" indexUid " : null ,
" status " : " succeeded " ,
" type " : " indexSwap " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-10-26 13:58:38 +02:00
" swaps " : [
{
" indexes " : [
" doggos " ,
" cattos "
]
}
2022-10-26 11:09:44 +02:00
]
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_task_cancelation ( ) {
let server = Server ::new ( ) . await ;
let index = server . index ( " doggos " ) ;
2022-10-26 11:23:51 +02:00
// to avoid being flaky we're only going to cancel an already finished task :(
2022-10-26 11:09:44 +02:00
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
2022-11-28 16:27:41 +01:00
server . cancel_tasks ( json! ( { " uids " : [ 0 ] } ) ) . await ;
2022-10-26 11:09:44 +02:00
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
2022-10-26 11:23:51 +02:00
" uid " : 1 ,
" indexUid " : null ,
2022-10-26 11:09:44 +02:00
" status " : " succeeded " ,
2022-10-26 11:23:51 +02:00
" type " : " taskCancelation " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:09:44 +02:00
" details " : {
2022-10-26 11:23:51 +02:00
" matchedTasks " : 1 ,
" canceledTasks " : 0 ,
2022-11-28 16:27:41 +01:00
" originalFilter " : " ?uids=0 "
2022-10-26 11:09:44 +02:00
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:23:51 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
2022-10-26 11:09:44 +02:00
}
" ###);
}
#[ actix_web::test ]
async fn test_summarized_task_deletion ( ) {
let server = Server ::new ( ) . await ;
2022-10-26 11:23:51 +02:00
let index = server . index ( " doggos " ) ;
// to avoid being flaky we're only going to delete an already finished task :(
index . create ( None ) . await ;
index . wait_task ( 0 ) . await ;
2022-11-28 16:27:41 +01:00
server . delete_tasks ( json! ( { " uids " : [ 0 ] } ) ) . await ;
2022-10-26 11:23:51 +02:00
index . wait_task ( 1 ) . await ;
let ( task , _ ) = index . get_task ( 1 ) . await ;
assert_json_snapshot! ( task ,
{ " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
@ r ###"
{
" uid " : 1 ,
" indexUid " : null ,
" status " : " succeeded " ,
" type " : " taskDeletion " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
2022-10-26 11:23:51 +02:00
" details " : {
" matchedTasks " : 1 ,
" deletedTasks " : 1 ,
2022-11-28 16:27:41 +01:00
" originalFilter " : " ?uids=0 "
2022-10-26 11:23:51 +02:00
} ,
2022-11-28 16:27:41 +01:00
" error " : null ,
2022-10-26 11:23:51 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
2022-10-26 11:09:44 +02:00
}
#[ actix_web::test ]
async fn test_summarized_dump_creation ( ) {
let server = Server ::new ( ) . await ;
server . create_dump ( ) . await ;
server . wait_task ( 0 ) . await ;
let ( task , _ ) = server . get_task ( 0 ) . await ;
assert_json_snapshot! ( task ,
2022-11-28 16:27:41 +01:00
{ " .details.dumpUid " = > " [dumpUid] " , " .duration " = > " [duration] " , " .enqueuedAt " = > " [date] " , " .startedAt " = > " [date] " , " .finishedAt " = > " [date] " } ,
2022-10-26 11:09:44 +02:00
@ r ###"
{
" uid " : 0 ,
" indexUid " : null ,
" status " : " succeeded " ,
" type " : " dumpCreation " ,
2022-11-28 16:27:41 +01:00
" canceledBy " : null ,
" details " : {
" dumpUid " : " [dumpUid] "
} ,
" error " : null ,
2022-10-26 11:09:44 +02:00
" duration " : " [duration] " ,
" enqueuedAt " : " [date] " ,
" startedAt " : " [date] " ,
" finishedAt " : " [date] "
}
" ###);
}