1 use mockito::{mock, server_url};
2 
3 speculate::speculate! {
4     before {
5         env_logger::try_init().ok();
6     }
7 
8     test "simple response body" {
9         let m = mock("GET", "/")
10             .with_body("hello world")
11             .create();
12 
13         let mut response = isahc::get(server_url()).unwrap();
14         let response_text = response.body_mut().text().unwrap();
15 
16         assert_eq!(response_text, "hello world");
17         m.assert();
18     }
19 
20     test "large response body" {
21         let body = "wow so large ".repeat(1000);
22 
23         let m = mock("GET", "/")
24             .with_body(&body)
25             .create();
26 
27         let mut response = isahc::get(server_url()).unwrap();
28         let response_text = response.body_mut().text().unwrap();
29 
30         assert_eq!(response_text, body);
31         m.assert();
32     }
33 
34     test "response body with Content-Length knows its size" {
35         let m = mock("GET", "/")
36             .with_body("hello world")
37             .create();
38 
39         let response = isahc::get(server_url()).unwrap();
40 
41         assert_eq!(response.body().len(), Some(11));
42         m.assert();
43     }
44 
45     test "response body with chunked encoding has unknown size" {
46         let m = mock("GET", "/")
47             .with_body_from_fn(|w| w.write_all(b"hello world"))
48             .create();
49 
50         let response = isahc::get(server_url()).unwrap();
51 
52         assert_eq!(response.body().len(), None);
53         m.assert();
54     }
55 
56     // See issue #64.
57     test "dropping client does not abort response transfer" {
58         let body = "hello world\n".repeat(8192);
59         let m = mock("GET", "/")
60             .with_body(&body)
61             .create();
62 
63         let client = isahc::HttpClient::new().unwrap();
64         let mut response = client.get(server_url()).unwrap();
65         drop(client);
66 
67         assert_eq!(response.body_mut().text().unwrap().len(), body.len());
68         m.assert();
69     }
70 
71     // See issue #72.
72     test "reading from response body after EOF continues to return EOF" {
73         use std::{io, io::Read};
74 
75         let m = mock("GET", "/")
76             .with_body("hello world")
77             .create();
78 
79         let mut response = isahc::get(server_url()).unwrap();
80         let mut body = response.body_mut();
81 
82         // Read until EOF
83         io::copy(&mut body, &mut io::sink()).unwrap();
84         m.assert();
85 
86         // Read after already receiving EOF
87         let mut buf = [0; 1024];
88         for _ in 0..3 {
89             assert_eq!(body.read(&mut buf).unwrap(), 0);
90         }
91     }
92 }
93