11#[ cfg( test) ]
22mod tests {
3+ use async_trait:: async_trait;
34 use mockito:: { self , Matcher } ;
45 use prost:: Message ;
56 use reqwest:: header:: CONTENT_TYPE ;
7+ use std:: collections:: HashMap ;
8+ use std:: sync:: Arc ;
69 use std:: time:: Duration ;
710 use vss_client:: client:: VssClient ;
811 use vss_client:: error:: VssError ;
12+ use vss_client:: headers:: FixedHeaders ;
13+ use vss_client:: headers:: VssHeaderProvider ;
14+ use vss_client:: headers:: VssHeaderProviderError ;
915
1016 use vss_client:: types:: {
1117 DeleteObjectRequest , DeleteObjectResponse , ErrorCode , ErrorResponse , GetObjectRequest , GetObjectResponse ,
@@ -41,7 +47,42 @@ mod tests {
4147 . create ( ) ;
4248
4349 // 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) ;
4586
4687 let actual_result = client. get_object ( & get_request) . await . unwrap ( ) ;
4788
@@ -75,7 +116,7 @@ mod tests {
75116 . create ( ) ;
76117
77118 // 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 ( ) ) ;
79120 let actual_result = vss_client. put_object ( & request) . await . unwrap ( ) ;
80121
81122 let expected_result = & mock_response;
@@ -106,7 +147,7 @@ mod tests {
106147 . create ( ) ;
107148
108149 // 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 ( ) ) ;
110151 let actual_result = vss_client. delete_object ( & request) . await . unwrap ( ) ;
111152
112153 let expected_result = & mock_response;
@@ -147,7 +188,7 @@ mod tests {
147188 . create ( ) ;
148189
149190 // 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 ( ) ) ;
151192
152193 let actual_result = client. list_key_versions ( & request) . await . unwrap ( ) ;
153194
@@ -161,7 +202,7 @@ mod tests {
161202 #[ tokio:: test]
162203 async fn test_no_such_key_err_handling ( ) {
163204 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 ( ) ) ;
165206
166207 // NoSuchKeyError
167208 let error_response = ErrorResponse {
@@ -185,7 +226,7 @@ mod tests {
185226 #[ tokio:: test]
186227 async fn test_get_response_without_value ( ) {
187228 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 ( ) ) ;
189230
190231 // GetObjectResponse with None value
191232 let mock_response = GetObjectResponse { value : None , ..Default :: default ( ) } ;
@@ -206,7 +247,7 @@ mod tests {
206247 #[ tokio:: test]
207248 async fn test_invalid_request_err_handling ( ) {
208249 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 ( ) ) ;
210251
211252 // Invalid Request Error
212253 let error_response = ErrorResponse {
@@ -258,7 +299,7 @@ mod tests {
258299 #[ tokio:: test]
259300 async fn test_auth_err_handling ( ) {
260301 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 ( ) ) ;
262303
263304 // Invalid Request Error
264305 let error_response =
@@ -305,10 +346,29 @@ mod tests {
305346 mock_server. expect ( 4 ) . assert ( ) ;
306347 }
307348
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+
308368 #[ tokio:: test]
309369 async fn test_conflict_err_handling ( ) {
310370 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 ( ) ) ;
312372
313373 // Conflict Error
314374 let error_response =
@@ -335,7 +395,7 @@ mod tests {
335395 #[ tokio:: test]
336396 async fn test_internal_server_err_handling ( ) {
337397 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 ( ) ) ;
339399
340400 // Internal Server Error
341401 let error_response = ErrorResponse {
@@ -387,7 +447,7 @@ mod tests {
387447 #[ tokio:: test]
388448 async fn test_internal_err_handling ( ) {
389449 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 ( ) ) ;
391451
392452 let error_response = ErrorResponse { error_code : 999 , message : "UnknownException" . to_string ( ) } ;
393453 let mut _mock_server = mockito:: mock ( "POST" , Matcher :: Any )
0 commit comments