1
1
#[ cfg( test) ]
2
2
mod tests {
3
+ use async_trait:: async_trait;
3
4
use mockito:: { self , Matcher } ;
4
5
use prost:: Message ;
5
6
use reqwest:: header:: CONTENT_TYPE ;
7
+ use std:: collections:: HashMap ;
8
+ use std:: sync:: Arc ;
6
9
use std:: time:: Duration ;
7
10
use vss_client:: client:: VssClient ;
8
11
use vss_client:: error:: VssError ;
12
+ use vss_client:: headers:: FixedHeaders ;
13
+ use vss_client:: headers:: VssHeaderProvider ;
14
+ use vss_client:: headers:: VssHeaderProviderError ;
9
15
10
16
use vss_client:: types:: {
11
17
DeleteObjectRequest , DeleteObjectResponse , ErrorCode , ErrorResponse , GetObjectRequest , GetObjectResponse ,
@@ -41,7 +47,42 @@ mod tests {
41
47
. create ( ) ;
42
48
43
49
// Create a new VssClient with the mock server URL.
44
- let client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
50
+ let client = VssClient :: new ( base_url, retry_policy ( ) ) ;
51
+
52
+ let actual_result = client. get_object ( & get_request) . await . unwrap ( ) ;
53
+
54
+ let expected_result = & mock_response;
55
+ assert_eq ! ( actual_result, * expected_result) ;
56
+
57
+ // Verify server endpoint was called exactly once.
58
+ mock_server. expect ( 1 ) . assert ( ) ;
59
+ }
60
+
61
+ #[ tokio:: test]
62
+ async fn test_get_with_headers ( ) {
63
+ // Spin-up mock server with mock response for given request.
64
+ let base_url = mockito:: server_url ( ) . to_string ( ) ;
65
+
66
+ // Set up the mock request/response.
67
+ let get_request = GetObjectRequest { store_id : "store" . to_string ( ) , key : "k1" . to_string ( ) } ;
68
+ let mock_response = GetObjectResponse {
69
+ value : Some ( KeyValue { key : "k1" . to_string ( ) , version : 2 , value : b"k1v2" . to_vec ( ) } ) ,
70
+ ..Default :: default ( )
71
+ } ;
72
+
73
+ // Register the mock endpoint with the mockito server and provide expected headers.
74
+ let mock_server = mockito:: mock ( "POST" , GET_OBJECT_ENDPOINT )
75
+ . match_header ( CONTENT_TYPE . as_str ( ) , APPLICATION_OCTET_STREAM )
76
+ . match_header ( "headerkey" , "headervalue" )
77
+ . match_body ( get_request. encode_to_vec ( ) )
78
+ . with_status ( 200 )
79
+ . with_body ( mock_response. encode_to_vec ( ) )
80
+ . create ( ) ;
81
+
82
+ // Create a new VssClient with the mock server URL and fixed headers.
83
+ let header_provider =
84
+ Arc :: new ( FixedHeaders :: new ( HashMap :: from ( [ ( "headerkey" . to_string ( ) , "headervalue" . to_string ( ) ) ] ) ) ) ;
85
+ let client = VssClient :: new_with_headers ( base_url, retry_policy ( ) , header_provider) ;
45
86
46
87
let actual_result = client. get_object ( & get_request) . await . unwrap ( ) ;
47
88
@@ -75,7 +116,7 @@ mod tests {
75
116
. create ( ) ;
76
117
77
118
// Create a new VssClient with the mock server URL.
78
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
119
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
79
120
let actual_result = vss_client. put_object ( & request) . await . unwrap ( ) ;
80
121
81
122
let expected_result = & mock_response;
@@ -106,7 +147,7 @@ mod tests {
106
147
. create ( ) ;
107
148
108
149
// Create a new VssClient with the mock server URL.
109
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
150
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
110
151
let actual_result = vss_client. delete_object ( & request) . await . unwrap ( ) ;
111
152
112
153
let expected_result = & mock_response;
@@ -147,7 +188,7 @@ mod tests {
147
188
. create ( ) ;
148
189
149
190
// Create a new VssClient with the mock server URL.
150
- let client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
191
+ let client = VssClient :: new ( base_url, retry_policy ( ) ) ;
151
192
152
193
let actual_result = client. list_key_versions ( & request) . await . unwrap ( ) ;
153
194
@@ -161,7 +202,7 @@ mod tests {
161
202
#[ tokio:: test]
162
203
async fn test_no_such_key_err_handling ( ) {
163
204
let base_url = mockito:: server_url ( ) ;
164
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
205
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
165
206
166
207
// NoSuchKeyError
167
208
let error_response = ErrorResponse {
@@ -185,7 +226,7 @@ mod tests {
185
226
#[ tokio:: test]
186
227
async fn test_get_response_without_value ( ) {
187
228
let base_url = mockito:: server_url ( ) ;
188
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
229
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
189
230
190
231
// GetObjectResponse with None value
191
232
let mock_response = GetObjectResponse { value : None , ..Default :: default ( ) } ;
@@ -206,7 +247,7 @@ mod tests {
206
247
#[ tokio:: test]
207
248
async fn test_invalid_request_err_handling ( ) {
208
249
let base_url = mockito:: server_url ( ) ;
209
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
250
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
210
251
211
252
// Invalid Request Error
212
253
let error_response = ErrorResponse {
@@ -258,7 +299,7 @@ mod tests {
258
299
#[ tokio:: test]
259
300
async fn test_auth_err_handling ( ) {
260
301
let base_url = mockito:: server_url ( ) ;
261
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
302
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
262
303
263
304
// Invalid Request Error
264
305
let error_response =
@@ -305,10 +346,29 @@ mod tests {
305
346
mock_server. expect ( 4 ) . assert ( ) ;
306
347
}
307
348
349
+ struct FailingHeaderProvider { }
350
+
351
+ #[ async_trait]
352
+ impl VssHeaderProvider for FailingHeaderProvider {
353
+ async fn get_headers ( & self , _request : & [ u8 ] ) -> Result < HashMap < String , String > , VssHeaderProviderError > {
354
+ Err ( VssHeaderProviderError :: InvalidData { error : "test" . to_string ( ) } )
355
+ }
356
+ }
357
+
358
+ #[ tokio:: test]
359
+ async fn test_header_provider_error ( ) {
360
+ let get_request = GetObjectRequest { store_id : "store" . to_string ( ) , key : "k1" . to_string ( ) } ;
361
+ let header_provider = Arc :: new ( FailingHeaderProvider { } ) ;
362
+ let client = VssClient :: new_with_headers ( "notused" . to_string ( ) , retry_policy ( ) , header_provider) ;
363
+ let result = client. get_object ( & get_request) . await ;
364
+
365
+ assert ! ( matches!( result, Err ( VssError :: AuthError { .. } ) ) ) ;
366
+ }
367
+
308
368
#[ tokio:: test]
309
369
async fn test_conflict_err_handling ( ) {
310
370
let base_url = mockito:: server_url ( ) ;
311
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
371
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
312
372
313
373
// Conflict Error
314
374
let error_response =
@@ -335,7 +395,7 @@ mod tests {
335
395
#[ tokio:: test]
336
396
async fn test_internal_server_err_handling ( ) {
337
397
let base_url = mockito:: server_url ( ) ;
338
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
398
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
339
399
340
400
// Internal Server Error
341
401
let error_response = ErrorResponse {
@@ -387,7 +447,7 @@ mod tests {
387
447
#[ tokio:: test]
388
448
async fn test_internal_err_handling ( ) {
389
449
let base_url = mockito:: server_url ( ) ;
390
- let vss_client = VssClient :: new ( & base_url, retry_policy ( ) ) ;
450
+ let vss_client = VssClient :: new ( base_url, retry_policy ( ) ) ;
391
451
392
452
let error_response = ErrorResponse { error_code : 999 , message : "UnknownException" . to_string ( ) } ;
393
453
let mut _mock_server = mockito:: mock ( "POST" , Matcher :: Any )
0 commit comments