use std::net::IpAddr;
use std::str::FromStr;
use providers::prelude::*;
use common::prelude::*;
#[derive(Debug)]
pub struct TestingProvider {
config: String,
}
impl ProviderTrait for TestingProvider {
fn new(config: &str) -> Result<Self> {
if config != "FAIL" {
Ok(TestingProvider {
config: config.into(),
})
} else {
Err(ErrorKind::ProviderNotFound(String::new()).into())
}
}
fn validate(&self, request: &Request) -> RequestType {
let req;
if let &Request::Web(ref inner) = request {
req = inner;
} else {
return RequestType::Invalid;
}
if let Some(secret) = req.params.get("secret") {
if secret != "testing" {
return RequestType::Invalid;
}
}
if let Some(ip) = req.params.get("ip") {
if req.source != IpAddr::from_str(ip).unwrap() {
return RequestType::Invalid;
}
}
if let Some(request_type) = req.params.get("request_type") {
match request_type.as_ref() {
"ping" => {
return RequestType::Ping;
}
_ => {}
}
}
RequestType::ExecuteHook
}
fn build_env(&self, r: &Request, b: &mut EnvBuilder) -> Result<()> {
let req;
if let &Request::Web(ref inner) = r {
req = inner;
} else {
return Ok(());
}
if let Some(env) = req.params.get("env") {
b.add_env("ENV", env);
}
writeln!(b.data_file("prepared")?, "prepared")?;
Ok(())
}
fn trigger_status_hooks(&self, request: &Request) -> bool {
if let &Request::Web(ref inner) = request {
!inner.params.contains_key("ignore_status_hooks")
} else {
true
}
}
}
#[cfg(test)]
mod tests {
use std::net::IpAddr;
use std::str::FromStr;
use utils::testing::*;
use requests::RequestType;
use providers::ProviderTrait;
use scripts::EnvBuilder;
use super::TestingProvider;
#[test]
fn test_new() {
assert!(TestingProvider::new("").is_ok());
assert!(TestingProvider::new("SOMETHING").is_ok());
assert!(TestingProvider::new("FAIL").is_err());
}
#[test]
fn test_validate() {
let p = TestingProvider::new("").unwrap();
assert_eq!(
p.validate(&dummy_web_request().into()),
RequestType::ExecuteHook
);
let mut req = dummy_web_request();
req.params
.insert("secret".to_string(), "wrong!!!".to_string());
assert_eq!(p.validate(&req.into()), RequestType::Invalid);
let mut req = dummy_web_request();
req.params
.insert("secret".to_string(), "testing".to_string());
assert_eq!(p.validate(&req.into()), RequestType::ExecuteHook);
let mut req = dummy_web_request();
req.params.insert("ip".into(), "127.1.1.1".into());
req.source = IpAddr::from_str("127.2.2.2").unwrap();
assert_eq!(p.validate(&req.into()), RequestType::Invalid);
let mut req = dummy_web_request();
req.params.insert("ip".into(), "127.1.1.1".into());
req.source = IpAddr::from_str("127.1.1.1").unwrap();
assert_eq!(p.validate(&req.into()), RequestType::ExecuteHook);
let mut req = dummy_web_request();
req.params
.insert("request_type".to_string(), "something".to_string());
assert_eq!(p.validate(&req.into()), RequestType::ExecuteHook);
let mut req = dummy_web_request();
req.params
.insert("request_type".to_string(), "ping".to_string());
assert_eq!(p.validate(&req.into()), RequestType::Ping);
}
#[test]
fn test_build_env() {
let p = TestingProvider::new("").unwrap();
let mut b = EnvBuilder::dummy();
p.build_env(&dummy_web_request().into(), &mut b).unwrap();
assert_eq!(b.dummy_data().env, hashmap! {
"PREPARED".into() => "prepared".into(),
});
assert_eq!(b.dummy_data().files, hashmap! {
"prepared".into() => "prepared\n".bytes().collect::<Vec<_>>(),
});
let mut req = dummy_web_request();
req.params.insert("env".to_string(), "test".to_string());
let mut b = EnvBuilder::dummy();
p.build_env(&req.into(), &mut b).unwrap();
assert_eq!(b.dummy_data().env, hashmap! {
"PREPARED".into() => "prepared".into(),
"ENV".into() => "test".into(),
});
assert_eq!(b.dummy_data().files, hashmap! {
"prepared".into() => "prepared\n".bytes().collect::<Vec<_>>(),
});
}
#[test]
fn test_trigger_status_hooks() {
let p = TestingProvider::new("").unwrap();
assert!(p.trigger_status_hooks(&dummy_web_request().into()));
let mut req = dummy_web_request();
req.params
.insert("ignore_status_hooks".into(), "yes".into());
assert!(!p.trigger_status_hooks(&req.into()));
}
}