Skip to content

Commit c23bc54

Browse files
committed
php tests and wip rust
1 parent 7017768 commit c23bc54

File tree

3 files changed

+207
-0
lines changed

3 files changed

+207
-0
lines changed

src/api/source.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ pub struct Source {
1414
pub query: Option<String>,
1515
pub headers: Option<Vec<Header>>,
1616
pub methods: Option<Vec<String>>,
17+
pub exclude_methods: Option<bool>,
1718
pub response_status_codes: Option<Vec<u16>>,
19+
pub exclude_response_status_codes: Option<bool>,
1820
pub sampling: Option<u32>,
1921
#[serde(skip_serializing_if = "Option::is_none", default)]
2022
pub weekdays: Option<Vec<String>>,

src/router/route.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub struct Route<T: RouteData> {
1818
scheme: Option<String>,
1919
host: Option<StaticOrDynamic>,
2020
methods: Option<Vec<String>>,
21+
exclude_methods: Option<bool>,
2122
path_and_query: StaticOrDynamic,
2223
headers: Vec<RouteHeader>,
2324
ips: Option<Vec<RouteIp>>,

tests/redirectionio_router_test.rs

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9227,6 +9227,108 @@ fn test_rule_ip_trigger_not_in_range_2() {
92279227
assert_eq!(action.should_log_request(true, response_status_code, None), true);
92289228
}
92299229

9230+
fn setup_rule_methods_trigger() -> Router<Rule> {
9231+
let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
9232+
let mut router = Router::<Rule>::from_config(config);
9233+
9234+
let route_1: Rule = serde_json::from_str(r#"{"id":"rule-exclude-methods","rank":0,"source":{"methods":["GET","POST"],"path":"/exclude-methods"},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9235+
router.insert(route_1.into_route(&router.config));
9236+
9237+
let route_2: Rule = serde_json::from_str(r#"{"id":"rule-include-methods","rank":0,"source":{"methods":["GET","POST"],"path":"/include-methods"},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9238+
router.insert(route_2.into_route(&router.config));
9239+
9240+
router
9241+
}
9242+
9243+
9244+
#[test]
9245+
fn test_rule_methods_trigger_1() {
9246+
let router = setup_rule_methods_trigger();
9247+
let default_config = RouterConfig::default();
9248+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-methods"#), r#"/include-methods"#.to_string(),None,None,Some(r#"GET"#.to_string()),None,None);
9249+
9250+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9251+
let matched = router.match_request(&request_configured);
9252+
let traces = router.trace_request(&request_configured);
9253+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9254+
9255+
assert_eq!(!matched.is_empty(), true);
9256+
assert_eq!(!routes_traces.is_empty(), true);
9257+
9258+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9259+
let response_status_code = 0;
9260+
9261+
let action_status_code = action.get_status_code(response_status_code, None);
9262+
assert_eq!(action_status_code, 302);
9263+
let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9264+
assert_eq!(headers.len(), 1);
9265+
9266+
let target_header = headers.first().unwrap();
9267+
assert_eq!(target_header.name, "Location");
9268+
assert_eq!(target_header.value, r#"/bar"#);
9269+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
9270+
}
9271+
9272+
#[test]
9273+
fn test_rule_methods_trigger_2() {
9274+
let router = setup_rule_methods_trigger();
9275+
let default_config = RouterConfig::default();
9276+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-methods"#), r#"/include-methods"#.to_string(),None,None,Some(r#"HEAD"#.to_string()),None,None);
9277+
9278+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9279+
let matched = router.match_request(&request_configured);
9280+
let traces = router.trace_request(&request_configured);
9281+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9282+
9283+
assert_eq!(!matched.is_empty(), false);
9284+
assert_eq!(!routes_traces.is_empty(), false);
9285+
9286+
}
9287+
9288+
#[test]
9289+
fn test_rule_methods_trigger_3() {
9290+
let router = setup_rule_methods_trigger();
9291+
let default_config = RouterConfig::default();
9292+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-methods"#), r#"/exclude-methods"#.to_string(),None,None,Some(r#"GET"#.to_string()),None,None);
9293+
9294+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9295+
let matched = router.match_request(&request_configured);
9296+
let traces = router.trace_request(&request_configured);
9297+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9298+
9299+
assert_eq!(!matched.is_empty(), false);
9300+
assert_eq!(!routes_traces.is_empty(), false);
9301+
9302+
}
9303+
9304+
#[test]
9305+
fn test_rule_methods_trigger_4() {
9306+
let router = setup_rule_methods_trigger();
9307+
let default_config = RouterConfig::default();
9308+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-methods"#), r#"/exclude-methods"#.to_string(),None,None,Some(r#"HEAD"#.to_string()),None,None);
9309+
9310+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9311+
let matched = router.match_request(&request_configured);
9312+
let traces = router.trace_request(&request_configured);
9313+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9314+
9315+
assert_eq!(!matched.is_empty(), true);
9316+
assert_eq!(!routes_traces.is_empty(), true);
9317+
9318+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9319+
let response_status_code = 0;
9320+
9321+
let action_status_code = action.get_status_code(response_status_code, None);
9322+
assert_eq!(action_status_code, 302);
9323+
let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9324+
assert_eq!(headers.len(), 1);
9325+
9326+
let target_header = headers.first().unwrap();
9327+
assert_eq!(target_header.name, "Location");
9328+
assert_eq!(target_header.value, r#"/bar"#);
9329+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
9330+
}
9331+
92309332
fn setup_rule_multiple_headers() -> Router<Rule> {
92319333
let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
92329334
let mut router = Router::<Rule>::from_config(config);
@@ -9672,6 +9774,108 @@ fn test_rule_querystring_2() {
96729774
assert_eq!(action.should_log_request(true, response_status_code, None), true);
96739775
}
96749776

9777+
fn setup_rule_response_status_codes_trigger() -> Router<Rule> {
9778+
let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
9779+
let mut router = Router::<Rule>::from_config(config);
9780+
9781+
let route_1: Rule = serde_json::from_str(r#"{"id":"rule-exclude-status-codes","rank":0,"source":{"path":"/exclude-status-codes","response_status_codes":[200,201]},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9782+
router.insert(route_1.into_route(&router.config));
9783+
9784+
let route_2: Rule = serde_json::from_str(r#"{"id":"rule-include-status-codes","rank":0,"source":{"path":"/include-status-codes","response_status_codes":[200,201]},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9785+
router.insert(route_2.into_route(&router.config));
9786+
9787+
router
9788+
}
9789+
9790+
9791+
#[test]
9792+
fn test_rule_response_status_codes_trigger_1() {
9793+
let router = setup_rule_response_status_codes_trigger();
9794+
let default_config = RouterConfig::default();
9795+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-status-codes"#), r#"/include-status-codes"#.to_string(),None,None,None,None,None);
9796+
9797+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9798+
let matched = router.match_request(&request_configured);
9799+
let traces = router.trace_request(&request_configured);
9800+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9801+
9802+
assert_eq!(!matched.is_empty(), true);
9803+
assert_eq!(!routes_traces.is_empty(), true);
9804+
9805+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9806+
let response_status_code = 200;
9807+
9808+
let action_status_code = action.get_status_code(response_status_code, None);
9809+
assert_eq!(action_status_code, 302);
9810+
let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9811+
assert_eq!(headers.len(), 1);
9812+
9813+
let target_header = headers.first().unwrap();
9814+
assert_eq!(target_header.name, "Location");
9815+
assert_eq!(target_header.value, r#"/bar"#);
9816+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
9817+
}
9818+
9819+
#[test]
9820+
fn test_rule_response_status_codes_trigger_2() {
9821+
let router = setup_rule_response_status_codes_trigger();
9822+
let default_config = RouterConfig::default();
9823+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-status-codes"#), r#"/include-status-codes"#.to_string(),None,None,None,None,None);
9824+
9825+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9826+
let matched = router.match_request(&request_configured);
9827+
let traces = router.trace_request(&request_configured);
9828+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9829+
9830+
assert_eq!(!matched.is_empty(), false);
9831+
assert_eq!(!routes_traces.is_empty(), false);
9832+
9833+
}
9834+
9835+
#[test]
9836+
fn test_rule_response_status_codes_trigger_3() {
9837+
let router = setup_rule_response_status_codes_trigger();
9838+
let default_config = RouterConfig::default();
9839+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-status-codes"#), r#"/exclude-status-codes"#.to_string(),None,None,None,None,None);
9840+
9841+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9842+
let matched = router.match_request(&request_configured);
9843+
let traces = router.trace_request(&request_configured);
9844+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9845+
9846+
assert_eq!(!matched.is_empty(), false);
9847+
assert_eq!(!routes_traces.is_empty(), false);
9848+
9849+
}
9850+
9851+
#[test]
9852+
fn test_rule_response_status_codes_trigger_4() {
9853+
let router = setup_rule_response_status_codes_trigger();
9854+
let default_config = RouterConfig::default();
9855+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-status-codes"#), r#"/exclude-status-codes"#.to_string(),None,None,None,None,None);
9856+
9857+
let request_configured = Request::rebuild_with_config(&router.config, &request);
9858+
let matched = router.match_request(&request_configured);
9859+
let traces = router.trace_request(&request_configured);
9860+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9861+
9862+
assert_eq!(!matched.is_empty(), true);
9863+
assert_eq!(!routes_traces.is_empty(), true);
9864+
9865+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9866+
let response_status_code = 400;
9867+
9868+
let action_status_code = action.get_status_code(response_status_code, None);
9869+
assert_eq!(action_status_code, 302);
9870+
let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9871+
assert_eq!(headers.len(), 1);
9872+
9873+
let target_header = headers.first().unwrap();
9874+
assert_eq!(target_header.name, "Location");
9875+
assert_eq!(target_header.value, r#"/bar"#);
9876+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
9877+
}
9878+
96759879
fn setup_rule_sampling() -> Router<Rule> {
96769880
let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
96779881
let mut router = Router::<Rule>::from_config(config);

0 commit comments

Comments
 (0)