kitamura 0.2.0

Templating engine
Documentation
use std::collections::HashMap;

#[test]
fn condition_present_with_no_valid_param_provided() {
    let html =
        "Hello{#if first_name?exists && first_name?not_empty#}${first_name}{#endif#}!".to_owned();
    let mut params = HashMap::new();

    params.insert("first_name".to_owned(), serde_json::json!({}));

    let expeccted_output = "Hello!".to_owned();
    let rendered_html = kitamura::render_template(html, params).unwrap();
    assert_eq!(rendered_html, expeccted_output);
}

#[test]
fn nested_condition_present_with_no_valid_param_provided() {
    let html = "Hello{#if first_name?exists && first_name?not_empty#}${first_name}{#if last_name?exists && last_name?not_empty#}${last_name}{#endif#}{#endif#}!".to_owned();
    let mut params = HashMap::new();

    params.insert("first_name".to_owned(), serde_json::json!({}));

    let expeccted_output = "Hello!".to_owned();
    let rendered_html = kitamura::render_template(html, params).unwrap();
    assert_eq!(rendered_html, expeccted_output);
}

#[test]
fn exists() {
    let html = "Hello{#if first_name?exists#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn not_empty() {
    let html = "Hello{#if first_name?not_empty#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!(""))]);

    let expected_output = "Hello!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn not_empty_but_param_is_missing() {
    let html =
        "Hello{#if first_name?exists && first_name?not_empty#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::new();

    let expected_output = "Hello!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn combination_of_present_missing_not_empty_empty() {
    let html = "Hello{#if first_name?exists && first_name?not_empty#} ${first_name}{#endif#}!
{#if this_doesnt_exist?exists#}
  <p>This won't appear in render ${this_doesnt_exist}</p>
{#endif#}
{#if something?exists && something?not_empty#}
 <p>${something}</p>
{#endif#}"
        .to_owned();
    let params = HashMap::from([
        ("first_name".to_owned(), serde_json::json!("Joel")),
        ("something".to_owned(), serde_json::json!("")),
    ]);

    let expected_output = "Hello Joel!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn invalid_data_inside_one_condition_only() {
    let html = "Hello{#if first_name?exists#} ${this_isnt_provided}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let rendered_html = kitamura::render_template(html.clone(), params);
    assert!(rendered_html.is_err());
}

#[test]
fn invalid_data_inside_condition() {
    let html =
        "Hello{#if first_name?exists && first_name?not_empty#} ${this_isnt_provided}{#endif#}!"
            .to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let rendered_html = kitamura::render_template(html.clone(), params);
    assert!(rendered_html.is_err());
}

#[test]
fn invalid_amount_of_args() {
    let html = "Hello{#if first_name?exists &&#} ${first_name}{#endif#}!".to_owned();
    let mut params = HashMap::new();

    params.insert("first_name".to_owned(), serde_json::json!({}));

    let rendered_html = kitamura::render_template(html, params);

    assert!(rendered_html.is_err());
}

#[test]
fn invalid_api_provided() {
    let html = "Hello{#if first_name?this_is_not_valid_api#} ${first_name}{#endif#}!".to_owned();
    let mut params = HashMap::new();

    params.insert("first_name".to_owned(), serde_json::json!({}));

    let rendered_html = kitamura::render_template(html, params);

    assert!(rendered_html.is_err());
}

// Random groupings to assert I didn't stuff this up
#[test]
fn grouping_a() {
    let html = "Hello{#if ((first_name?exists && first_name?not_empty) && ((first_name?exists) && ((first_name?exists && first_name?not_empty && (last_name?exists))))) || (last_name?exists && last_name?not_empty)#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn grouping_b() {
    let html = "Hello{#if ((first_name?exists && first_name?not_empty) && ((first_name?exists) && ((first_name?exists && first_name?not_empty || (last_name?exists))))) || (last_name?exists && last_name?not_empty)#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn grouping_c() {
    let html = "Hello{#if first_name?exists && first_name?not_empty || ((last_name?exists))#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn grouping_d() {
    let html = "Hello{#if ((first_name?exists && first_name?not_empty) || (first_name?exists || last_name?exists)) || last_name?exists #} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn grouping_e() {
    let html =
        "Hello{#if last_name?exists && (last_name?exists)#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn grouping_f() {
    let html =
        "Hello{#if (first_name?exists) && (first_name?exists)#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!".to_owned();
    let rendered_html = kitamura::render_template(html.clone(), params)
        .unwrap()
        .replace('\n', "");
    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison() {
    let html =
        "Hello{#if first_name?exists && first_name == 'Joel'#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison_not_successful() {
    let html = "Hello{#if first_name?exists && first_name == 'something'#} ${first_name}{#endif#}!"
        .to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison_not_equal_to() {
    let html =
        "Hello{#if first_name?exists && first_name != 'Joel'#} ${first_name}{#endif#}!".to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison_not_equal_to_renders() {
    let html = "Hello{#if first_name?exists && first_name != 'something'#} ${first_name}{#endif#}!"
        .to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison_contains_matches() {
    let html =
        "Hello{#if first_name?exists && first_name?contains('Joel')#} ${first_name}{#endif#}!"
            .to_owned();
    let params = HashMap::from([("first_name".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello Joel!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}

#[test]
fn value_comparison_contains_matches_failed() {
    let html = "Hello{#if ninechars?contains('werfgh')#} ${ninechars}{#endif#}!".to_owned();
    let params = HashMap::from([("ninechars".to_owned(), serde_json::json!("Joel"))]);

    let expected_output = "Hello!";
    let rendered_html = kitamura::render_template(html.clone(), params).unwrap();

    assert_eq!(rendered_html, expected_output);
}