• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tu6ge / oss-rs / 5911409565

19 Aug 2023 12:34PM UTC coverage: 94.821% (-0.1%) from 94.939%
5911409565

push

github

tu6ge
fix(test)

7268 of 7665 relevant lines covered (94.82%)

9.46 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

96.67
/src/tests/object.rs
1
use crate::builder::ArcPointer;
2
#[cfg(feature = "blocking")]
3
use crate::builder::RcPointer;
4
use crate::builder::{BuilderError, ClientWithMiddleware, PointerFamily};
5
use crate::file::Files;
6
use crate::object::ObjectList;
7
use crate::types::core::IntoQuery;
8
use crate::types::object::{CommonPrefixes, ObjectPath};
9
use crate::{builder::Middleware, client::Client};
10
use crate::{BucketName, EndPoint, Query, QueryKey};
11
use async_trait::async_trait;
12
use http::HeaderValue;
13
use reqwest::{Request, Response};
14
use std::error::Error;
15
use std::sync::Arc;
16

17
pub(crate) fn assert_object_list<T: PointerFamily>(
5✔
18
    list: ObjectList<T>,
19
    endpoint: EndPoint,
20
    name: BucketName,
21
    prefix: Option<crate::ObjectDir>,
22
    max_keys: u32,
23
    key_count: u64,
24
    next_continuation_token: String,
25
    common_prefixes: CommonPrefixes,
26
    search_query: Query,
27
) {
28
    assert!(list.bucket().clone().endpoint() == endpoint);
5✔
29
    assert!(list.bucket().clone().name() == name);
5✔
30
    assert!(*list.prefix() == prefix);
5✔
31
    assert!(*list.max_keys() == max_keys);
5✔
32
    assert!(*list.key_count() == key_count);
5✔
33
    assert!(*list.next_continuation_token_str() == next_continuation_token);
5✔
34
    assert!(*list.common_prefixes() == common_prefixes);
5✔
35
    assert!(*list.search_query() == search_query);
5✔
36
}
5✔
37

38
#[cfg(feature = "blocking")]
39
#[test]
40
fn object_list_get_object_list() {
2✔
41
    use crate::client::ClientRc;
42
    use crate::{blocking::builder::Middleware, builder::RcPointer, object::ObjectList};
43
    use reqwest::blocking::{Request, Response};
44
    use std::rc::Rc;
45

46
    #[derive(Debug)]
×
47
    struct MyMiddleware {}
48

49
    impl Middleware for MyMiddleware {
50
        fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
51
            //println!("request {:?}", request);
52
            assert_eq!(request.method(), "GET");
1✔
53
            assert_eq!(
1✔
54
                *request.url(),
1✔
55
                "https://abc.oss-cn-shanghai.aliyuncs.com/?list-type=2&max-keys=5"
1✔
56
                    .parse()
57
                    .unwrap()
58
            );
59
            assert_eq!(
1✔
60
                request.headers().get("canonicalizedresource"),
1✔
61
                Some(&HeaderValue::from_str("/abc/").unwrap())
1✔
62
            );
63
            use http::response::Builder;
64
            let response = Builder::new()
1✔
65
                .status(200)
66
                //.url(url.clone())
67
                .body(
68
                    r#"<?xml version="1.0" encoding="UTF-8"?>
69
                <ListBucketResult>
70
                  <Name>barname</Name>
71
                  <Prefix>foo2</Prefix>
72
                  <MaxKeys>100</MaxKeys>
73
                  <Delimiter></Delimiter>
74
                  <IsTruncated>false</IsTruncated>
75
                  <Contents>
76
                    <Key>9AB932LY.jpeg</Key>
77
                    <LastModified>2022-06-26T09:53:21.000Z</LastModified>
78
                    <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
79
                    <Type>Normal</Type>
80
                    <Size>18027</Size>
81
                    <StorageClass>Standard</StorageClass>
82
                  </Contents>
83
                  <KeyCount>23</KeyCount>
84
                </ListBucketResult>"#,
85
                )
86
                .unwrap();
87
            let response = Response::from(response);
1✔
88
            Ok(response)
1✔
89
        }
1✔
90
    }
91

92
    let client = ClientRc::new(
2✔
93
        "foo1".into(),
1✔
94
        "foo2".into(),
1✔
95
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
96
        "foo4".parse().unwrap(),
1✔
97
    )
98
    .middleware(Rc::new(MyMiddleware {}));
1✔
99

100
    let object_list = ObjectList::<RcPointer>::new(
1✔
101
        "abc.oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
102
        Some("foo2/".parse().unwrap()),
1✔
103
        100,
104
        200,
105
        Vec::new(),
1✔
106
        None,
1✔
107
        Rc::new(client),
1✔
108
        [("max-keys", 5u8)],
1✔
109
    );
110

111
    let res = object_list.get_object_list();
1✔
112

113
    assert!(res.is_ok());
1✔
114
    let list = res.unwrap();
1✔
115
    assert_object_list::<RcPointer>(
1✔
116
        list,
1✔
117
        EndPoint::CN_SHANGHAI,
1✔
118
        "abc".parse().unwrap(),
1✔
119
        Some("foo2/".parse().unwrap()),
1✔
120
        100,
121
        23,
122
        String::default(),
1✔
123
        CommonPrefixes::from_iter([]),
1✔
124
        [(QueryKey::MAX_KEYS, 5u16)].into_query(),
1✔
125
    );
126
}
2✔
127

128
#[tokio::test]
3✔
129
async fn test_get_object_list() {
2✔
130
    #[derive(Debug)]
×
131
    struct MyMiddleware {}
132

133
    #[async_trait]
134
    impl Middleware for MyMiddleware {
135
        async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
136
            //println!("request {:?}", request);
137
            assert_eq!(request.method(), "GET");
1✔
138
            assert_eq!(
1✔
139
                *request.url(),
1✔
140
                "https://foo4.oss-cn-shanghai.aliyuncs.com/?list-type=2&max-keys=5"
1✔
141
                    .parse()
142
                    .unwrap()
143
            );
144
            assert_eq!(
1✔
145
                request.headers().get("canonicalizedresource"),
1✔
146
                Some(&HeaderValue::from_str("/foo4/").unwrap())
1✔
147
            );
148
            use http::response::Builder;
149
            let response = Builder::new()
1✔
150
                .status(200)
151
                //.url(url.clone())
152
                .body(
153
                    r#"<?xml version="1.0" encoding="UTF-8"?>
154
                <ListBucketResult>
155
                  <Name>barname</Name>
156
                  <Prefix></Prefix>
157
                  <MaxKeys>100</MaxKeys>
158
                  <Delimiter></Delimiter>
159
                  <IsTruncated>false</IsTruncated>
160
                  <Contents>
161
                    <Key>9AB932LY.jpeg</Key>
162
                    <LastModified>2022-06-26T09:53:21.000Z</LastModified>
163
                    <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
164
                    <Type>Normal</Type>
165
                    <Size>18027</Size>
166
                    <StorageClass>Standard</StorageClass>
167
                  </Contents>
168
                  <KeyCount>23</KeyCount>
169
                </ListBucketResult>"#,
170
                )
171
                .unwrap();
172
            let response = Response::from(response);
1✔
173
            Ok(response)
1✔
174
        }
3✔
175
    }
176

177
    let client = Client::<ClientWithMiddleware>::new(
2✔
178
        "foo1".into(),
1✔
179
        "foo2".into(),
1✔
180
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
181
        "foo4".parse().unwrap(),
1✔
182
    )
183
    .middleware(Arc::new(MyMiddleware {}));
1✔
184

185
    let res = client.get_object_list([("max-keys", "5")]).await;
1✔
186

187
    assert!(res.is_ok());
1✔
188
    let list = res.unwrap();
1✔
189
    assert_object_list::<ArcPointer>(
2✔
190
        list,
1✔
191
        EndPoint::CN_SHANGHAI,
1✔
192
        "foo4".parse().unwrap(),
1✔
193
        None,
1✔
194
        100,
195
        23,
196
        String::default(),
1✔
197
        CommonPrefixes::from_iter([]),
1✔
198
        [(QueryKey::MAX_KEYS, 5u16)].into_query(),
1✔
199
    );
1✔
200
}
3✔
201

202
#[tokio::test]
3✔
203
async fn test_error_object_list() {
2✔
204
    #[derive(Debug)]
×
205
    struct MyMiddleware {}
206

207
    #[async_trait]
208
    impl Middleware for MyMiddleware {
209
        async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
210
            //println!("request {:?}", request);
211
            assert_eq!(request.method(), "GET");
1✔
212
            assert_eq!(
1✔
213
                *request.url(),
1✔
214
                "https://foo4.oss-cn-shanghai.aliyuncs.com/?list-type=2&max-keys=5"
1✔
215
                    .parse()
216
                    .unwrap()
217
            );
218
            assert_eq!(
1✔
219
                request.headers().get("canonicalizedresource"),
1✔
220
                Some(&HeaderValue::from_str("/foo4/").unwrap())
1✔
221
            );
222
            use http::response::Builder;
223
            let response = Builder::new()
1✔
224
                .status(200)
225
                //.url(url.clone())
226
                .body(
227
                    r#"<?xml version="1.0" encoding="UTF-8"?>
228
                <ListBucketResult>
229
                  <Name>barname</Name>
230
                  <Prefix></Prefix>
231
                  <MaxKeys>100</MaxKeys>
232
                  <Delimiter></Delimiter>
233
                  <IsTruncated>false</IsTruncated>
234
                  <Contents>
235
                    <Key>9AB932LY.jpeg</Key>
236
                    <LastModified>2022-06-26T09:53:21.000Z</LastModified>
237
                    <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
238
                    <Type>Normal</Type>
239
                    <Size>18027</Size>
240
                    <StorageClass>Standard</StorageClass>
241
                  </Contents>
242
                  <KeyCount>foo</KeyCount>
243
                </ListBucketResult>"#,
244
                )
245
                .unwrap();
246
            let response = Response::from(response);
1✔
247
            Ok(response)
1✔
248
        }
3✔
249
    }
250

251
    let client = Client::<ClientWithMiddleware>::new(
2✔
252
        "foo1".into(),
1✔
253
        "foo2".into(),
1✔
254
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
255
        "foo4".parse().unwrap(),
1✔
256
    )
257
    .middleware(Arc::new(MyMiddleware {}));
1✔
258

259
    let res = client.get_object_list([("max-keys", "5")]).await;
1✔
260
    let err = res.unwrap_err();
1✔
261

262
    assert_eq!(format!("{err}"), "decode xml failed");
1✔
263
    assert_eq!(
2✔
264
        format!("{}", err.source().unwrap()),
1✔
265
        "parse key-count failed, gived str: foo"
266
    );
1✔
267
}
3✔
268

269
#[tokio::test]
3✔
270
async fn test_item_error_object_list() {
2✔
271
    #[derive(Debug)]
×
272
    struct MyMiddleware {}
273

274
    #[async_trait]
275
    impl Middleware for MyMiddleware {
276
        async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
277
            //println!("request {:?}", request);
278
            assert_eq!(request.method(), "GET");
1✔
279
            assert_eq!(
1✔
280
                *request.url(),
1✔
281
                "https://foo4.oss-cn-shanghai.aliyuncs.com/?list-type=2&max-keys=5"
1✔
282
                    .parse()
283
                    .unwrap()
284
            );
285
            assert_eq!(
1✔
286
                request.headers().get("canonicalizedresource"),
1✔
287
                Some(&HeaderValue::from_str("/foo4/").unwrap())
1✔
288
            );
289
            use http::response::Builder;
290
            let response = Builder::new()
1✔
291
                .status(200)
292
                //.url(url.clone())
293
                .body(
294
                    r#"<?xml version="1.0" encoding="UTF-8"?>
295
                <ListBucketResult>
296
                  <Name>barname</Name>
297
                  <Prefix></Prefix>
298
                  <MaxKeys>100</MaxKeys>
299
                  <Delimiter></Delimiter>
300
                  <IsTruncated>false</IsTruncated>
301
                  <Contents>
302
                    <Key>9AB932LY.jpeg</Key>
303
                    <LastModified>2022-06-26T09:53:21.000Z</LastModified>
304
                    <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
305
                    <Type>Normal</Type>
306
                    <Size>aaa</Size>
307
                    <StorageClass>Standard</StorageClass>
308
                  </Contents>
309
                  <KeyCount>23</KeyCount>
310
                </ListBucketResult>"#,
311
                )
312
                .unwrap();
313
            let response = Response::from(response);
1✔
314
            Ok(response)
1✔
315
        }
3✔
316
    }
317

318
    let client = Client::<ClientWithMiddleware>::new(
2✔
319
        "foo1".into(),
1✔
320
        "foo2".into(),
1✔
321
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
322
        "foo4".parse().unwrap(),
1✔
323
    )
324
    .middleware(Arc::new(MyMiddleware {}));
1✔
325

326
    let res = client.get_object_list([("max-keys", "5")]).await;
1✔
327
    let err = res.unwrap_err();
1✔
328

329
    assert_eq!(format!("{err}"), "decode xml failed");
1✔
330
    assert_eq!(
2✔
331
        format!("{}", err.source().unwrap()),
1✔
332
        "parse size failed, gived str: aaa"
333
    );
1✔
334
}
3✔
335

336
#[cfg(feature = "blocking")]
337
#[test]
338
fn test_get_blocking_object_list() {
2✔
339
    use crate::blocking::builder::Middleware;
340
    use crate::client::ClientRc;
341
    use reqwest::blocking::{Request, Response};
342
    use std::rc::Rc;
343

344
    #[derive(Debug)]
×
345
    struct MyMiddleware {}
346

347
    impl Middleware for MyMiddleware {
348
        fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
349
            //println!("request {:?}", request);
350
            assert_eq!(request.method(), "GET");
1✔
351
            assert_eq!(
1✔
352
                *request.url(),
1✔
353
                "https://foo4.oss-cn-shanghai.aliyuncs.com/?list-type=2&max-keys=5"
1✔
354
                    .parse()
355
                    .unwrap()
356
            );
357
            assert_eq!(
1✔
358
                request.headers().get("canonicalizedresource"),
1✔
359
                Some(&HeaderValue::from_str("/foo4/").unwrap())
1✔
360
            );
361
            use http::response::Builder;
362
            let response = Builder::new()
1✔
363
                .status(200)
364
                //.url(url.clone())
365
                .body(
366
                    r#"<?xml version="1.0" encoding="UTF-8"?>
367
                <ListBucketResult>
368
                  <Name>barname</Name>
369
                  <Prefix></Prefix>
370
                  <MaxKeys>100</MaxKeys>
371
                  <Delimiter></Delimiter>
372
                  <IsTruncated>false</IsTruncated>
373
                  <Contents>
374
                    <Key>9AB932LY.jpeg</Key>
375
                    <LastModified>2022-06-26T09:53:21.000Z</LastModified>
376
                    <ETag>"F75A15996D0857B16FA31A3B16624C26"</ETag>
377
                    <Type>Normal</Type>
378
                    <Size>18027</Size>
379
                    <StorageClass>Standard</StorageClass>
380
                  </Contents>
381
                  <KeyCount>23</KeyCount>
382
                </ListBucketResult>"#,
383
                )
384
                .unwrap();
385
            let response = Response::from(response);
1✔
386
            Ok(response)
1✔
387
        }
1✔
388
    }
389

390
    let client = ClientRc::new(
2✔
391
        "foo1".into(),
1✔
392
        "foo2".into(),
1✔
393
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
394
        "foo4".parse().unwrap(),
1✔
395
    )
396
    .middleware(Rc::new(MyMiddleware {}));
1✔
397

398
    let res = client.get_object_list([("max-keys", "5")]);
1✔
399

400
    assert!(res.is_ok());
1✔
401
    let list = res.unwrap();
1✔
402
    assert_object_list::<RcPointer>(
1✔
403
        list,
1✔
404
        EndPoint::CN_SHANGHAI,
1✔
405
        "foo4".parse().unwrap(),
1✔
406
        None,
1✔
407
        100,
408
        23,
409
        String::default(),
1✔
410
        CommonPrefixes::from_iter([]),
1✔
411
        [(QueryKey::MAX_KEYS, 5u16)].into_query(),
1✔
412
    );
413
}
2✔
414

415
#[tokio::test]
3✔
416
async fn test_put_content_base() {
2✔
417
    #[derive(Debug)]
×
418
    struct MyMiddleware {}
419

420
    #[async_trait]
421
    impl Middleware for MyMiddleware {
422
        async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
423
            //println!("request {:?}", request);
424
            assert_eq!(request.method(), "PUT");
1✔
425
            assert_eq!(
1✔
426
                *request.url(),
1✔
427
                "https://foo4.oss-cn-shanghai.aliyuncs.com/abc.text"
1✔
428
                    .parse()
429
                    .unwrap()
430
            );
431
            assert_eq!(
1✔
432
                request.headers().get("canonicalizedresource"),
1✔
433
                Some(&HeaderValue::from_str("/foo4/abc.text").unwrap())
1✔
434
            );
435
            use http::response::Builder;
436
            let response = Builder::new()
1✔
437
                .status(200)
438
                //.url(url.clone())
439
                .body(r#"content bar"#)
440
                .unwrap();
441
            let response = Response::from(response);
1✔
442
            Ok(response)
1✔
443
        }
3✔
444
    }
445

446
    let client = Client::<ClientWithMiddleware>::new(
2✔
447
        "foo1".into(),
1✔
448
        "foo2".into(),
1✔
449
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
450
        "foo4".parse().unwrap(),
1✔
451
    )
452
    .middleware(Arc::new(MyMiddleware {}));
1✔
453

454
    let content = String::from("Hello world");
1✔
455
    let content: Vec<u8> = content.into();
1✔
456

457
    let res = client
3✔
458
        .put_content_base(
459
            content,
1✔
460
            "application/text",
461
            "abc.text".parse::<ObjectPath>().unwrap(),
1✔
462
        )
463
        .await;
1✔
464

465
    //println!("{:?}", res);
466
    assert!(res.is_ok());
2✔
467
}
3✔
468

469
#[cfg(feature = "blocking")]
470
#[test]
471
fn test_blocking_put_content_base() {
2✔
472
    use crate::client::ClientRc;
473
    use crate::{blocking::builder::Middleware, file::blocking::Files};
474
    use reqwest::blocking::{Request, Response};
475
    use std::rc::Rc;
476

477
    #[derive(Debug)]
×
478
    struct MyMiddleware {}
479

480
    impl Middleware for MyMiddleware {
481
        fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
482
            //println!("request {:?}", request);
483
            assert_eq!(request.method(), "PUT");
1✔
484
            assert_eq!(
1✔
485
                *request.url(),
1✔
486
                "https://foo4.oss-cn-shanghai.aliyuncs.com/abc.text"
1✔
487
                    .parse()
488
                    .unwrap()
489
            );
490
            assert_eq!(
1✔
491
                request.headers().get("canonicalizedresource"),
1✔
492
                Some(&HeaderValue::from_str("/foo4/abc.text").unwrap())
1✔
493
            );
494
            use http::response::Builder;
495
            let response = Builder::new()
1✔
496
                .status(200)
497
                //.url(url.clone())
498
                .body(r#"content bar"#)
499
                .unwrap();
500
            let response = Response::from(response);
1✔
501
            Ok(response)
1✔
502
        }
1✔
503
    }
504

505
    let client = ClientRc::new(
2✔
506
        "foo1".into(),
1✔
507
        "foo2".into(),
1✔
508
        "https://oss-cn-shanghai.aliyuncs.com".try_into().unwrap(),
1✔
509
        "foo4".try_into().unwrap(),
1✔
510
    )
511
    .middleware(Rc::new(MyMiddleware {}));
1✔
512

513
    let content = String::from("Hello world");
1✔
514
    let content: Vec<u8> = content.into();
1✔
515

516
    let res = client.put_content_base(content, "application/text", "abc.text");
1✔
517

518
    //println!("{:?}", res);
519
    assert!(res.is_ok());
1✔
520
}
2✔
521

522
mod get_object {
523
    use std::sync::Arc;
524

525
    use http::HeaderValue;
526
    use reqwest::{Request, Response};
527

528
    use crate::builder::{BuilderError, ClientWithMiddleware};
529
    use crate::file::Files;
530
    use crate::types::object::ObjectPath;
531
    use crate::{builder::Middleware, client::Client};
532
    use async_trait::async_trait;
533

534
    #[tokio::test]
3✔
535
    async fn test_all_range() {
2✔
536
        #[derive(Debug)]
×
537
        struct MyMiddleware {}
538

539
        #[async_trait]
540
        impl Middleware for MyMiddleware {
541
            async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
542
                //println!("request {:?}", request);
543
                assert_eq!(request.method(), "GET");
1✔
544
                assert_eq!(
1✔
545
                    *request.url(),
1✔
546
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
547
                        .parse()
548
                        .unwrap()
549
                );
550
                assert_eq!(
1✔
551
                    request.headers().get("canonicalizedresource"),
1✔
552
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
553
                );
554
                assert_eq!(
1✔
555
                    request.headers().get("Range"),
1✔
556
                    Some(&HeaderValue::from_str("bytes=0-").unwrap())
1✔
557
                );
558
                use http::response::Builder;
559
                let response = Builder::new()
1✔
560
                    .status(200)
561
                    //.url(url.clone())
562
                    .body(r#"content bar"#)
563
                    .unwrap();
564
                let response = Response::from(response);
1✔
565
                Ok(response)
1✔
566
            }
3✔
567
        }
568

569
        let client = Client::<ClientWithMiddleware>::new(
2✔
570
            "foo1".into(),
1✔
571
            "foo2".into(),
1✔
572
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
573
            "foo4".parse().unwrap(),
1✔
574
        )
575
        .middleware(Arc::new(MyMiddleware {}));
1✔
576

577
        let res = client
3✔
578
            .get_object("foo.png".parse::<ObjectPath>().unwrap(), ..)
1✔
579
            .await;
1✔
580

581
        //println!("{:?}", res);
582
        assert!(res.is_ok());
1✔
583
        let res = res.unwrap();
1✔
584
        assert_eq!(res, String::from("content bar").into_bytes())
2✔
585
    }
3✔
586

587
    #[tokio::test]
3✔
588
    async fn test_start_range() {
2✔
589
        #[derive(Debug)]
×
590
        struct MyMiddleware {}
591

592
        #[async_trait]
593
        impl Middleware for MyMiddleware {
594
            async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
595
                //println!("request {:?}", request);
596
                assert_eq!(request.method(), "GET");
1✔
597
                assert_eq!(
1✔
598
                    *request.url(),
1✔
599
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
600
                        .parse()
601
                        .unwrap()
602
                );
603
                assert_eq!(
1✔
604
                    request.headers().get("canonicalizedresource"),
1✔
605
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
606
                );
607
                assert_eq!(
1✔
608
                    request.headers().get("Range"),
1✔
609
                    Some(&HeaderValue::from_str("bytes=1-").unwrap())
1✔
610
                );
611
                use http::response::Builder;
612
                let response = Builder::new()
1✔
613
                    .status(206)
614
                    //.url(url.clone())
615
                    .body(r#"content bar"#)
616
                    .unwrap();
617
                let response = Response::from(response);
1✔
618
                Ok(response)
1✔
619
            }
3✔
620
        }
621

622
        let client = Client::<ClientWithMiddleware>::new(
2✔
623
            "foo1".into(),
1✔
624
            "foo2".into(),
1✔
625
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
626
            "foo4".parse().unwrap(),
1✔
627
        )
628
        .middleware(Arc::new(MyMiddleware {}));
1✔
629

630
        let res = client
3✔
631
            .get_object("foo.png".parse::<ObjectPath>().unwrap(), 1..)
1✔
632
            .await;
1✔
633

634
        //println!("{:?}", res);
635
        assert!(res.is_ok());
1✔
636
        let res = res.unwrap();
1✔
637
        assert_eq!(res, String::from("content bar").into_bytes())
2✔
638
    }
3✔
639

640
    #[tokio::test]
3✔
641
    async fn test_end_range() {
2✔
642
        #[derive(Debug)]
×
643
        struct MyMiddleware {}
644

645
        #[async_trait]
646
        impl Middleware for MyMiddleware {
647
            async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
648
                //println!("request {:?}", request);
649
                assert_eq!(request.method(), "GET");
1✔
650
                assert_eq!(
1✔
651
                    *request.url(),
1✔
652
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
653
                        .parse()
654
                        .unwrap()
655
                );
656
                assert_eq!(
1✔
657
                    request.headers().get("canonicalizedresource"),
1✔
658
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
659
                );
660
                assert_eq!(
1✔
661
                    request.headers().get("Range"),
1✔
662
                    Some(&HeaderValue::from_str("bytes=0-10").unwrap())
1✔
663
                );
664
                use http::response::Builder;
665
                let response = Builder::new()
1✔
666
                    .status(206)
667
                    //.url(url.clone())
668
                    .body(r#"content bar"#)
669
                    .unwrap();
670
                let response = Response::from(response);
1✔
671
                Ok(response)
1✔
672
            }
3✔
673
        }
674

675
        let client = Client::<ClientWithMiddleware>::new(
2✔
676
            "foo1".into(),
1✔
677
            "foo2".into(),
1✔
678
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
679
            "foo4".parse().unwrap(),
1✔
680
        )
681
        .middleware(Arc::new(MyMiddleware {}));
1✔
682

683
        let res = client
3✔
684
            .get_object("foo.png".parse::<ObjectPath>().unwrap(), ..10)
1✔
685
            .await;
1✔
686

687
        //println!("{:?}", res);
688
        assert!(res.is_ok());
1✔
689
        let res = res.unwrap();
1✔
690
        assert_eq!(res, String::from("content bar").into_bytes())
2✔
691
    }
3✔
692

693
    #[tokio::test]
3✔
694
    async fn test_start_end_range() {
2✔
695
        #[derive(Debug)]
×
696
        struct MyMiddleware {}
697

698
        #[async_trait]
699
        impl Middleware for MyMiddleware {
700
            async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
701
                //println!("request {:?}", request);
702
                assert_eq!(request.method(), "GET");
1✔
703
                assert_eq!(
1✔
704
                    *request.url(),
1✔
705
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
706
                        .parse()
707
                        .unwrap()
708
                );
709
                assert_eq!(
1✔
710
                    request.headers().get("canonicalizedresource"),
1✔
711
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
712
                );
713
                assert_eq!(
1✔
714
                    request.headers().get("Range"),
1✔
715
                    Some(&HeaderValue::from_str("bytes=2-10").unwrap())
1✔
716
                );
717
                use http::response::Builder;
718
                let response = Builder::new()
1✔
719
                    .status(206)
720
                    //.url(url.clone())
721
                    .body(r#"content bar"#)
722
                    .unwrap();
723
                let response = Response::from(response);
1✔
724
                Ok(response)
1✔
725
            }
3✔
726
        }
727

728
        let client = Client::<ClientWithMiddleware>::new(
2✔
729
            "foo1".into(),
1✔
730
            "foo2".into(),
1✔
731
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
732
            "foo4".parse().unwrap(),
1✔
733
        )
734
        .middleware(Arc::new(MyMiddleware {}));
1✔
735

736
        let res = client
3✔
737
            .get_object("foo.png".parse::<ObjectPath>().unwrap(), 2..10)
1✔
738
            .await;
1✔
739

740
        //println!("{:?}", res);
741
        assert!(res.is_ok());
1✔
742
        let res = res.unwrap();
1✔
743
        assert_eq!(res, String::from("content bar").into_bytes())
2✔
744
    }
3✔
745
}
746

747
#[cfg(feature = "blocking")]
748
mod blocking_get_object {
749
    use std::rc::Rc;
750

751
    use http::HeaderValue;
752
    use reqwest::blocking::{Request, Response};
753

754
    use crate::blocking::builder::ClientWithMiddleware;
755
    use crate::builder::BuilderError;
756
    use crate::file::blocking::Files;
757
    use crate::{blocking::builder::Middleware, client::Client};
758

759
    #[test]
760
    fn test_all_range() {
2✔
761
        #[derive(Debug)]
×
762
        struct MyMiddleware {}
763

764
        impl Middleware for MyMiddleware {
765
            fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
766
                //println!("request {:?}", request);
767
                assert_eq!(request.method(), "GET");
1✔
768
                assert_eq!(
1✔
769
                    *request.url(),
1✔
770
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
771
                        .parse()
772
                        .unwrap()
773
                );
774
                assert_eq!(
1✔
775
                    request.headers().get("canonicalizedresource"),
1✔
776
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
777
                );
778
                assert_eq!(
1✔
779
                    request.headers().get("Range"),
1✔
780
                    Some(&HeaderValue::from_str("bytes=0-").unwrap())
1✔
781
                );
782
                use http::response::Builder;
783
                let response = Builder::new()
1✔
784
                    .status(200)
785
                    //.url(url.clone())
786
                    .body(r#"content bar"#)
787
                    .unwrap();
788
                let response = Response::from(response);
1✔
789
                Ok(response)
1✔
790
            }
1✔
791
        }
792

793
        let client = Client::<ClientWithMiddleware>::new(
2✔
794
            "foo1".into(),
1✔
795
            "foo2".into(),
1✔
796
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
797
            "foo4".parse().unwrap(),
1✔
798
        )
799
        .middleware(Rc::new(MyMiddleware {}));
1✔
800

801
        let res = client.get_object("foo.png", ..);
1✔
802

803
        //println!("{:?}", res);
804
        assert!(res.is_ok());
1✔
805
        let res = res.unwrap();
1✔
806
        assert_eq!(res, String::from("content bar").into_bytes())
1✔
807
    }
2✔
808

809
    #[test]
810
    fn test_start_range() {
2✔
811
        #[derive(Debug)]
×
812
        struct MyMiddleware {}
813

814
        impl Middleware for MyMiddleware {
815
            fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
816
                //println!("request {:?}", request);
817
                assert_eq!(request.method(), "GET");
1✔
818
                assert_eq!(
1✔
819
                    *request.url(),
1✔
820
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
821
                        .parse()
822
                        .unwrap()
823
                );
824
                assert_eq!(
1✔
825
                    request.headers().get("canonicalizedresource"),
1✔
826
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
827
                );
828
                assert_eq!(
1✔
829
                    request.headers().get("Range"),
1✔
830
                    Some(&HeaderValue::from_str("bytes=1-").unwrap())
1✔
831
                );
832
                use http::response::Builder;
833
                let response = Builder::new()
1✔
834
                    .status(206)
835
                    //.url(url.clone())
836
                    .body(r#"content bar"#)
837
                    .unwrap();
838
                let response = Response::from(response);
1✔
839
                Ok(response)
1✔
840
            }
1✔
841
        }
842

843
        let client = Client::<ClientWithMiddleware>::new(
2✔
844
            "foo1".into(),
1✔
845
            "foo2".into(),
1✔
846
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
847
            "foo4".parse().unwrap(),
1✔
848
        )
849
        .middleware(Rc::new(MyMiddleware {}));
1✔
850

851
        let res = client.get_object("foo.png", 1..);
1✔
852

853
        //println!("{:?}", res);
854
        assert!(res.is_ok());
1✔
855
        let res = res.unwrap();
1✔
856
        assert_eq!(res, String::from("content bar").into_bytes())
1✔
857
    }
2✔
858

859
    #[test]
860
    fn test_end_range() {
2✔
861
        #[derive(Debug)]
×
862
        struct MyMiddleware {}
863

864
        impl Middleware for MyMiddleware {
865
            fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
866
                //println!("request {:?}", request);
867
                assert_eq!(request.method(), "GET");
1✔
868
                assert_eq!(
1✔
869
                    *request.url(),
1✔
870
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
871
                        .parse()
872
                        .unwrap()
873
                );
874
                assert_eq!(
1✔
875
                    request.headers().get("canonicalizedresource"),
1✔
876
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
877
                );
878
                assert_eq!(
1✔
879
                    request.headers().get("Range"),
1✔
880
                    Some(&HeaderValue::from_str("bytes=0-10").unwrap())
1✔
881
                );
882
                use http::response::Builder;
883
                let response = Builder::new()
1✔
884
                    .status(206)
885
                    //.url(url.clone())
886
                    .body(r#"content bar"#)
887
                    .unwrap();
888
                let response = Response::from(response);
1✔
889
                Ok(response)
1✔
890
            }
1✔
891
        }
892

893
        let client = Client::<ClientWithMiddleware>::new(
2✔
894
            "foo1".into(),
1✔
895
            "foo2".into(),
1✔
896
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
897
            "foo4".parse().unwrap(),
1✔
898
        )
899
        .middleware(Rc::new(MyMiddleware {}));
1✔
900

901
        let res = client.get_object("foo.png", ..10);
1✔
902

903
        //println!("{:?}", res);
904
        assert!(res.is_ok());
1✔
905
        let res = res.unwrap();
1✔
906
        assert_eq!(res, String::from("content bar").into_bytes())
1✔
907
    }
2✔
908

909
    #[test]
910
    fn test_start_end_range() {
2✔
911
        #[derive(Debug)]
×
912
        struct MyMiddleware {}
913

914
        impl Middleware for MyMiddleware {
915
            fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
916
                //println!("request {:?}", request);
917
                assert_eq!(request.method(), "GET");
1✔
918
                assert_eq!(
1✔
919
                    *request.url(),
1✔
920
                    "https://foo4.oss-cn-shanghai.aliyuncs.com/foo.png"
1✔
921
                        .parse()
922
                        .unwrap()
923
                );
924
                assert_eq!(
1✔
925
                    request.headers().get("canonicalizedresource"),
1✔
926
                    Some(&HeaderValue::from_str("/foo4/foo.png").unwrap())
1✔
927
                );
928
                assert_eq!(
1✔
929
                    request.headers().get("Range"),
1✔
930
                    Some(&HeaderValue::from_str("bytes=2-10").unwrap())
1✔
931
                );
932
                use http::response::Builder;
933
                let response = Builder::new()
1✔
934
                    .status(206)
935
                    //.url(url.clone())
936
                    .body(r#"content bar"#)
937
                    .unwrap();
938
                let response = Response::from(response);
1✔
939
                Ok(response)
1✔
940
            }
1✔
941
        }
942

943
        let client = Client::<ClientWithMiddleware>::new(
2✔
944
            "foo1".into(),
1✔
945
            "foo2".into(),
1✔
946
            "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
947
            "foo4".parse().unwrap(),
1✔
948
        )
949
        .middleware(Rc::new(MyMiddleware {}));
1✔
950

951
        let res = client.get_object("foo.png", 2..10);
1✔
952

953
        //println!("{:?}", res);
954
        assert!(res.is_ok());
1✔
955
        let res = res.unwrap();
1✔
956
        assert_eq!(res, String::from("content bar").into_bytes())
1✔
957
    }
2✔
958
}
959

960
#[tokio::test]
3✔
961
async fn test_delete_object() {
2✔
962
    #[derive(Debug)]
×
963
    struct MyMiddleware {}
964

965
    #[async_trait]
966
    impl Middleware for MyMiddleware {
967
        async fn handle(&self, request: Request) -> Result<Response, BuilderError> {
3✔
968
            //println!("request {:?}", request);
969
            assert_eq!(request.method(), "DELETE");
1✔
970
            assert_eq!(
1✔
971
                *request.url(),
1✔
972
                "https://foo4.oss-cn-shanghai.aliyuncs.com/abc.png"
1✔
973
                    .parse()
974
                    .unwrap()
975
            );
976
            assert_eq!(
1✔
977
                request.headers().get("canonicalizedresource"),
1✔
978
                Some(&HeaderValue::from_str("/foo4/abc.png").unwrap())
1✔
979
            );
980
            use http::response::Builder;
981
            let response = Builder::new()
1✔
982
                .status(200)
983
                //.url(url.clone())
984
                .body(
985
                    r#"<?xml version="1.0" encoding="UTF-8"?>
986
                <ListBucketResult></ListBucketResult>"#,
987
                )
988
                .unwrap();
989
            let response = Response::from(response);
1✔
990
            Ok(response)
1✔
991
        }
3✔
992
    }
993

994
    let client = Client::<ClientWithMiddleware>::new(
2✔
995
        "foo1".into(),
1✔
996
        "foo2".into(),
1✔
997
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
998
        "foo4".parse().unwrap(),
1✔
999
    )
1000
    .middleware(Arc::new(MyMiddleware {}));
1✔
1001

1002
    let res = client
3✔
1003
        .delete_object("abc.png".parse::<ObjectPath>().unwrap())
1✔
1004
        .await;
1✔
1005
    //println!("{:?}", res);
1006
    assert!(res.is_ok());
2✔
1007
}
3✔
1008

1009
#[cfg(feature = "blocking")]
1010
#[test]
1011
fn test_blocking_delete_object() {
2✔
1012
    use crate::client::ClientRc;
1013
    use crate::{blocking::builder::Middleware, file::BlockingFiles};
1014
    use reqwest::blocking::{Request, Response};
1015
    use std::rc::Rc;
1016

1017
    #[derive(Debug)]
×
1018
    struct MyMiddleware {}
1019

1020
    #[async_trait]
1021
    impl Middleware for MyMiddleware {
1022
        fn handle(&self, request: Request) -> Result<Response, BuilderError> {
1✔
1023
            //println!("request {:?}", request);
1024
            assert_eq!(request.method(), "DELETE");
1✔
1025
            assert_eq!(
1✔
1026
                *request.url(),
1✔
1027
                "https://foo4.oss-cn-shanghai.aliyuncs.com/abc.png"
1✔
1028
                    .parse()
1029
                    .unwrap()
1030
            );
1031
            assert_eq!(
1✔
1032
                request.headers().get("canonicalizedresource"),
1✔
1033
                Some(&HeaderValue::from_str("/foo4/abc.png").unwrap())
1✔
1034
            );
1035
            use http::response::Builder;
1036
            let response = Builder::new()
1✔
1037
                .status(200)
1038
                //.url(url.clone())
1039
                .body(
1040
                    r#"<?xml version="1.0" encoding="UTF-8"?>
1041
                <ListBucketResult></ListBucketResult>"#,
1042
                )
1043
                .unwrap();
1044
            let response = Response::from(response);
1✔
1045
            Ok(response)
1✔
1046
        }
1✔
1047
    }
1048

1049
    let client = ClientRc::new(
2✔
1050
        "foo1".into(),
1✔
1051
        "foo2".into(),
1✔
1052
        "https://oss-cn-shanghai.aliyuncs.com".parse().unwrap(),
1✔
1053
        "foo4".parse().unwrap(),
1✔
1054
    )
1055
    .middleware(Rc::new(MyMiddleware {}));
1✔
1056

1057
    let res = client.delete_object("abc.png");
1✔
1058
    //println!("{:?}", res);
1059
    assert!(res.is_ok());
1✔
1060
}
2✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc