template-fragments 0.2.0

template-fragments for jinja-like engines
Documentation
use super::super::{filter_template, split_templates};

macro_rules! build_string_map {
    ($($key:expr => $value:expr,)*) => {
        {
            let mut res = ::std::collections::HashMap::<String, String>::new();
            $(res.insert(String::from($key), String::from($value));)*
            res
        }
    };
}
#[test]
fn reentrant_fragment() {
    let template = concat!(
        "{% fragment dummy %}\n",
        "{% fragment dummy %}\n",
        "{% endfragment %}\n",
        "{% endfragment %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn missing_name() {
    let template = concat!(
        "{% fragment %}\n",
        "{% endfragment %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn named_end() {
    let template = concat!(
        "{% fragment dummy %}\n",
        "{% endfragment dummy %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn missing_end() {
    let template = concat!(
        "{% fragment example %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn repeated_ends() {
    let template = concat!(
        "{% fragment example %}\n",
        "{% endfragment %}\n",
        "{% endfragment %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn trailing_content() {
    let template = concat!(
        "{% fragment example %} invalid\n",
        "{% endfragment %}\n",
    );

    assert!(filter_template(template, "").is_err());
    assert!(filter_template(template, "dummy").is_err());
    assert!(split_templates(template).is_err());
}

#[test]
fn example_1() {
    let template = concat!(
        "<body>\n",
        "<ul>\n",
        "{% fragment listing %}\n",
        "    {% for item in listing %}\n",
        "    <li>{{ item }}</li>\n",
        "    {% endfor %}\n",
        "{% endfragment %}\n",
        "</ul>\n",
        "{% fragment content %}\n",
        "<div>\n",
        "    {% for item in content %}\n",
        "    {% fragment content-item %}\n",
        "    <div>{{ item }}</div>\n",
        "    {% endfragment %}\n",
        "    {% endfor %}\n",
        "</div>\n",
        "{% endfragment %}\n",
        "</body>\n",
    );

    let expected = build_string_map! {
        "" => concat!(
            "<body>\n",
            "<ul>\n",
            "    {% for item in listing %}\n",
            "    <li>{{ item }}</li>\n",
            "    {% endfor %}\n",
            "</ul>\n",
            "<div>\n",
            "    {% for item in content %}\n",
            "    <div>{{ item }}</div>\n",
            "    {% endfor %}\n",
            "</div>\n",
            "</body>\n",
        ),
        "listing" => concat!(
            "    {% for item in listing %}\n",
            "    <li>{{ item }}</li>\n",
            "    {% endfor %}\n",
        ),
        "content" => concat!(
            "<div>\n",
            "    {% for item in content %}\n",
            "    <div>{{ item }}</div>\n",
            "    {% endfor %}\n",
            "</div>\n",
        ),
        "content-item" => concat!(
            "    <div>{{ item }}</div>\n",
        ),
    };
    assert_eq!(filter_template(template, "").as_ref(), Ok(&expected[""]));
    assert_eq!(filter_template(template, "listing").as_ref(), Ok(&expected["listing"]));
    assert_eq!(filter_template(template, "content").as_ref(), Ok(&expected["content"]));
    assert_eq!(filter_template(template, "content-item").as_ref(), Ok(&expected["content-item"]));
    assert_eq!(split_templates(template).as_ref(), Ok(&expected));
}

#[test]
fn example_2() {
    let template = concat!(
        "<body>\n",
        "    {% for item in items %}\n",
        "    {% fragment item %}\n",
        "    <div>\n",
        "        {{ item }}\n",
        "    </div>\n",
        "    {% endfragment %}\n",
        "    {% endfor %}\n",
        "<body>\n",
    );

    let expected = build_string_map! {
        "" => concat!(
            "<body>\n",
            "    {% for item in items %}\n",
            "    <div>\n",
            "        {{ item }}\n",
            "    </div>\n",
            "    {% endfor %}\n",
            "<body>\n",
        ),
        "item" => concat!(
            "    <div>\n",
            "        {{ item }}\n",
            "    </div>\n",
        ),
    };
    assert_eq!(filter_template(template, "").as_ref(), Ok(&expected[""]));
    assert_eq!(filter_template(template, "item").as_ref(), Ok(&expected["item"]));
    assert_eq!(split_templates(template).as_ref(), Ok(&expected));
}

#[test]
fn block_fragments() {
    let template = concat!(
        "<body>\n",
        "  {% for item in items %}\n",
        "  {% fragment-block item %}\n",
        "    <div>\n",
        "      {{ item }}\n",
        "    </div>\n",
        "  {% endfragment-block %}\n",
        "  {% endfor %}\n",
        "<body>\n",
    );

    let expected = build_string_map! {
        "" => concat!(
            "<body>\n",
            "  {% for item in items %}\n",
            "  {% block item %}\n",
            "    <div>\n",
            "      {{ item }}\n",
            "    </div>\n",
            "  {% endblock %}\n",
            "  {% endfor %}\n",
            "<body>\n",
        ),
        "item" => concat!(
            "  {% block item %}\n",
            "    <div>\n",
            "      {{ item }}\n",
            "    </div>\n",
            "  {% endblock %}\n",
        ),
    };
    assert_eq!(filter_template(template, "").as_ref(), Ok(&expected[""]));
    assert_eq!(filter_template(template, "item").as_ref(), Ok(&expected["item"]));
    assert_eq!(split_templates(template).as_ref(), Ok(&expected));
}

#[test]
fn nested_block_fragments() {
    let template = concat!(
        "<body>\n",
        "  {% fragment-block outer %}\n",
        "  {% for item in items %}\n",
        "  {% fragment-block item %}\n",
        "    <div>\n",
        "      {{ item }}\n",
        "    </div>\n",
        "  {% endfragment-block %}\n",
        "  {% endfor %}\n",
        "  {% endfragment-block %}\n",
        "<body>\n",
    );

    let expected = build_string_map! {
        "" => concat!(
            "<body>\n",
            "  {% block outer %}\n",
            "  {% for item in items %}\n",
            "  {% block item %}\n",
            "    <div>\n",
            "      {{ item }}\n",
            "    </div>\n",
            "  {% endblock %}\n",
            "  {% endfor %}\n",
            "  {% endblock %}\n",
            "<body>\n",
        ),
        "item" => concat!(
            "  {% block item %}\n",
            "    <div>\n",
            "      {{ item }}\n",
            "    </div>\n",
            "  {% endblock %}\n",
        ),
        "outer" => concat!(
            "  {% block outer %}\n",
            "  {% for item in items %}\n",
            "  {% block item %}\n",
            "    <div>\n",
            "      {{ item }}\n",
            "    </div>\n",
            "  {% endblock %}\n",
            "  {% endfor %}\n",
            "  {% endblock %}\n",
        ),
    };
    assert_eq!(filter_template(template, "").as_ref(), Ok(&expected[""]));
    assert_eq!(filter_template(template, "item").as_ref(), Ok(&expected["item"]));
    assert_eq!(filter_template(template, "outer").as_ref(), Ok(&expected["outer"]));
    assert_eq!(split_templates(template).as_ref(), Ok(&expected));
}

#[test]
fn repeated_fragment() {
    let template = concat!(
        "{% fragment foo bar %}\n",
        "    <common>\n",
        "{% endfragment %}\n",
        "{% fragment foo %}\n",
        "    <foo>\n",
        "{% endfragment %}\n",
        "{% fragment bar %}\n",
        "    <bar>\n",
        "{% endfragment %}\n",
    );

    let expected = build_string_map! {
        "" => concat!(
            "    <common>\n",
            "    <foo>\n",
            "    <bar>\n",
        ),
        "foo" => concat!(
            "    <common>\n",
            "    <foo>\n",
        ),
        "bar" => concat!(
            "    <common>\n",
            "    <bar>\n",
        ),
    };
    assert_eq!(filter_template(template, "").as_ref(), Ok(&expected[""]));
    assert_eq!(filter_template(template, "foo").as_ref(), Ok(&expected["foo"]));
    assert_eq!(filter_template(template, "bar").as_ref(), Ok(&expected["bar"]));
    assert_eq!(split_templates(template).as_ref(), Ok(&expected));
}