diff options
-rw-r--r-- | src/lib.rs | 38 | ||||
-rw-r--r-- | tests/zotapi.rs | 17 |
2 files changed, 48 insertions, 7 deletions
@@ -3,11 +3,32 @@ extern crate reqwest; use reqwest::{ header::{Accept, qitem}, mime, + StatusCode, }; use std::io::Read; const ZOTAPI_CHANNEL_STREAM_PATH : &str = "/api/z/1.0/channel/stream"; +#[derive(Debug)] +pub enum Error { + Http(reqwest::Error), + Io(std::io::Error), + Unauthorized, + Unknown, +} + +impl From<reqwest::Error> for Error { + fn from(e: reqwest::Error) -> Error { + Error::Http(e) + } +} + +impl From<std::io::Error> for Error { + fn from(e: std::io::Error) -> Error { + Error::Io(e) + } +} + pub struct Client { inner: reqwest::Client, base_url: String, @@ -16,17 +37,22 @@ pub struct Client { } impl Client { - pub fn channel_stream(&self) -> String { + pub fn channel_stream(&self) -> Result<String, Error> { let url = self.url(ZOTAPI_CHANNEL_STREAM_PATH); let mut res = self.inner.get(&url) .header(Accept(vec![qitem(mime::APPLICATION_JSON)])) .basic_auth(self.user.clone(), Some(self.pw.clone())) - .send() - .unwrap(); + .send()?; - let mut body = String::new(); - res.read_to_string(&mut body).unwrap(); - body + match res.status() { + StatusCode::Unauthorized => Err(Error::Unauthorized), + StatusCode::Ok => { + let mut body = String::new(); + res.read_to_string(&mut body)?; + Ok(body) + }, + _ => Err(Error::Unknown) + } } fn url(&self, path: &str) -> String { diff --git a/tests/zotapi.rs b/tests/zotapi.rs index 102e5de..2a376a2 100644 --- a/tests/zotapi.rs +++ b/tests/zotapi.rs @@ -15,5 +15,20 @@ fn get_channel_stream() { let z = zotapi::client(&format!("http://{}", mockito::SERVER_ADDRESS), "testuser", "test1234"); let data = z.channel_stream(); m.assert(); - assert_eq!(data, "{}"); + assert_eq!(data.unwrap(), "{}"); +} + +#[test] +fn return_error_if_invalid_auth_provided() { + let m = mock("GET", "/api/z/1.0/channel/stream") + .with_status(401) + .with_header("content-type", "text") + .with_body("This api requires login") + .create(); + + let z = zotapi::client(&format!("http://{}", mockito::SERVER_ADDRESS), "nouser", "wrongpassword"); + let data = z.channel_stream(); + m.assert(); + assert!(data.is_err()); + assert_eq!(format!("{:?}", data), "Err(Unauthorized)"); } |