kxio/tests/net.rs
Paul Campbell f759884517 feat(net)!: new api: .on().{get,post, etc}(url), replacing .on(method).get(url)
The `http::Method` parameter is not needed as we now use named methods that the methods on the underlying `reqwest` client.

The `url` parameter can be a `String` or `&str` rather than a parsed, and error handled `url::Url`.
2024-11-19 19:40:02 +00:00

342 lines
7.9 KiB
Rust

//
use kxio::net::{Error, MockNet, Net};
use assert2::let_assert;
#[tokio::test]
async fn test_get_url() {
//given
let mock_net = kxio::net::mock();
let client = mock_net.client();
let url = "https://www.example.com";
let my_response = mock_net
.response()
.status(200)
.body("Get OK")
.expect("body");
mock_net
.on()
.get("https://www.example.com")
.respond(my_response);
//when
let response = Net::from(mock_net)
.send(client.get(url))
.await
.expect("response");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "Get OK");
}
#[tokio::test]
async fn test_post_url() {
//given
let net = kxio::net::mock();
let client = net.client();
let url = "https://www.example.com";
net.on()
.post(url)
.respond(net.response().status(200).body("post OK").expect("body"));
//when
let response = Net::from(net)
.send(client.post(url))
.await
.expect("reponse");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "post OK");
}
#[tokio::test]
async fn test_put_url() {
//given
let net = kxio::net::mock();
let client = net.client();
let url = "https://www.example.com";
net.on()
.put(url)
.respond(net.response().status(200).body("put OK").expect("body"));
//when
let response = Net::from(net).send(client.put(url)).await.expect("reponse");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "put OK");
}
#[tokio::test]
async fn test_delete_url() {
//given
let net = kxio::net::mock();
let client = net.client();
let url = "https://www.example.com";
net.on()
.delete(url)
.respond(net.response().status(200).body("delete OK").expect("body"));
//when
let response = Net::from(net)
.send(client.delete(url))
.await
.expect("reponse");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "delete OK");
}
#[tokio::test]
async fn test_head_url() {
//given
let net = kxio::net::mock();
let client = net.client();
let url = "https://www.example.com";
net.on()
.head(url)
.respond(net.response().status(200).body("head OK").expect("body"));
//when
let response = Net::from(net)
.send(client.head(url))
.await
.expect("reponse");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "head OK");
}
#[tokio::test]
async fn test_patch_url() {
//given
let net = kxio::net::mock();
let client = net.client();
let url = "https://www.example.com";
net.on()
.patch(url)
.respond(net.response().status(200).body("patch OK").expect("body"));
//when
let response = Net::from(net)
.send(client.patch(url))
.await
.expect("reponse");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "patch OK");
}
#[tokio::test]
async fn test_get_wrong_url() {
//given
let mock_net = kxio::net::mock();
let client = mock_net.client();
let url = "https://www.example.com";
let my_response = mock_net
.response()
.status(200)
.body("Get OK")
.expect("body");
mock_net.on().get(url).respond(my_response);
let net = Net::from(mock_net);
//when
let_assert!(
Err(Error::UnexpectedMockRequest(invalid_request)) =
net.send(client.get("https://some.other.url/")).await
);
//then
assert_eq!(invalid_request.url().to_string(), "https://some.other.url/");
// remove pending unmatched request - we never meant to match against it
let mock_net = MockNet::try_from(net).await.expect("recover net");
mock_net.reset();
}
#[tokio::test]
async fn test_post_by_method() {
//given
let net = kxio::net::mock();
let client = net.client();
let my_response = net.response().status(200).body("").expect("response body");
net.on()
// NOTE: No URL specified - so should match any URL
.respond(my_response);
//when
let response = Net::from(net)
.send(client.post("https://some.other.url"))
.await
.expect("response");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(response.bytes().await.expect("response body"), "");
}
#[tokio::test]
async fn test_post_by_body() {
//given
let net = kxio::net::mock();
let client = net.client();
let my_response = net
.response()
.status(200)
.body("response body")
.expect("body");
net.on()
// No URL - so any POST with a matching body
.body("match on body")
.respond(my_response);
//when
let response = Net::from(net)
.send(client.post("https://some.other.url").body("match on body"))
.await
.expect("response");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(
response.bytes().await.expect("response body"),
"response body"
);
}
#[tokio::test]
async fn test_post_by_header() {
//given
let net = kxio::net::mock();
let client = net.client();
let my_response = net
.response()
.status(200)
.body("response body")
.expect("body");
net.on().header("test", "match").respond(my_response);
//when
let response = Net::from(net)
.send(
client
.post("https://some.other.url")
.body("nay body")
.header("test", "match"),
)
.await
.expect("response");
//then
assert_eq!(response.status(), http::StatusCode::OK);
assert_eq!(
response.bytes().await.expect("response body"),
"response body"
);
}
#[tokio::test]
async fn test_post_by_header_wrong_value() {
//given
let mock_net = kxio::net::mock();
let client = mock_net.client();
let my_response = mock_net
.response()
.status(200)
.body("response body")
.expect("body");
mock_net.on().header("test", "match").respond(my_response);
let net = Net::from(mock_net);
//when
let response = net
.send(
client
.post("https://some.other.url")
.body("nay body")
.header("test", "no match"),
)
.await;
//then
let_assert!(Err(kxio::net::Error::UnexpectedMockRequest(_)) = response);
MockNet::try_from(net).await.expect("recover mock").reset();
}
#[tokio::test]
#[should_panic]
async fn test_unused_post_as_net() {
//given
let mock_net = kxio::net::mock();
let url = "https://www.example.com";
let my_response = mock_net
.response()
.status(200)
.body("Post OK")
.expect("body");
mock_net.on().post(url).respond(my_response);
let _net = Net::from(mock_net);
//when
// don't send the planned request
// let _response = Net::from(net).send(client.post(url)).await.expect("send");
//then
// Drop implementation for net should panic
}
#[tokio::test]
#[should_panic]
async fn test_unused_post_as_mocknet() {
//given
let mock_net = kxio::net::mock();
let url = "https://www.example.com";
let my_response = mock_net
.response()
.status(200)
.body("Post OK")
.expect("body");
mock_net.on().post(url).respond(my_response);
//when
// don't send the planned request
// let _response = Net::from(net).send(client.post(url)).await.expect("send");
//then
// Drop implementation for mock_net should panic
}