Start adding some tests for building multilingual sites
This commit is contained in:
parent
779511ae43
commit
7313b41f4d
|
@ -861,6 +861,11 @@ impl Site {
|
|||
pub fn render_section(&self, section: &Section, render_pages: bool) -> Result<()> {
|
||||
ensure_directory_exists(&self.output_path)?;
|
||||
let mut output_path = self.output_path.clone();
|
||||
|
||||
if let Some(ref lang) = section.lang {
|
||||
output_path.push(lang);
|
||||
}
|
||||
|
||||
for component in §ion.file.components {
|
||||
output_path.push(component);
|
||||
|
||||
|
|
66
components/site/tests/common.rs
Normal file
66
components/site/tests/common.rs
Normal file
|
@ -0,0 +1,66 @@
|
|||
extern crate tempfile;
|
||||
extern crate site;
|
||||
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use self::site::Site;
|
||||
use self::tempfile::{tempdir, TempDir};
|
||||
|
||||
// 2 helper macros to make all the build testing more bearable
|
||||
#[macro_export]
|
||||
macro_rules! file_exists {
|
||||
($root: expr, $path: expr) => {{
|
||||
let mut path = $root.clone();
|
||||
for component in $path.split("/") {
|
||||
path = path.join(component);
|
||||
}
|
||||
std::path::Path::new(&path).exists()
|
||||
}};
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! file_contains {
|
||||
($root: expr, $path: expr, $text: expr) => {{
|
||||
use std::io::prelude::*;
|
||||
let mut path = $root.clone();
|
||||
for component in $path.split("/") {
|
||||
path = path.join(component);
|
||||
}
|
||||
let mut file = std::fs::File::open(&path).unwrap();
|
||||
let mut s = String::new();
|
||||
file.read_to_string(&mut s).unwrap();
|
||||
println!("{}", s);
|
||||
s.contains($text)
|
||||
}};
|
||||
}
|
||||
|
||||
/// We return the tmpdir otherwise it would get out of scope and be deleted
|
||||
/// The tests can ignore it if they dont need it by prefixing it with a `_`
|
||||
pub fn build_site(name: &str) -> (Site, TempDir, PathBuf) {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push(name);
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
(site, tmp_dir, public.clone())
|
||||
}
|
||||
|
||||
/// Same as `build_site` but has a hook to setup some config options
|
||||
pub fn build_site_with_setup<F>(name: &str, mut setup_cb: F) -> (Site, TempDir, PathBuf) where F: FnMut(Site) -> (Site, bool) {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push(name);
|
||||
let site = Site::new(&path, "config.toml").unwrap();
|
||||
let (mut site, needs_loading) = setup_cb(site);
|
||||
if needs_loading {
|
||||
site.load().unwrap();
|
||||
}
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
(site, tmp_dir, public.clone())
|
||||
}
|
|
@ -1,16 +1,14 @@
|
|||
extern crate config;
|
||||
extern crate site;
|
||||
extern crate tempfile;
|
||||
mod common;
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::path::Path;
|
||||
|
||||
use config::Taxonomy;
|
||||
use site::Site;
|
||||
use tempfile::tempdir;
|
||||
use common::{build_site, build_site_with_setup};
|
||||
|
||||
#[test]
|
||||
fn can_parse_site() {
|
||||
|
@ -92,41 +90,9 @@ fn can_parse_site() {
|
|||
assert_eq!(prog_section.pages.len(), 2);
|
||||
}
|
||||
|
||||
// 2 helper macros to make all the build testing more bearable
|
||||
macro_rules! file_exists {
|
||||
($root: expr, $path: expr) => {{
|
||||
let mut path = $root.clone();
|
||||
for component in $path.split("/") {
|
||||
path = path.join(component);
|
||||
}
|
||||
Path::new(&path).exists()
|
||||
}};
|
||||
}
|
||||
|
||||
macro_rules! file_contains {
|
||||
($root: expr, $path: expr, $text: expr) => {{
|
||||
let mut path = $root.clone();
|
||||
for component in $path.split("/") {
|
||||
path = path.join(component);
|
||||
}
|
||||
let mut file = File::open(&path).unwrap();
|
||||
let mut s = String::new();
|
||||
file.read_to_string(&mut s).unwrap();
|
||||
println!("{}", s);
|
||||
s.contains($text)
|
||||
}};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_build_site_without_live_reload() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site("test_site");
|
||||
|
||||
assert!(&public.exists());
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
|
@ -222,17 +188,12 @@ fn can_build_site_without_live_reload() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_with_live_reload() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.enable_live_reload(1000);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.enable_live_reload(1000);
|
||||
(site, true)
|
||||
});
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
assert!(file_exists!(public, "sitemap.xml"));
|
||||
|
@ -271,28 +232,23 @@ fn can_build_site_with_live_reload() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_with_taxonomies() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let (site, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.load().unwrap();
|
||||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() {
|
||||
page.meta.taxonomies = {
|
||||
let mut taxonomies = HashMap::new();
|
||||
taxonomies.insert(
|
||||
"categories".to_string(),
|
||||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()],
|
||||
);
|
||||
taxonomies
|
||||
};
|
||||
}
|
||||
site.populate_taxonomies().unwrap();
|
||||
(site, false)
|
||||
});
|
||||
|
||||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() {
|
||||
page.meta.taxonomies = {
|
||||
let mut taxonomies = HashMap::new();
|
||||
taxonomies.insert(
|
||||
"categories".to_string(),
|
||||
vec![if i % 2 == 0 { "A" } else { "B" }.to_string()],
|
||||
);
|
||||
taxonomies
|
||||
};
|
||||
}
|
||||
site.populate_taxonomies().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
assert_eq!(site.taxonomies.len(), 1);
|
||||
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
|
@ -340,15 +296,7 @@ fn can_build_site_with_taxonomies() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_and_insert_anchor_links() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site("test_site");
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
// anchor link inserted
|
||||
|
@ -361,23 +309,19 @@ fn can_build_site_and_insert_anchor_links() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_with_pagination_for_section() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
for (_, section) in site.library.sections_mut() {
|
||||
if section.is_index() {
|
||||
continue;
|
||||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.load().unwrap();
|
||||
for (_, section) in site.library.sections_mut() {
|
||||
if section.is_index() {
|
||||
continue;
|
||||
}
|
||||
section.meta.paginate_by = Some(2);
|
||||
section.meta.template = Some("section_paginated.html".to_string());
|
||||
}
|
||||
section.meta.paginate_by = Some(2);
|
||||
section.meta.template = Some("section_paginated.html".to_string());
|
||||
}
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
(site, false)
|
||||
});
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
assert!(file_exists!(public, "sitemap.xml"));
|
||||
|
@ -478,21 +422,17 @@ fn can_build_site_with_pagination_for_section() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_with_pagination_for_index() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
{
|
||||
let index = site.library.get_section_mut(&path.join("content").join("_index.md")).unwrap();
|
||||
index.meta.paginate_by = Some(2);
|
||||
index.meta.template = Some("index_paginated.html".to_string());
|
||||
}
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.load().unwrap();
|
||||
{
|
||||
let index = site.library.get_section_mut(&site.base_path.join("content").join("_index.md")).unwrap();
|
||||
index.meta.paginate_by = Some(2);
|
||||
index.meta.template = Some("index_paginated.html".to_string());
|
||||
}
|
||||
(site, false)
|
||||
});
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
assert!(file_exists!(public, "sitemap.xml"));
|
||||
|
@ -530,33 +470,28 @@ fn can_build_site_with_pagination_for_index() {
|
|||
|
||||
#[test]
|
||||
fn can_build_site_with_pagination_for_taxonomy() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.config.taxonomies.push(Taxonomy {
|
||||
name: "tags".to_string(),
|
||||
paginate_by: Some(2),
|
||||
paginate_path: None,
|
||||
rss: true,
|
||||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.config.taxonomies.push(Taxonomy {
|
||||
name: "tags".to_string(),
|
||||
paginate_by: Some(2),
|
||||
paginate_path: None,
|
||||
rss: true,
|
||||
});
|
||||
site.load().unwrap();
|
||||
|
||||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() {
|
||||
page.meta.taxonomies = {
|
||||
let mut taxonomies = HashMap::new();
|
||||
taxonomies
|
||||
.insert("tags".to_string(), vec![if i % 2 == 0 { "A" } else { "B" }.to_string()]);
|
||||
taxonomies
|
||||
};
|
||||
}
|
||||
site.populate_taxonomies().unwrap();
|
||||
(site, false)
|
||||
});
|
||||
site.load().unwrap();
|
||||
|
||||
for (i, (_, page)) in site.library.pages_mut().iter_mut().enumerate() {
|
||||
page.meta.taxonomies = {
|
||||
let mut taxonomies = HashMap::new();
|
||||
taxonomies
|
||||
.insert("tags".to_string(), vec![if i % 2 == 0 { "A" } else { "B" }.to_string()]);
|
||||
taxonomies
|
||||
};
|
||||
}
|
||||
site.populate_taxonomies().unwrap();
|
||||
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
assert!(file_exists!(public, "sitemap.xml"));
|
||||
|
@ -610,16 +545,9 @@ fn can_build_site_with_pagination_for_taxonomy() {
|
|||
|
||||
#[test]
|
||||
fn can_build_rss_feed() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site("test_site");
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(&public.exists());
|
||||
assert!(file_exists!(public, "rss.xml"));
|
||||
// latest article is posts/extra-syntax.md
|
||||
assert!(file_contains!(public, "rss.xml", "Extra Syntax"));
|
||||
|
@ -629,15 +557,10 @@ fn can_build_rss_feed() {
|
|||
|
||||
#[test]
|
||||
fn can_build_search_index() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
site.config.build_search_index = true;
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
|
||||
site.config.build_search_index = true;
|
||||
(site, true)
|
||||
});
|
||||
|
||||
assert!(Path::new(&public).exists());
|
||||
assert!(file_exists!(public, "elasticlunr.min.js"));
|
||||
|
@ -646,14 +569,7 @@ fn can_build_search_index() {
|
|||
|
||||
#[test]
|
||||
fn can_build_with_extra_syntaxes() {
|
||||
let mut path = env::current_dir().unwrap().parent().unwrap().parent().unwrap().to_path_buf();
|
||||
path.push("test_site");
|
||||
let mut site = Site::new(&path, "config.toml").unwrap();
|
||||
site.load().unwrap();
|
||||
let tmp_dir = tempdir().expect("create temp dir");
|
||||
let public = &tmp_dir.path().join("public");
|
||||
site.set_output_path(&public);
|
||||
site.build().unwrap();
|
||||
let (_, _tmp_dir, public) = build_site("test_site");
|
||||
|
||||
assert!(&public.exists());
|
||||
assert!(file_exists!(public, "posts/extra-syntax/index.html"));
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
extern crate site;
|
||||
mod common;
|
||||
|
||||
use std::env;
|
||||
|
||||
use site::Site;
|
||||
use common::build_site;
|
||||
|
||||
#[test]
|
||||
fn can_parse_multilingual_site() {
|
||||
|
@ -44,3 +46,29 @@ fn can_parse_multilingual_site() {
|
|||
assert_eq!(page.lang, Some("fr".to_string()));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn can_build_multilingual_site() {
|
||||
let (_, _tmp_dir, public) = build_site("test_site_i18n");
|
||||
|
||||
assert!(public.exists());
|
||||
|
||||
// Index pages
|
||||
assert!(file_exists!(public, "index.html"));
|
||||
assert!(file_exists!(public, "fr/index.html"));
|
||||
assert!(file_contains!(public, "fr/index.html", "Une page"));
|
||||
assert!(file_contains!(public, "fr/index.html", "Language: fr"));
|
||||
|
||||
assert!(file_exists!(public, "base/index.html"));
|
||||
assert!(file_exists!(public, "fr/base/index.html"));
|
||||
|
||||
// Sections are there as well
|
||||
assert!(file_exists!(public, "blog/index.html"));
|
||||
assert!(file_exists!(public, "fr/blog/index.html"));
|
||||
assert!(file_contains!(public, "fr/blog/index.html", "Language: fr"));
|
||||
|
||||
// sitemap contains all languages
|
||||
assert!(file_exists!(public, "sitemap.xml"));
|
||||
assert!(file_contains!(public, "sitemap.xml", "https://example.com/blog/something-else/"));
|
||||
assert!(file_contains!(public, "sitemap.xml", "https://example.com/fr/blog/something-else/"));
|
||||
}
|
||||
|
|
4
test_site_i18n/templates/section.html
Normal file
4
test_site_i18n/templates/section.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
{% for page in section.pages %}
|
||||
{{page.title}}
|
||||
{% endfor %}
|
||||
Language: {{lang}}
|
Loading…
Reference in a new issue