zola/components/rendering/tests/links.rs
Vincent Prouillet 637b00547a
Shortcodes (#1640)
* Next version

* Added tests for shortcode insertion

* Added TOC tests

* Added test for #1475 and #1355

* Basic internal / external links tests

* Added integration test

* Added pseudocode and started on logos

* Logos parsing for shortcodes

* Fixed string literal parsing

Moved string literal parsing to a new lexer in order to have greater
control of control characters which are parsed. This fixes the bug that
was present in the `string_from_quoted` function and also moves the
`QuoteType` to be in the `ArgValueToken`.

* Moved string literal logic to seperate module

* Added square bracket notation for variables

* Error handling rewritten

Remove the Result from the `fetch_shortcodes` function. Added proper
messages within the internal parsing.

* Reorganized and documented the shortcode submodule

* Added all logic for ShortcodeContext spans

* Added working insertion code for MD files

* Made functions generic over Markdown or HTML

* Add check for embedding bodies

* Structure of main function clear

* Added test for `new_with_transforms` function

* It runs!

* Added the code for handling p-ed html shortcodes

* Removed placeholders in markdown function

* Adjusted integration tests

* fetch_shortcodes now also returns a string

* Start of HTML insertion

* Kinda working everything

* Loading of shortcodes and builtins

* Fix tests

* Some missed fixes

* Tweaks + fmt

* Remove string literal handling

* Fix benches

* Grab shortcode def only once per site

* Fix benches

* Rewrite of parser

* Fix tests

* Add test for #1655

* Re-enable integration test

* Add test for #1601

* Add test for #1600

* Add test for #1500

* Add test for #1320

* Fix test on windows?

Co-authored-by: Gijs Burghoorn <g.burghoorn@gmail.com>
2021-11-19 20:31:42 +01:00

82 lines
2.1 KiB
Rust

mod common;
macro_rules! test_links {
(
$in_str:literal,
[$($id:literal => $perma_link:literal),*],
[$($abs_path:literal),*],
[$($rel_path:literal:$opt_anchor:expr),*],
[$($shortcodes:ident),*]
) => {
let config = config::Config::default_for_test();
#[allow(unused_mut)]
let mut tera = tera::Tera::default();
// Add all shortcodes
$(
tera.add_raw_template(
&format!("shortcodes/{}", $shortcodes.filename()),
$shortcodes.output
).expect("Failed to add raw template");
)*
#[allow(unused_mut)]
let mut permalinks = std::collections::HashMap::new();
$(
permalinks.insert($id.to_string(), $perma_link.to_string());
)*
let context = rendering::RenderContext::new(
&tera,
&config,
&config.default_language,
"",
&permalinks,
front_matter::InsertAnchor::None,
);
let rendered = rendering::render_content($in_str, &context);
assert!(rendered.is_ok(), "Rendering failed");
let rendered = rendered.unwrap();
let asserted_int_links = vec![
$(
($rel_path.to_string(), $opt_anchor.map(|x| x.to_string()))
),*
];
let asserted_ext_links: Vec<&str> = vec![$($abs_path),*];
assert_eq!(rendered.internal_links, asserted_int_links, "Internal links unequal");
assert_eq!(rendered.external_links, asserted_ext_links, "External links unequal");
}
}
#[test]
fn basic_internal() {
test_links!("Hello World!", [], [], [], []);
}
#[test]
fn absolute_links() {
test_links!("[abc](https://google.com/)", [], ["https://google.com/"], [], []);
}
#[test]
fn relative_links() {
test_links!(
"[abc](@/def/123.md)",
["def/123.md" => "https://xyz.com/def/123"],
[],
["def/123.md":<Option<&str>>::None],
[]
);
}
#[test]
#[should_panic]
fn relative_links_no_perma() {
test_links!("[abc](@/def/123.md)", [], [], ["def/123.md": <Option<&str>>::None], []);
}