@@ -196,7 +196,7 @@ mod tests {
196
196
}
197
197
198
198
#[ tokio:: test]
199
- async fn should_error_if_status_not_success ( ) {
199
+ async fn should_error_on_download_if_status_not_success ( ) {
200
200
let mocked_server = spawn_server_mocked ( 400 ) . await ;
201
201
let result = download_file ( & mocked_server. url ) . await ;
202
202
mocked_server. mocked_endpoint . assert ( ) ;
@@ -215,6 +215,51 @@ mod tests {
215
215
) ;
216
216
}
217
217
218
+ #[ tokio:: test]
219
+ async fn should_error_on_upload_if_status_not_success ( ) {
220
+ let mocked_server = spawn_upload_server_mocked ( 500 ) . await ;
221
+ let result = upload_file ( & mocked_server. url ) . await ;
222
+ mocked_server. mocked_endpoint . assert ( ) ;
223
+ assert ! ( result. is_err( ) ) ;
224
+ match result. unwrap_err ( ) {
225
+ Error :: HttpErrorCode ( status, _) => assert_eq ! ( status, 500 ) ,
226
+ _ => panic ! ( "Expected HttpErrorCode error" ) ,
227
+ }
228
+ }
229
+
230
+ #[ tokio:: test]
231
+ async fn should_error_on_upload_if_file_not_found ( ) {
232
+ let mocked_server = spawn_upload_server_mocked ( 200 ) . await ;
233
+ let file_path = "/nonexistent/file.txt" ;
234
+ let headers = HashMap :: new ( ) ;
235
+ let sender: Channel < ProgressPayload > =
236
+ Channel :: new ( |msg : InvokeResponseBody | -> tauri:: Result < ( ) > {
237
+ let _ = msg;
238
+ Ok ( ( ) )
239
+ } ) ;
240
+
241
+ let result = upload ( & mocked_server. url , file_path, headers, sender) . await ;
242
+ assert ! ( result. is_err( ) ) ;
243
+ match result. unwrap_err ( ) {
244
+ Error :: Io ( _) => { } // Expected IO error for missing file
245
+ _ => panic ! ( "Expected IO error for missing file" ) ,
246
+ }
247
+ }
248
+
249
+ #[ tokio:: test]
250
+ async fn should_upload_file_successfully ( ) {
251
+ let mocked_server = spawn_upload_server_mocked ( 200 ) . await ;
252
+ let result = upload_file ( & mocked_server. url ) . await ;
253
+ mocked_server. mocked_endpoint . assert ( ) ;
254
+ assert ! (
255
+ result. is_ok( ) ,
256
+ "failed to upload file: {}" ,
257
+ result. unwrap_err( )
258
+ ) ;
259
+ let response_body = result. unwrap ( ) ;
260
+ assert_eq ! ( response_body, "upload successful" ) ;
261
+ }
262
+
218
263
async fn download_file ( url : & str ) -> Result < ( ) > {
219
264
let file_path = concat ! ( env!( "CARGO_MANIFEST_DIR" ) , "/test/test.txt" ) ;
220
265
let headers = HashMap :: new ( ) ;
@@ -226,6 +271,17 @@ mod tests {
226
271
download ( url, file_path, headers, None , sender) . await
227
272
}
228
273
274
+ async fn upload_file ( url : & str ) -> Result < String > {
275
+ let file_path = concat ! ( env!( "CARGO_MANIFEST_DIR" ) , "/test/test.txt" ) ;
276
+ let headers = HashMap :: new ( ) ;
277
+ let sender: Channel < ProgressPayload > =
278
+ Channel :: new ( |msg : InvokeResponseBody | -> tauri:: Result < ( ) > {
279
+ let _ = msg;
280
+ Ok ( ( ) )
281
+ } ) ;
282
+ upload ( url, file_path, headers, sender) . await
283
+ }
284
+
229
285
async fn spawn_server_mocked ( return_status : usize ) -> MockedServer {
230
286
let mut _server = Server :: new_async ( ) . await ;
231
287
let path = "/mock_test" ;
@@ -243,4 +299,23 @@ mod tests {
243
299
mocked_endpoint : mock,
244
300
}
245
301
}
302
+
303
+ async fn spawn_upload_server_mocked ( return_status : usize ) -> MockedServer {
304
+ let mut _server = Server :: new_async ( ) . await ;
305
+ let path = "/upload_test" ;
306
+ let mock = _server
307
+ . mock ( "POST" , path)
308
+ . with_status ( return_status)
309
+ . with_body ( "upload successful" )
310
+ . match_header ( "content-length" , "20" ) // test.txt file size
311
+ . create_async ( )
312
+ . await ;
313
+
314
+ let url = _server. url ( ) + path;
315
+ MockedServer {
316
+ _server,
317
+ url,
318
+ mocked_endpoint : mock,
319
+ }
320
+ }
246
321
}
0 commit comments