#[cfg(feature = "record")]
use httpmock::prelude::*;
#[cfg(feature = "record")]
use reqwest::blocking::Client;
#[cfg(feature = "record")]
#[test]
fn record_with_forwarding_test() {
let target_server = MockServer::start();
target_server.mock(|when, then| {
when.any_request();
then.status(200).body("Hi from fake GitHub!");
});
let recording_server = MockServer::start();
recording_server.forward_to(target_server.base_url(), |rule| {
rule.filter(|when| {
when.path("/hello");
});
});
let recording = recording_server.record(|rule| {
rule.record_response_delays(true)
.record_request_headers(vec!["Accept", "Content-Type"])
.filter(|when| {
when.path("/hello");
});
});
let github_client = Client::builder().build().unwrap();
let response = github_client
.get(format!("{}/hello", recording_server.base_url()))
.send()
.unwrap();
assert_eq!(response.text().unwrap(), "Hi from fake GitHub!");
let target_path = recording.save("my_test_scenario").unwrap();
let playback_server = MockServer::start();
playback_server.playback(target_path);
let response = github_client
.get(format!("{}/hello", playback_server.base_url()))
.send()
.unwrap();
assert_eq!(response.text().unwrap(), "Hi from fake GitHub!");
}
#[cfg(all(feature = "proxy", feature = "https", feature = "record"))]
#[test]
fn record_with_proxy_example_test() {
use httpmock::RecordingRuleBuilder;
let recording_proxy_server = MockServer::start();
recording_proxy_server.proxy(|rule| {
rule.filter(|when| {
when.any_request(); });
});
let recording = recording_proxy_server.record(|rule: RecordingRuleBuilder| {
rule.filter(|when| {
when.any_request(); });
});
let client = Client::builder()
.proxy(reqwest::Proxy::all(recording_proxy_server.base_url()).unwrap())
.build()
.unwrap();
let response = client.get("https://httpmock.rs").send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
let recording_file_path = recording
.save("website-via-proxy")
.expect("could not save the recording");
let playback_server = MockServer::start();
playback_server.playback(recording_file_path);
let client = Client::builder()
.proxy(reqwest::Proxy::all(playback_server.base_url()).unwrap())
.build()
.unwrap();
let response = client.get("https://httpmock.rs").send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
}
#[cfg(feature = "record")]
#[test]
fn record_with_forwarding_example_test() {
let server = MockServer::start();
server.forward_to("https://httpmock.rs", |rule| {
rule.filter(|when| {
when.any_request(); });
});
let recording = server.record(|rule| {
rule.filter(|when| {
when.any_request(); });
});
let client = Client::new();
let response = client.get(server.base_url()).send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
let recording_file_path = recording
.save("website-via-forwarding")
.expect("cannot store recording on disk");
let playback_server = MockServer::start();
playback_server.playback(recording_file_path);
let response = client.get(playback_server.base_url()).send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
}
#[cfg(feature = "record")]
#[test]
fn playback_github_api() {
let server = MockServer::start();
server.forward_to("https://httpmock.rs", |rule| {
rule.filter(|when| {
when.any_request(); });
});
let recording = server.record(|rule| {
rule.filter(|when| {
when.any_request(); });
});
let client = Client::new();
let response = client.get(server.base_url()).send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
let target_path = recording
.save("github-torvalds-scenario")
.expect("Failed to save the recording to disk");
let playback_server = MockServer::start();
playback_server.playback(target_path);
let response = client.get(playback_server.base_url()).send().unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
}
#[cfg(feature = "record")]
#[test]
fn record_with_forwarding_all_request_parts_test() {
let server = MockServer::start();
server.forward_to("https://httpmock.rs", |rule| {
rule.filter(|when| {
when.any_request(); });
});
let recording = server.record(|rule| {
rule.record_request_headers(vec![
String::from("X-Auth-Token"),
String::from("Accept-Language"),
])
.filter(|when| {
when.any_request(); });
});
let client = Client::new();
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("X-Auth-Token", "secret123".parse().unwrap());
headers.insert("Accept-Language", "en-US".parse().unwrap());
let mut query_params = std::collections::HashMap::new();
query_params.insert("this", "is");
query_params.insert("a", "test");
query_params.insert("empty", "");
let response = client
.get(server.base_url())
.headers(headers.clone())
.query(&query_params)
.send()
.unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
let recording_file_path = recording
.save("website-via-forwarding")
.expect("cannot store recording on disk");
let playback_server = MockServer::start();
playback_server.playback(recording_file_path);
let response = client
.get(playback_server.base_url())
.headers(headers)
.query(&query_params)
.send()
.unwrap();
assert_eq!(response.status().as_u16(), 200);
assert!(response
.text()
.unwrap()
.contains("Simple yet powerful HTTP mocking library for Rust"));
}