use super::scenario::Scenario;
#[test]
fn read_content_length_body() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello world", false)
.build();
let mut reply = scenario.to_recv_body();
let mut output = vec![0; 1024];
let (input_used, output_used) = reply.read(b"hello world", &mut output).unwrap();
assert_eq!(input_used, 11);
assert_eq!(output_used, 11);
assert_eq!(&output[..output_used], b"hello world");
assert!(reply.is_ended());
}
#[test]
fn read_chunked_body() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello world", true)
.build();
let mut reply = scenario.to_recv_body();
let mut output = vec![0; 1024];
let chunked_input = b"b\r\nhello world\r\n0\r\n\r\n";
let (input_used, output_used) = reply.read(chunked_input, &mut output).unwrap();
assert_eq!(input_used, 21);
assert_eq!(output_used, 11);
assert_eq!(&output[..output_used], b"hello world");
assert!(reply.is_ended());
}
#[test]
fn read_chunked_body_in_parts() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello world", true)
.build();
let mut reply = scenario.to_recv_body();
reply.stop_on_chunk_boundary(true);
let mut output = vec![0; 1024];
let chunk1 = b"5\r\nhello\r\n";
let (input_used1, output_used1) = reply.read(chunk1, &mut output).unwrap();
assert_eq!(input_used1, 10);
assert_eq!(output_used1, 5);
assert_eq!(&output[..output_used1], b"hello");
assert!(reply.is_on_chunk_boundary());
assert!(!reply.is_ended());
let chunk2 = b"6\r\n world\r\n";
let (input_used2, output_used2) = reply.read(chunk2, &mut output[output_used1..]).unwrap();
assert_eq!(input_used2, 11);
assert_eq!(output_used2, 6);
assert_eq!(
&output[output_used1..output_used1 + output_used2],
b" world"
);
assert!(reply.is_on_chunk_boundary());
assert!(!reply.is_ended());
let end_marker = b"0\r\n\r\n";
let (input_used3, output_used3) = reply
.read(end_marker, &mut output[output_used1 + output_used2..])
.unwrap();
assert_eq!(input_used3, 5);
assert_eq!(output_used3, 0);
assert!(reply.is_ended());
}
#[test]
fn proceed_to_provide_response() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello", false)
.build();
let mut reply = scenario.to_recv_body();
let mut output = vec![0; 1024];
reply.read(b"hello", &mut output).unwrap();
assert!(reply.is_ended());
let reply = reply.proceed().unwrap();
assert!(reply.inner().state.reader.is_some());
}
#[test]
#[should_panic]
fn proceed_before_body_ended() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello world", false)
.build();
let mut reply = scenario.to_recv_body();
let mut output = vec![0; 1024];
reply.read(b"hello", &mut output).unwrap();
assert!(!reply.is_ended());
let _ = reply.proceed();
}
#[test]
fn read_after_end() {
let scenario = Scenario::builder()
.post("/path")
.request_body(b"hello", false)
.build();
let mut reply = scenario.to_recv_body();
let mut output = vec![0; 1024];
reply.read(b"hello", &mut output).unwrap();
assert!(reply.is_ended());
let (input_used, output_used) = reply.read(b"more data", &mut output).unwrap();
assert_eq!(input_used, 0);
assert_eq!(output_used, 0);
}