rust-web-server 17.38.0

An HTTP web framework, reverse proxy, and server for Rust supporting HTTP/1.1, HTTP/2, and HTTP/3. Config-driven proxy mode (rws.config.toml with [[route]] / [[upstream]]) or library crate. No third-party HTTP dependencies.
Documentation
use std::collections::HashMap;
use crate::symbol::SYMBOL;
use crate::url::path::{Part, UrlPath};

#[test]
fn parts() {
    let pattern = "[[name]]/some/path/[[id]]/another/part/[[param]]/ending";
    let parts : Vec<Part> = UrlPath::extract_parts_from_pattern(pattern).unwrap();
    assert_eq!(parts.len(), 6);

    let name_param = parts.get(0).unwrap();
    assert_eq!(name_param.is_static, false);
    assert_eq!(name_param.name.clone().unwrap(), "name");
    assert!(name_param.value.clone().is_none());
    assert!(name_param.static_pattern.clone().is_none());

    let name_param = parts.get(1).unwrap();
    assert_eq!(name_param.is_static, true);
    assert!(name_param.name.clone().is_none());
    assert!(name_param.value.clone().is_none());
    assert_eq!(name_param.static_pattern.clone().unwrap(), "/some/path/");

    let name_param = parts.get(2).unwrap();
    assert_eq!(name_param.is_static, false);
    assert_eq!(name_param.name.clone().unwrap(), "id");
    assert!(name_param.value.clone().is_none());
    assert!(name_param.static_pattern.clone().is_none());

    let name_param = parts.get(3).unwrap();
    assert_eq!(name_param.is_static, true);
    assert!(name_param.name.clone().is_none());
    assert!(name_param.value.clone().is_none());
    assert_eq!(name_param.static_pattern.clone().unwrap(), "/another/part/");

    let name_param = parts.get(4).unwrap();
    assert_eq!(name_param.is_static, false);
    assert_eq!(name_param.name.clone().unwrap(), "param");
    assert!(name_param.value.clone().is_none());
    assert!(name_param.static_pattern.clone().is_none());

    let name_param = parts.get(5).unwrap();
    assert_eq!(name_param.is_static, true);
    assert!(name_param.name.clone().is_none());
    assert!(name_param.value.clone().is_none());
    assert_eq!(name_param.static_pattern.clone().unwrap(), "/ending");

}

#[test]
fn parts_extra_opening_bracket() {
    let pattern = "[[[[[name]]";
    let reason : String = UrlPath::extract_parts_from_pattern(pattern).err().unwrap();
    assert_eq!(reason, "at least one extra [ char");
}

#[test]
fn parts_extra_nested_token() {
    let pattern = "[[[[password]]name]]";
    let reason : String = UrlPath::extract_parts_from_pattern(pattern).err().unwrap();
    assert_eq!(reason, "at least one extra [ char");

}

#[test]
fn parts_malformed() {
    let pattern = "[[name]][[other_param]]/some/path/[[id]]/another/part/[[param]]";
    let reason : String = UrlPath::extract_parts_from_pattern(pattern).err().unwrap();
    assert_eq!(reason, "two consecutive tokens one after another")

}

#[test]
fn parts_malformed_whitespace() {
    let pattern = " [[name]][[other_param]]/some/path/[[id]]/another/part/[[param]]";
    let reason : String = UrlPath::extract_parts_from_pattern(pattern).err().unwrap();
    assert_eq!(reason, "path contains control character or whitespace")

}

#[test]
fn is_matching() {
    let url = "/some/path/1234";
    let pattern = "/some/path/[[id]]";

    let is_matching = UrlPath::is_matching(url, pattern).unwrap();

    assert!(is_matching);
}

#[test]
fn is_matching_multiple_tokens() {
    let url = "/some/path/1234/another/path/asd";
    let pattern = "/some/path/[[id]]/another/path/[[name]]";

    let is_matching = UrlPath::is_matching(url, pattern).unwrap();

    assert!(is_matching);
}

#[test]
fn is_matching_whitespace_path() {
    let url = "/so me/path/1234";
    let pattern = "/some/path/[[id]]";

    let is_matching_boxed = UrlPath::is_matching(url, pattern);

    assert!(is_matching_boxed.is_err());
    assert_eq!("path contains control character or whitespace", is_matching_boxed.err().unwrap());
}
#[test]
fn is_matching_control_char_path() {
    let url = format!("/so{}me/path/1234", SYMBOL.control_char_string_terminator);
    let pattern = "/some/path/[[id]]";

    let is_matching_boxed = UrlPath::is_matching(url.as_str(), pattern);

    assert!(is_matching_boxed.is_err());
    assert_eq!("path contains control character or whitespace", is_matching_boxed.err().unwrap());
}

#[test]
fn is_matching_whitespace_pattern() {
    let url = "/some/path/1234";
    let pattern = "/so me/path/[[id]]";

    let is_matching_boxed = UrlPath::is_matching(url, pattern);

    assert!(is_matching_boxed.is_err());
    assert_eq!("path contains control character or whitespace", is_matching_boxed.err().unwrap());
}

#[test]
fn build() {
    let mut params = HashMap::new();
    params.insert("name".to_string(), "SomeName".to_string());
    params.insert("number".to_string(), "12345".to_string());

    let pattern = "[[name]]/somename/[[number]]/somenumber";

    let built_token_string = UrlPath::build(params, pattern).unwrap();
    assert_eq!("SomeName/somename/12345/somenumber".to_string(), built_token_string);
}

#[test]
fn build_v5() {
    let mut params = HashMap::new();
    params.insert("name".to_string(), "SomeName".to_string());

    let pattern = "[[name]]/somename/[[number]]/somenumber";

    let error = UrlPath::build(params, pattern).err().unwrap();
    assert_eq!("specified parameter number is not found".to_string(), error);
}

#[test]
fn build_non_url() {
    let mut params = HashMap::new();
    params.insert("name".to_string(), "SomeName".to_string());
    params.insert("number".to_string(), "12345".to_string());

    let pattern = "[[name]]somename[[number]]somenumber";

    let built_token_string = UrlPath::build(params, pattern).unwrap();
    assert_eq!("SomeNamesomename12345somenumber".to_string(), built_token_string);
}

#[test]
fn build_v2() {
    let mut params = HashMap::new();
    params.insert("name".to_string(), "SomeName".to_string());

    let pattern = "[[name]]";

    let built_token_string = UrlPath::build(params, pattern).unwrap();
    assert_eq!("SomeName".to_string(), built_token_string);
}

#[test]
fn build_v4() {
    let mut params = HashMap::new();
    params.insert("name".to_string(), "SomeName".to_string());
    params.insert("number".to_string(), "12345".to_string());

    let pattern = "somename/[[name]]/";

    let built_token_string = UrlPath::build(params, pattern).unwrap();
    assert_eq!("somename/SomeName/".to_string(), built_token_string);
}

#[test]
fn build_v3() {
    let  params = HashMap::new();

    let pattern = "";

    let built_token_string = UrlPath::build(params, pattern).unwrap();
    assert_eq!("".to_string(), built_token_string);
}

#[test]
fn extract() {
    let pattern = "[[name]]/somename/[[number]]/somenumber";
    let text = "SomeName/somename/12345/somenumber";

    let resulting_map = UrlPath::extract(text, pattern).unwrap();
    let name = resulting_map.get("name").unwrap();
    let number = resulting_map.get("number").unwrap();
    assert_eq!("SomeName", name);
    assert_eq!("12345", number);
}

#[test]
fn extract_v2() {
    let pattern = "somename/[[name]]/somenumber/[[number]]";
    let text = "somename/SomeName/somenumber/12345";

    let resulting_map = UrlPath::extract(text, pattern).unwrap();
    let name = resulting_map.get("name").unwrap();
    let number = resulting_map.get("number").unwrap();
    assert_eq!("SomeName", name);
    assert_eq!("12345", number);
}

#[test]
fn extract_v3() {
    let pattern = "somename/[[name]]";
    let text = "somename/SomeName";

    let resulting_map = UrlPath::extract(text, pattern).unwrap();
    let name = resulting_map.get("name").unwrap();
    assert_eq!("SomeName", name);
}
#[test]
fn extract_v4() {
    let pattern = "[[name]]";
    let text = "SomeName";

    let resulting_map = UrlPath::extract(text, pattern).unwrap();
    let name = resulting_map.get("name").unwrap();
    assert_eq!("SomeName", name);
}

#[test]
fn extract_v5() {
    let pattern = "somename";
    let text = "somename/SomeName";

    let resulting_map = UrlPath::extract(text, pattern).unwrap();
    let number_of_params = resulting_map.len();
    assert_eq!(0, number_of_params);
}