Compare commits

..

3 commits

Author SHA1 Message Date
e8a4b04533 feat(net): be more permisive in what parameters are accepted 2024-11-10 09:56:22 +00:00
e4c695501c doc(fs): minor tidy up broken links 2024-11-10 09:56:22 +00:00
f1cfae7153 fix(fs): make TempFileSystem public
Some checks failed
Rust / build (map[name:stable]) (push) Failing after 35s
Rust / build (map[name:nightly]) (push) Failing after 1m26s
2024-11-10 09:56:22 +00:00
3 changed files with 20 additions and 34 deletions

View file

@ -110,44 +110,35 @@ mod tests {
// When `net` goes out of scope it will check that all the expected network requests (see // When `net` goes out of scope it will check that all the expected network requests (see
// `net.on(...)` below) were all made. If there are any that were not made, the test will // `net.on(...)` below) were all made. If there are any that were not made, the test will
// be failed. If you want to avoid this, then call `net.reset()` before your test ends. // be failed. If you want to avoid this, then call `net.reset()` before your test ends.
let mock_net: kxio::net::MockNet = kxio::net::mock(); let net: kxio::net::MockNet = kxio::net::mock();
let url = "http://localhost:8080"; let url = "http://localhost:8080";
// declare what response should be made for a given request // declare what response should be made for a given request
let response: http::Response<&str> = let response: http::Response<&str> =
mock_net.response().body("contents").expect("response body"); net.response().body("contents").expect("response body");
let request = mock_net.client().get(url).build().expect("request"); let request = net.client().get(url).build().expect("request");
mock_net net.on(request)
.on(request)
// By default, the METHOD and URL must match, equivalent to: // By default, the METHOD and URL must match, equivalent to:
//.match_on(vec![MatchOn::Method, MatchOn::Url]) //.match_on(vec![MatchOn::Method, MatchOn::Url])
.respond(response) .respond(response.into())
.expect("mock"); .expect("mock");
// Create a temporary directory that will be deleted with `fs` goes out of scope // Create a temporary directory that will be deleted with `fs` goes out of scope
let fs = kxio::fs::temp().expect("temp fs"); let fs = kxio::fs::temp().expect("temp fs");
let file_path = fs.base().join("foo"); let file_path = fs.base().join("foo");
// Create a [Net] from the [MockNet] to pass to the system under tets
let net = kxio::net::Net::from(mock_net);
//when //when
// Pass the file sytsem and network abstractions to the code to be tested // Pass the file sytsem and network abstractions to the code to be tested
download_and_save_to_file(url, &file_path, &fs, &net) download_and_save_to_file(url, &file_path, &fs, &net.into())
.await .await
.expect("system under test"); .expect("system under test");
//then //then
// Read the file // Open a file and read it
let file = fs.file(&file_path); let file = fs.file(&file_path);
let reader = file.reader().expect("reader"); let reader = file.reader().expect("reader");
let contents = reader.as_str(); let contents = reader.as_str();
assert_eq!(contents, "contents"); assert_eq!(contents, "contents");
// not needed for this test, but should it be needed, we can avoid checking for any
// unconsumed request matches.
let mock_net = kxio::net::MockNet::try_from(net).expect("recover mock");
mock_net.reset().expect("reset mock");
} }
} }

View file

@ -10,7 +10,6 @@ pub enum Error {
UnexpectedMockRequest(reqwest::Request), UnexpectedMockRequest(reqwest::Request),
RwLockLocked, RwLockLocked,
Http(http::Error), Http(http::Error),
NetIsNotAMock,
} }
impl std::error::Error for Error {} impl std::error::Error for Error {}
impl Clone for Error { impl Clone for Error {

View file

@ -68,16 +68,6 @@ impl Net {
} }
} }
} }
impl TryFrom<Net> for MockNet {
type Error = super::Error;
fn try_from(net: Net) -> std::result::Result<Self, Self::Error> {
match net.mock {
Some(inner_mock) => Ok(MockNet { inner: inner_mock }),
None => Err(Self::Error::NetIsNotAMock),
}
}
}
#[derive(Debug)] #[derive(Debug)]
pub struct MockNet { pub struct MockNet {
@ -85,19 +75,15 @@ pub struct MockNet {
} }
impl MockNet { impl MockNet {
pub fn client(&self) -> Client { pub fn client(&self) -> Client {
Default::default() self.inner.client()
} }
pub fn on(&self, request: impl Into<reqwest::Request>) -> OnRequest { pub fn on(&self, request: impl Into<reqwest::Request>) -> OnRequest {
self.inner.on(request) self.inner.on(request)
} }
/// Creates a [http::response::Builder] to be extended and returned by a mocked network request.
pub fn response(&self) -> http::response::Builder { pub fn response(&self) -> http::response::Builder {
Default::default() self.inner.response()
} }
pub async fn send( pub async fn send(&self, request: impl Into<reqwest::RequestBuilder>) -> Result<reqwest::Response> {
&self,
request: impl Into<reqwest::RequestBuilder>,
) -> Result<reqwest::Response> {
self.inner.send(request).await self.inner.send(request).await
} }
pub fn reset(&self) -> Result<()> { pub fn reset(&self) -> Result<()> {
@ -136,6 +122,11 @@ impl InnerNet<Unmocked> {
} }
} }
impl<T: NetType> InnerNet<T> {
pub fn client(&self) -> reqwest::Client {
Default::default()
}
}
impl InnerNet<Mocked> { impl InnerNet<Mocked> {
const fn new() -> Self { const fn new() -> Self {
Self { Self {
@ -190,6 +181,11 @@ impl InnerNet<Mocked> {
} }
} }
/// Creates a [http::response::Builder] to be extended and returned by a mocked network request.
pub fn response(&self) -> http::response::Builder {
Default::default()
}
pub fn on(&self, request: impl Into<reqwest::Request>) -> OnRequest { pub fn on(&self, request: impl Into<reqwest::Request>) -> OnRequest {
OnRequest { OnRequest {
net: self, net: self,