@@ -70,13 +70,19 @@ async fn download(
70
70
let client = reqwest:: Client :: new ( ) ;
71
71
72
72
let mut request = client. get ( url) ;
73
- // Loop trought the headers keys and values
73
+ // Loop through the headers keys and values
74
74
// and add them to the request object.
75
75
for ( key, value) in headers {
76
76
request = request. header ( & key, value) ;
77
77
}
78
78
79
79
let response = request. send ( ) . await ?;
80
+ if !response. status ( ) . is_success ( ) {
81
+ return Err ( Error :: HttpErrorCode (
82
+ response. status ( ) . as_u16 ( ) ,
83
+ response. text ( ) . await . unwrap_or_default ( ) ,
84
+ ) ) ;
85
+ }
80
86
let total = response. content_length ( ) . unwrap_or ( 0 ) ;
81
87
82
88
let mut file = BufWriter :: new ( File :: create ( file_path) . await ?) ;
@@ -112,7 +118,7 @@ async fn upload(
112
118
. header ( reqwest:: header:: CONTENT_LENGTH , file_len)
113
119
. body ( file_to_body ( on_progress, file) ) ;
114
120
115
- // Loop trought the headers keys and values
121
+ // Loop through the headers keys and values
116
122
// and add them to the request object.
117
123
for ( key, value) in headers {
118
124
request = request. header ( & key, value) ;
@@ -145,3 +151,64 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
145
151
. invoke_handler ( tauri:: generate_handler![ download, upload] )
146
152
. build ( )
147
153
}
154
+
155
+ #[ cfg( test) ]
156
+ mod tests {
157
+ use super :: * ;
158
+ use mockito:: { self , Mock , Server , ServerGuard } ;
159
+ use tauri:: ipc:: InvokeResponseBody ;
160
+ struct MockedServer {
161
+ _server : ServerGuard ,
162
+ url : String ,
163
+ mocked_endpoint : Mock ,
164
+ }
165
+
166
+ #[ tokio:: test]
167
+ async fn should_error_if_status_not_success ( ) {
168
+ let mocked_server = spawn_server_mocked ( 400 ) . await ;
169
+ let result = download_file ( & mocked_server. url ) . await ;
170
+ mocked_server. mocked_endpoint . assert ( ) ;
171
+ assert ! ( result. is_err( ) ) ;
172
+ }
173
+
174
+ #[ tokio:: test]
175
+ async fn should_download_file_successfully ( ) {
176
+ let mocked_server = spawn_server_mocked ( 200 ) . await ;
177
+ let result = download_file ( & mocked_server. url ) . await ;
178
+ mocked_server. mocked_endpoint . assert ( ) ;
179
+ assert ! (
180
+ result. is_ok( ) ,
181
+ "failed to download file: {}" ,
182
+ result. unwrap_err( )
183
+ ) ;
184
+ }
185
+
186
+ async fn download_file ( url : & str ) -> Result < ( ) > {
187
+ let file_path = concat ! ( env!( "CARGO_MANIFEST_DIR" ) , "/test/test.txt" ) ;
188
+ let headers = HashMap :: new ( ) ;
189
+ let sender: Channel < ProgressPayload > =
190
+ Channel :: new ( |msg : InvokeResponseBody | -> tauri:: Result < ( ) > {
191
+ let _ = msg;
192
+ Ok ( ( ) )
193
+ } ) ;
194
+ download ( url, file_path, headers, sender) . await
195
+ }
196
+
197
+ async fn spawn_server_mocked ( return_status : usize ) -> MockedServer {
198
+ let mut _server = Server :: new_async ( ) . await ;
199
+ let path = "/mock_test" ;
200
+ let mock = _server
201
+ . mock ( "GET" , path)
202
+ . with_status ( return_status)
203
+ . with_body ( "mocked response body" )
204
+ . create_async ( )
205
+ . await ;
206
+
207
+ let url = _server. url ( ) + path;
208
+ MockedServer {
209
+ _server,
210
+ url,
211
+ mocked_endpoint : mock,
212
+ }
213
+ }
214
+ }
0 commit comments