diff options
| author | Kevin J Hoerr <kjhoerr@protonmail.com> | 2019-11-04 14:06:58 -0500 |
|---|---|---|
| committer | Kevin J Hoerr <kjhoerr@protonmail.com> | 2019-11-04 14:06:58 -0500 |
| commit | 4117f797cec89927fe3363543b8c8b11a311b90c (patch) | |
| tree | 3f7320ee5a81a2e760c9f87991d63771633e5865 | |
| parent | 0c1dce106e0fb211cb52b2a780febd2a1b5f0a47 (diff) | |
| download | august-offensive-4117f797cec89927fe3363543b8c8b11a311b90c.tar.gz august-offensive-4117f797cec89927fe3363543b8c8b11a311b90c.tar.bz2 august-offensive-4117f797cec89927fe3363543b8c8b11a311b90c.zip | |
Move FormatMsg to routes and add unit tests
| -rw-r--r-- | .travis.yml | 2 | ||||
| -rw-r--r-- | src/main.rs | 2 | ||||
| -rw-r--r-- | src/messages/format_msg.rs | 37 | ||||
| -rw-r--r-- | src/messages/mod.rs | 2 | ||||
| -rw-r--r-- | src/routes/format_msg.rs | 124 | ||||
| -rw-r--r-- | src/routes/mod.rs | 12 |
6 files changed, 133 insertions, 46 deletions
diff --git a/.travis.yml b/.travis.yml index 04ebecf..e05b88a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,6 @@ before_cache: if [[ "$TRAVIS_RUST_VERSION" == "stable" ]]; then cargo install -f cargo-tarpaulin fi -before_script: - - export PATH="$PATH:~/.cargo/bin" script: - cargo build --verbose --all - cargo test --verbose --all diff --git a/src/main.rs b/src/main.rs index ecb7219..7a398e7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,7 @@ use diesel::prelude::*; use dotenv::dotenv; use std::{env, io::Error}; +#[cfg_attr(tarpaulin, skip)] fn main() { if let Err(ref e) = run() { error!("error: {}", e); @@ -30,6 +31,7 @@ fn main() { } // Run start-up for the server and dependencies +#[cfg_attr(tarpaulin, skip)] fn run() -> Result<(), Error> { dotenv().ok(); let db_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); diff --git a/src/messages/format_msg.rs b/src/messages/format_msg.rs deleted file mode 100644 index 34e4981..0000000 --- a/src/messages/format_msg.rs +++ /dev/null @@ -1,37 +0,0 @@ -use actix_web::{http::StatusCode, Error, HttpRequest, HttpResponse, Responder}; -use serde::Serialize; - -pub struct FormatMsg<T> { - pub message: T, - pub code: StatusCode, -} - -impl<T> FormatMsg<T> { - /// Deconstruct to an inner value - pub fn into_inner(self) -> T { - self.message - } - - pub fn ok(message: T) -> Self { - FormatMsg { - message: message, - code: StatusCode::OK, - } - } -} - -impl<T: Serialize> Responder for FormatMsg<T> { - type Error = Error; - type Future = Result<HttpResponse, Error>; - - fn respond_to(self, _: &HttpRequest) -> Self::Future { - let body = match serde_json::to_string(&self.message) { - Ok(body) => body, - Err(e) => return Err(e.into()), - }; - - Ok(HttpResponse::build(self.code) - .content_type("application/json") - .body(body)) - } -}
\ No newline at end of file diff --git a/src/messages/mod.rs b/src/messages/mod.rs index afc97c6..37a1cb7 100644 --- a/src/messages/mod.rs +++ b/src/messages/mod.rs @@ -1,10 +1,8 @@ use std::marker::Sized; -pub mod format_msg; pub mod callback; pub mod not_understood; -pub use self::format_msg::FormatMsg; pub use self::callback::Callback; pub use self::not_understood::NotUnderstood; diff --git a/src/routes/format_msg.rs b/src/routes/format_msg.rs new file mode 100644 index 0000000..d7a6f05 --- /dev/null +++ b/src/routes/format_msg.rs @@ -0,0 +1,124 @@ +use actix_web::{http::StatusCode, Error, HttpRequest, HttpResponse, Responder}; +use serde::Serialize; + +pub struct FormatMsg<T> { + pub message: T, + pub code: StatusCode, +} + +impl<T> FormatMsg<T> { + /// Deconstruct to an inner value + pub fn into_inner(self) -> T { + self.message + } + + pub fn ok(message: T) -> Self { + FormatMsg { + message: message, + code: StatusCode::OK, + } + } +} + +impl<T: Serialize> Responder for FormatMsg<T> { + type Error = Error; + type Future = Result<HttpResponse, Error>; + + fn respond_to(self, _: &HttpRequest) -> Self::Future { + let body = match serde_json::to_string(&self.message) { + Ok(body) => body, + Err(e) => return Err(e.into()), + }; + + Ok(HttpResponse::build(self.code) + .content_type("application/json") + .body(body)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use routes::*; + use routes::tests::*; + use serde::ser::{Error, Serializer}; + + #[test] + fn test_into_inner() { + // Arrange + let msg = NotUnderstood {path: vec![]}; + let msg_ref = msg.clone(); + let formatted = FormatMsg { + message: msg.as_outgoing(), + code: StatusCode::OK, + }; + + // Act + let result = formatted.into_inner(); + + // Assert + assert_eq!(result.result_type, "NOT_UNDERSTOOD"); + assert_eq!(result.content, msg_ref); + } + + #[test] + fn test_ok() { + // Arrange + let msg = NotUnderstood {path: vec![]}; + let msg_ref = msg.clone(); + + // Act + let result = FormatMsg::ok(msg); + + // Assert + assert_eq!(result.message, msg_ref); + assert_eq!(result.code, StatusCode::OK); + } + + #[test] + fn test_responder() { + // Arrange + let msg = NotUnderstood {path: vec![]}; + let msg_ref = msg.clone(); + let formatted = FormatMsg { + message: msg, + code: StatusCode::NOT_FOUND, + }; + let request = gen_request("/api/404", None); + + // Act + let result = &formatted.respond_to(&request).unwrap(); + + // Assert + assert_eq!(result.status(), StatusCode::NOT_FOUND); + assert_eq!(result.headers().get("content-type").unwrap(), "application/json"); + + let content = get_message::<NotUnderstood>(result); + assert_eq!(content, msg_ref); + } + + struct InvalidMessage {} + + impl Serialize for InvalidMessage { + fn serialize<S>(&self, _: S) -> Result<S::Ok, S::Error> where S: Serializer { + Err(Error::custom("oops".to_string())) + } + } + + #[test] + fn test_responder_serde_error() { + // Arrange + let msg = InvalidMessage {}; + let formatted = FormatMsg { + message: msg, + code: StatusCode::NOT_FOUND, + }; + let request = gen_request("/api/404", None); + + // Act + let result = formatted.respond_to(&request); + + // Assert + assert!(result.is_err()); + } +}
\ No newline at end of file diff --git a/src/routes/mod.rs b/src/routes/mod.rs index dd7a526..759375d 100644 --- a/src/routes/mod.rs +++ b/src/routes/mod.rs @@ -3,9 +3,11 @@ use actix_web::http::StatusCode; use messages::*; use std::collections::HashMap; +pub mod format_msg; mod callback; mod not_understood; +pub use self::format_msg::FormatMsg; use self::callback::callback; use self::not_understood::not_understood; @@ -32,7 +34,7 @@ mod tests { use super::*; use actix_web::{http::Method, test::TestRequest}; use actix_web::{App, dev::Service, test::{block_on, init_service}}; - use actix_web::dev::{Body, ServiceResponse}; + use actix_web::{HttpResponse, dev::Body}; use serde::Deserialize; use std::str; @@ -49,7 +51,7 @@ mod tests { // Assert assert_eq!(resp.status(), StatusCode::OK); - let content = get_message::<OutgoingMsg<Callback>>(resp); + let content = get_message::<OutgoingMsg<Callback>>(resp.response()); assert_eq!(content.result_type, "CALLBACK"); assert_eq!(content.content.path, vec!["api", "callback"]); } @@ -67,7 +69,7 @@ mod tests { // Assert assert_eq!(resp.status(), StatusCode::NOT_FOUND); - let content = get_message::<OutgoingMsg<NotUnderstood>>(resp); + let content = get_message::<OutgoingMsg<NotUnderstood>>(resp.response()); assert_eq!(content.result_type, "NOT_UNDERSTOOD"); assert_eq!(content.content.path, vec!["api", "404"]); } @@ -137,8 +139,8 @@ mod tests { Query::from_query(&query_str).unwrap() } - fn get_message<'a, T: Deserialize<'a>>(response: &'a ServiceResponse) -> T { - let body = response.response().body().as_ref().unwrap(); + pub fn get_message<'a, T: Deserialize<'a>>(response: &'a HttpResponse) -> T { + let body = response.body().as_ref().unwrap(); let mut array = &[b'0';0][..]; match body { Body::Bytes(b) => { |
