2022-10-20 18:00:07 +02:00
use std ::{ thread , time } ;
2021-11-08 18:31:27 +01:00
use assert_json_diff ::assert_json_include ;
2022-02-02 18:18:17 +01:00
use serde_json ::{ json , Value } ;
2022-10-20 18:00:07 +02:00
use crate ::common ::Server ;
2021-11-08 18:31:27 +01:00
#[ actix_rt::test ]
async fn add_valid_api_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
2022-05-23 17:03:28 +02:00
" name " : " indexing-key " ,
2021-11-08 18:31:27 +01:00
" description " : " Indexing API key " ,
2022-05-23 17:03:28 +02:00
" uid " : " 4bc0887a-0e41-4f3b-935d-0c451dcee9c8 " ,
2021-11-08 18:31:27 +01:00
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2021-12-20 14:44:34 +01:00
let expected_response = json! ( {
2022-05-23 17:03:28 +02:00
" name " : " indexing-key " ,
2021-12-20 14:44:34 +01:00
" description " : " Indexing API key " ,
2022-05-23 17:03:28 +02:00
" uid " : " 4bc0887a-0e41-4f3b-935d-0c451dcee9c8 " ,
2022-07-05 14:13:20 +02:00
" key " : " d9e776b8412f1db6974c9a5556b961c3559440b6588216f4ea5d9ed49f7c8f3c " ,
2021-12-20 14:44:34 +01:00
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected_response ) ;
}
#[ actix_rt::test ]
async fn add_valid_api_key_expired_at ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13 "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
2021-12-20 14:44:34 +01:00
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected_response ) ;
}
#[ actix_rt::test ]
async fn add_valid_api_key_no_description ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-12-06 15:45:41 +01:00
" expiresAt " : " 2050-11-13T00:00:00 "
2021-11-08 18:31:27 +01:00
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
let expected_response = json! ( {
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" indexes " : [
" products "
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected_response ) ;
}
2022-02-02 18:18:17 +01:00
#[ actix_rt::test ]
async fn add_valid_api_key_null_description ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : Value ::Null ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2022-02-02 18:18:17 +01:00
" expiresAt " : " 2050-11-13T00:00:00 "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2022-02-02 18:18:17 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
let expected_response = json! ( {
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2022-02-02 18:18:17 +01:00
" indexes " : [
" products "
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected_response ) ;
}
2021-11-08 18:31:27 +01:00
#[ actix_rt::test ]
async fn error_add_api_key_no_header ( ) {
let server = Server ::new_auth ( ) . await ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 401 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The Authorization header is missing. It must use the bearer authorization method. " ,
" code " : " missing_authorization_header " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-authorization-header "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_add_api_key_bad_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " d4000bd7225f77d1eb22cc706ed36772bbc36767c016a27f76def7537b68600d " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 403 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The provided API key is invalid. " ,
" code " : " invalid_api_key " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_add_api_key_missing_parameter ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
// missing indexes
let content = json! ( {
" description " : " Indexing API key " ,
2021-12-06 15:45:41 +01:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " `indexes` field is mandatory. " ,
2023-01-08 13:03:23 +01:00
" code " : " missing_api_key_indexes " ,
2021-11-08 18:31:27 +01:00
" type " : " invalid_request " ,
2023-01-08 13:03:23 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-api-key-indexes "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
// missing actions
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " `actions` field is mandatory. " ,
2023-01-08 13:03:23 +01:00
" code " : " missing_api_key_actions " ,
2021-11-08 18:31:27 +01:00
" type " : " invalid_request " ,
2023-01-08 13:03:23 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-api-key-actions "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
2021-12-06 15:45:41 +01:00
// missing expiration date
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [ " documents.add " ] ,
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
let expected_response = json! ( {
" message " : " `expiresAt` field is mandatory. " ,
2023-01-08 13:03:23 +01:00
" code " : " missing_api_key_expires_at " ,
2021-12-06 15:45:41 +01:00
" type " : " invalid_request " ,
2023-01-08 13:03:23 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-api-key-expires-at "
2021-12-06 15:45:41 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
2021-11-08 18:31:27 +01:00
}
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_description ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : { " name " :" products " } ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : r #" `description` field value `{ " name " : " products " }` is invalid. It should be a string or specified as a null value. " #,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_description " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-description "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
2022-05-23 17:03:28 +02:00
}
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_name ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" name " : { " name " :" products " } ,
" indexes " : [ " products " ] ,
" actions " : [ " documents.add " ] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
assert_eq! ( 400 , code , " {:?} " , & response ) ;
let expected_response = json! ( {
" message " : r #" `name` field value `{ " name " : " products " }` is invalid. It should be a string or specified as a null value. " #,
" code " : " invalid_api_key_name " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-name "
2022-05-23 17:03:28 +02:00
} ) ;
assert_eq! ( response , expected_response ) ;
2021-11-08 18:31:27 +01:00
}
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_indexes ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : { " name " :" products " } ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-11-28 16:27:41 +01:00
" message " : r #" `indexes` field value `{ " name " : " products " }` is invalid. It should be an array of string representing index names. " #,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_indexes " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-indexes "
2021-11-08 18:31:27 +01:00
} ) ;
2022-05-23 17:03:28 +02:00
assert_eq! ( response , expected_response ) ;
2021-11-08 18:31:27 +01:00
}
2022-06-06 12:45:52 +02:00
#[ actix_rt::test ]
async fn error_add_api_key_invalid_index_uids ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : Value ::Null ,
" indexes " : [ " invalid index # / \\ name with spaces " ] ,
" actions " : [
" documents.add "
] ,
" expiresAt " : " 2050-11-13T00:00:00 "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
let expected_response = json! ( {
2022-11-28 16:27:41 +01:00
" message " : r #" `invalid index # / \n ame with spaces` is not a valid index uid. Index uid can be an integer or a string containing only alphanumeric characters, hyphens (-) and underscores (_). " #,
2022-06-06 12:45:52 +02:00
" code " : " invalid_api_key_indexes " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-indexes "
2022-06-06 12:45:52 +02:00
} ) ;
assert_eq! ( response , expected_response ) ;
assert_eq! ( code , 400 ) ;
}
2021-11-08 18:31:27 +01:00
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_actions ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : { " name " :" products " } ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : r #" `actions` field value `{ " name " : " products " }` is invalid. It should be an array of string representing action names. " #,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_actions " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-actions "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" doc.add "
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : r #" `actions` field value `[ " doc . add " ]` is invalid. It should be an array of string representing action names. " #,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_actions " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-actions "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_expires_at ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-11-08 18:31:27 +01:00
" expiresAt " : { " name " :" products " }
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : r #" `expiresAt` field value `{ " name " : " products " }` is invalid. It should follow the RFC 3339 format to represents a date or datetime in the future or specified as a null value. e.g. 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS'. " #,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_expires_at " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-expires-at "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
2021-12-06 15:45:41 +01:00
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_expires_at_in_the_past ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" actions " : [ " documents.add " ] ,
2021-12-06 15:45:41 +01:00
" expiresAt " : " 2010-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : r #" `expiresAt` field value ` " 2010 - 11 - 13 T00 :00 :00 Z " ` is invalid. It should follow the RFC 3339 format to represents a date or datetime in the future or specified as a null value. e.g. 'YYYY-MM-DD' or 'YYYY-MM-DD HH:MM:SS'. " #,
2021-12-06 15:45:41 +01:00
" code " : " invalid_api_key_expires_at " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-expires-at "
2021-12-06 15:45:41 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
2022-05-23 17:03:28 +02:00
}
#[ actix_rt::test ]
async fn error_add_api_key_invalid_parameters_uid ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" uid " : " aaaaabbbbbccc " ,
" indexes " : [ " products " ] ,
" actions " : [ " documents.add " ] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
assert_eq! ( 400 , code , " {:?} " , & response ) ;
let expected_response = json! ( {
2022-06-01 14:11:56 +02:00
" message " : r #" `uid` field value ` " aaaaabbbbbccc " ` is invalid. It should be a valid UUID v4 string or omitted. " #,
2022-05-23 17:03:28 +02:00
" code " : " invalid_api_key_uid " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-uid "
2022-05-23 17:03:28 +02:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_add_api_key_parameters_uid_already_exist ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" uid " : " 4bc0887a-0e41-4f3b-935d-0c451dcee9c8 " ,
" indexes " : [ " products " ] ,
" actions " : [ " search " ] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
// first creation is valid.
let ( response , code ) = server . add_api_key ( content . clone ( ) ) . await ;
assert_eq! ( 201 , code , " {:?} " , & response ) ;
// uid already exist.
let ( response , code ) = server . add_api_key ( content ) . await ;
assert_eq! ( 409 , code , " {:?} " , & response ) ;
let expected_response = json! ( {
2022-06-01 14:11:56 +02:00
" message " : " `uid` field value `4bc0887a-0e41-4f3b-935d-0c451dcee9c8` is already an existing API key. " ,
2022-05-23 17:03:28 +02:00
" code " : " api_key_already_exists " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#api-key-already-exists "
2022-05-23 17:03:28 +02:00
} ) ;
assert_eq! ( response , expected_response ) ;
2021-12-06 15:45:41 +01:00
}
2021-11-08 18:31:27 +01:00
#[ actix_rt::test ]
async fn get_api_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
2022-05-23 17:03:28 +02:00
let uid = " 4bc0887a-0e41-4f3b-935d-0c451dcee9c8 " ;
2021-11-08 18:31:27 +01:00
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" uid " : uid . to_string ( ) ,
2021-11-08 18:31:27 +01:00
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
let key = response [ " key " ] . as_str ( ) . unwrap ( ) ;
let expected_response = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
2022-05-23 17:03:28 +02:00
" uid " : uid . to_string ( ) ,
2021-11-08 18:31:27 +01:00
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
2022-05-23 17:03:28 +02:00
// get with uid
let ( response , code ) = server . get_api_key ( & uid ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
assert_json_include! ( actual : response , expected : & expected_response ) ;
// get with key
let ( response , code ) = server . get_api_key ( & key ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
assert_json_include! ( actual : response , expected : & expected_response ) ;
2021-11-08 18:31:27 +01:00
}
#[ actix_rt::test ]
async fn error_get_api_key_no_header ( ) {
let server = Server ::new_auth ( ) . await ;
let ( response , code ) = server
. get_api_key ( " d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 401 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The Authorization header is missing. It must use the bearer authorization method. " ,
" code " : " missing_authorization_header " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-authorization-header "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_get_api_key_bad_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " d4000bd7225f77d1eb22cc706ed36772bbc36767c016a27f76def7537b68600d " ) ;
let ( response , code ) = server
. get_api_key ( " d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 403 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The provided API key is invalid. " ,
" code " : " invalid_api_key " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_get_api_key_not_found ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let ( response , code ) = server
. get_api_key ( " d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 404 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " API key `d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4` not found. " ,
" code " : " api_key_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#api-key-not-found "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn list_api_keys ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . add_api_key ( content ) . await ;
2021-11-08 18:31:27 +01:00
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let ( response , code ) = server . list_api_keys ( ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 200 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
2022-01-04 14:10:30 +01:00
let expected_response = json! ( { " results " :
2022-06-07 12:03:10 +02:00
[
{
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ,
{
" name " : " Default Search API Key " ,
" description " : " Use it to search from the frontend " ,
" indexes " : [ " * " ] ,
" actions " : [ " search " ] ,
" expiresAt " : serde_json ::Value ::Null ,
} ,
{
" name " : " Default Admin API Key " ,
" description " : " Use it for anything that is not a search operation. Caution! Do not expose it on a public frontend " ,
" indexes " : [ " * " ] ,
" actions " : [ " * " ] ,
" expiresAt " : serde_json ::Value ::Null ,
}
] ,
" limit " : 20 ,
" offset " : 0 ,
" total " : 3 ,
} ) ;
2021-11-08 18:31:27 +01:00
2021-12-06 15:45:41 +01:00
assert_json_include! ( actual : response , expected : expected_response ) ;
2021-11-08 18:31:27 +01:00
}
#[ actix_rt::test ]
async fn error_list_api_keys_no_header ( ) {
let server = Server ::new_auth ( ) . await ;
let ( response , code ) = server . list_api_keys ( ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 401 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The Authorization header is missing. It must use the bearer authorization method. " ,
" code " : " missing_authorization_header " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-authorization-header "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_list_api_keys_bad_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " d4000bd7225f77d1eb22cc706ed36772bbc36767c016a27f76def7537b68600d " ) ;
let ( response , code ) = server . list_api_keys ( ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 403 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The provided API key is invalid. " ,
" code " : " invalid_api_key " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn delete_api_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" tasks.get " ,
" settings.get " ,
" settings.update " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . delete_api_key ( & uid ) . await ;
assert_eq! ( 204 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
// check if API key no longer exist.
2022-05-31 15:31:16 +02:00
let ( response , code ) = server . get_api_key ( & uid ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 404 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
}
#[ actix_rt::test ]
async fn error_delete_api_key_no_header ( ) {
let server = Server ::new_auth ( ) . await ;
let ( response , code ) = server
. delete_api_key ( " d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 401 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The Authorization header is missing. It must use the bearer authorization method. " ,
" code " : " missing_authorization_header " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-authorization-header "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_delete_api_key_bad_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " d4000bd7225f77d1eb22cc706ed36772bbc36767c016a27f76def7537b68600d " ) ;
let ( response , code ) = server
. delete_api_key ( " d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 403 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The provided API key is invalid. " ,
" code " : " invalid_api_key " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_delete_api_key_not_found ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let ( response , code ) = server
. delete_api_key ( " d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " )
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 404 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " API key `d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4` not found. " ,
" code " : " api_key_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#api-key-not-found "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn patch_api_key_description ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
let created_at = response [ " createdAt " ] . as_str ( ) . unwrap ( ) ;
let updated_at = response [ " updatedAt " ] . as_str ( ) . unwrap ( ) ;
// Add a description
let content = json! ( { " description " : " Indexing API key " } ) ;
2021-12-06 15:45:41 +01:00
thread ::sleep ( time ::Duration ::new ( 1 , 0 ) ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert_ne! ( response [ " updatedAt " ] . as_str ( ) . unwrap ( ) , updated_at ) ;
assert_eq! ( response [ " createdAt " ] . as_str ( ) . unwrap ( ) , created_at ) ;
let expected = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
// Change the description
2022-05-23 17:03:28 +02:00
let content = json! ( { " description " : " Product API key " } ) ;
2021-11-08 18:31:27 +01:00
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
let expected = json! ( {
2022-05-23 17:03:28 +02:00
" description " : " Product API key " ,
2021-11-08 18:31:27 +01:00
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
// Remove the description
let content = json! ( { " description " : serde_json ::Value ::Null } ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
let expected = json! ( {
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
}
#[ actix_rt::test ]
2022-05-23 17:03:28 +02:00
async fn patch_api_key_name ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
assert_eq! ( 201 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
let created_at = response [ " createdAt " ] . as_str ( ) . unwrap ( ) ;
let updated_at = response [ " updatedAt " ] . as_str ( ) . unwrap ( ) ;
// Add a name
let content = json! ( { " name " : " Indexing API key " } ) ;
thread ::sleep ( time ::Duration ::new ( 1 , 0 ) ) ;
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert_ne! ( response [ " updatedAt " ] . as_str ( ) . unwrap ( ) , updated_at ) ;
assert_eq! ( response [ " createdAt " ] . as_str ( ) . unwrap ( ) , created_at ) ;
let expected = json! ( {
" name " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
// Change the name
let content = json! ( { " name " : " Product API key " } ) ;
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
let expected = json! ( {
" name " : " Product API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
// Remove the name
let content = json! ( { " name " : serde_json ::Value ::Null } ) ;
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 200 , code , " {:?} " , & response ) ;
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " expiresAt " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
let expected = json! ( {
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
" indexes.create " ,
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
}
#[ actix_rt::test ]
2022-06-01 14:11:56 +02:00
async fn error_patch_api_key_indexes ( ) {
2021-11-08 18:31:27 +01:00
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
let content = json! ( { " indexes " : [ " products " , " prices " ] } ) ;
2021-12-06 15:45:41 +01:00
thread ::sleep ( time ::Duration ::new ( 1 , 0 ) ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
2022-06-01 14:11:56 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
2022-06-02 11:11:07 +02:00
let expected = json! ( { " message " : " The `indexes` field cannot be modified for the given resource. " ,
2022-06-01 14:11:56 +02:00
" code " : " immutable_field " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#immutable-field "
2021-11-08 18:31:27 +01:00
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
}
#[ actix_rt::test ]
2022-06-01 14:11:56 +02:00
async fn error_patch_api_key_actions ( ) {
2021-11-08 18:31:27 +01:00
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
let content = json! ( {
" actions " : [
" search " ,
" documents.get " ,
" indexes.get " ,
" tasks.get " ,
" settings.get " ,
] ,
} ) ;
2021-12-06 15:45:41 +01:00
thread ::sleep ( time ::Duration ::new ( 1 , 0 ) ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
2022-06-01 14:11:56 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
2022-06-02 11:11:07 +02:00
let expected = json! ( { " message " : " The `actions` field cannot be modified for the given resource. " ,
2022-06-01 14:11:56 +02:00
" code " : " immutable_field " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#immutable-field "
2021-11-08 18:31:27 +01:00
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
}
#[ actix_rt::test ]
2022-06-01 14:11:56 +02:00
async fn error_patch_api_key_expiration_date ( ) {
2021-11-08 18:31:27 +01:00
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
" documents.add " ,
" documents.get " ,
" documents.delete " ,
2021-12-06 15:45:41 +01:00
" indexes.create " ,
2021-11-08 18:31:27 +01:00
" indexes.get " ,
" indexes.update " ,
" indexes.delete " ,
" stats.get " ,
" dumps.create " ,
] ,
2021-12-06 15:45:41 +01:00
" expiresAt " : " 2050-11-13T00:00:00Z "
2021-11-08 18:31:27 +01:00
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
assert! ( response [ " createdAt " ] . is_string ( ) ) ;
assert! ( response [ " updatedAt " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
let content = json! ( { " expiresAt " : " 2055-11-13T00:00:00Z " } ) ;
2021-12-06 15:45:41 +01:00
thread ::sleep ( time ::Duration ::new ( 1 , 0 ) ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
2022-06-01 14:11:56 +02:00
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
2022-06-02 11:11:07 +02:00
let expected = json! ( { " message " : " The `expiresAt` field cannot be modified for the given resource. " ,
2022-06-01 14:11:56 +02:00
" code " : " immutable_field " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#immutable-field "
2021-11-08 18:31:27 +01:00
} ) ;
assert_json_include! ( actual : response , expected : expected ) ;
}
#[ actix_rt::test ]
async fn error_patch_api_key_no_header ( ) {
let server = Server ::new_auth ( ) . await ;
let ( response , code ) = server
. patch_api_key (
" d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " ,
json! ( { } ) ,
)
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 401 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The Authorization header is missing. It must use the bearer authorization method. " ,
" code " : " missing_authorization_header " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-authorization-header "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_patch_api_key_bad_key ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " d4000bd7225f77d1eb22cc706ed36772bbc36767c016a27f76def7537b68600d " ) ;
let ( response , code ) = server
. patch_api_key (
" d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " ,
json! ( { } ) ,
)
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 403 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " The provided API key is invalid. " ,
" code " : " invalid_api_key " ,
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_patch_api_key_not_found ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let ( response , code ) = server
. patch_api_key (
" d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4 " ,
json! ( { } ) ,
)
. await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( 404 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
" message " : " API key `d0552b41d0552b41536279a0ad88bd595327b96f01176a60c2243e906c52ac02375f9bc4` not found. " ,
" code " : " api_key_not_found " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#api-key-not-found "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
#[ actix_rt::test ]
async fn error_patch_api_key_indexes_invalid_parameters ( ) {
let mut server = Server ::new_auth ( ) . await ;
server . use_api_key ( " MASTER_KEY " ) ;
let content = json! ( {
" description " : " Indexing API key " ,
" indexes " : [ " products " ] ,
" actions " : [
" search " ,
] ,
" expiresAt " : " 2050-11-13T00:00:00Z "
} ) ;
let ( response , code ) = server . add_api_key ( content ) . await ;
// must pass if add_valid_api_key test passes.
2022-05-23 17:03:28 +02:00
assert_eq! ( 201 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
assert! ( response [ " key " ] . is_string ( ) ) ;
2022-05-23 17:03:28 +02:00
let uid = response [ " uid " ] . as_str ( ) . unwrap ( ) ;
2021-11-08 18:31:27 +01:00
// invalid description
let content = json! ( {
" description " : 13
} ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-02-14 15:32:41 +01:00
" message " : " `description` field value `13` is invalid. It should be a string or specified as a null value. " ,
2021-11-08 18:31:27 +01:00
" code " : " invalid_api_key_description " ,
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-description "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
2022-05-23 17:03:28 +02:00
// invalid name
2021-11-08 18:31:27 +01:00
let content = json! ( {
2022-05-23 17:03:28 +02:00
" name " : 13
2021-11-08 18:31:27 +01:00
} ) ;
2022-05-23 17:03:28 +02:00
let ( response , code ) = server . patch_api_key ( & uid , content ) . await ;
assert_eq! ( 400 , code , " {:?} " , & response ) ;
2021-11-08 18:31:27 +01:00
let expected_response = json! ( {
2022-05-23 17:03:28 +02:00
" message " : " `name` field value `13` is invalid. It should be a string or specified as a null value. " ,
" code " : " invalid_api_key_name " ,
2021-11-08 18:31:27 +01:00
" type " : " invalid_request " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#invalid-api-key-name "
2021-11-08 18:31:27 +01:00
} ) ;
assert_eq! ( response , expected_response ) ;
}
2021-12-06 15:45:41 +01:00
#[ actix_rt::test ]
async fn error_access_api_key_routes_no_master_key_set ( ) {
let mut server = Server ::new ( ) . await ;
let expected_response = json! ( {
2022-10-25 19:11:48 +02:00
" message " : " Meilisearch is running without a master key. To access this API endpoint, you must have set a master key at launch. " ,
" code " : " missing_master_key " ,
2021-12-06 15:45:41 +01:00
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-master-key "
2021-12-06 15:45:41 +01:00
} ) ;
let expected_code = 401 ;
let ( response , code ) = server . add_api_key ( json! ( { } ) ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . patch_api_key ( " content " , json! ( { } ) ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . get_api_key ( " content " ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . list_api_keys ( ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
server . use_api_key ( " MASTER_KEY " ) ;
2022-11-28 16:27:41 +01:00
let expected_response = json! ( {
" message " : " Meilisearch is running without a master key. To access this API endpoint, you must have set a master key at launch. " ,
" code " : " missing_master_key " ,
2021-12-06 15:45:41 +01:00
" type " : " auth " ,
2023-01-02 16:13:44 +01:00
" link " : " https://docs.meilisearch.com/errors#missing-master-key "
2021-12-06 15:45:41 +01:00
} ) ;
2022-11-28 16:27:41 +01:00
let expected_code = 401 ;
2021-12-06 15:45:41 +01:00
let ( response , code ) = server . add_api_key ( json! ( { } ) ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . patch_api_key ( " content " , json! ( { } ) ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . get_api_key ( " content " ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
let ( response , code ) = server . list_api_keys ( ) . await ;
2022-05-23 17:03:28 +02:00
assert_eq! ( expected_code , code , " {:?} " , & response ) ;
2021-12-06 15:45:41 +01:00
assert_eq! ( response , expected_response ) ;
}