2019-05-19 20:16:10 +00:00
|
|
|
//! Integration tests to make sure alternative backends work.
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
use mdbook::config::Config;
|
|
|
|
use mdbook::MDBook;
|
2018-07-23 17:45:01 +00:00
|
|
|
#[cfg(not(windows))]
|
|
|
|
use std::path::Path;
|
|
|
|
use tempfile::{Builder as TempFileBuilder, TempDir};
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn passing_alternate_backend() {
|
2019-12-31 10:16:59 +00:00
|
|
|
let (md, _temp) = dummy_book_with_backend("passing", success_cmd(), false);
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
md.build().unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn failing_alternate_backend() {
|
2019-12-31 10:16:59 +00:00
|
|
|
let (md, _temp) = dummy_book_with_backend("failing", fail_cmd(), false);
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
md.build().unwrap_err();
|
|
|
|
}
|
|
|
|
|
2018-01-24 17:15:29 +00:00
|
|
|
#[test]
|
2019-12-31 10:16:59 +00:00
|
|
|
fn missing_backends_are_fatal() {
|
|
|
|
let (md, _temp) = dummy_book_with_backend("missing", "trduyvbhijnorgevfuhn", false);
|
|
|
|
assert!(md.build().is_err());
|
|
|
|
}
|
2018-01-24 17:15:29 +00:00
|
|
|
|
2019-12-31 10:16:59 +00:00
|
|
|
#[test]
|
|
|
|
fn missing_optional_backends_are_not_fatal() {
|
|
|
|
let (md, _temp) = dummy_book_with_backend("missing", "trduyvbhijnorgevfuhn", true);
|
2018-01-24 17:15:29 +00:00
|
|
|
assert!(md.build().is_ok());
|
|
|
|
}
|
|
|
|
|
2018-01-07 14:10:48 +00:00
|
|
|
#[test]
|
|
|
|
fn alternate_backend_with_arguments() {
|
2019-12-31 10:16:59 +00:00
|
|
|
let (md, _temp) = dummy_book_with_backend("arguments", "echo Hello World!", false);
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
md.build().unwrap();
|
|
|
|
}
|
|
|
|
|
2018-01-20 13:46:44 +00:00
|
|
|
/// Get a command which will pipe `stdin` to the provided file.
|
2018-03-07 13:02:06 +00:00
|
|
|
#[cfg(not(windows))]
|
2018-01-20 13:46:44 +00:00
|
|
|
fn tee_command<P: AsRef<Path>>(out_file: P) -> String {
|
|
|
|
let out_file = out_file.as_ref();
|
|
|
|
|
|
|
|
if cfg!(windows) {
|
|
|
|
format!("cmd.exe /c \"type > {}\"", out_file.display())
|
|
|
|
} else {
|
|
|
|
format!("tee {}", out_file.display())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-14 11:14:27 +00:00
|
|
|
#[test]
|
2018-01-20 13:46:44 +00:00
|
|
|
#[cfg(not(windows))]
|
2018-01-14 11:14:27 +00:00
|
|
|
fn backends_receive_render_context_via_stdin() {
|
2018-03-07 13:02:06 +00:00
|
|
|
use mdbook::renderer::RenderContext;
|
2018-07-23 17:45:01 +00:00
|
|
|
use std::fs::File;
|
2018-03-07 13:02:06 +00:00
|
|
|
|
2018-03-26 23:47:37 +00:00
|
|
|
let temp = TempFileBuilder::new().prefix("output").tempdir().unwrap();
|
2018-01-14 11:14:27 +00:00
|
|
|
let out_file = temp.path().join("out.txt");
|
2018-01-20 13:46:44 +00:00
|
|
|
let cmd = tee_command(&out_file);
|
2018-01-14 11:14:27 +00:00
|
|
|
|
2019-12-31 10:16:59 +00:00
|
|
|
let (md, _temp) = dummy_book_with_backend("cat-to-file", &cmd, false);
|
2018-01-14 11:14:27 +00:00
|
|
|
|
|
|
|
assert!(!out_file.exists());
|
|
|
|
md.build().unwrap();
|
|
|
|
assert!(out_file.exists());
|
|
|
|
|
|
|
|
let got = RenderContext::from_json(File::open(&out_file).unwrap());
|
|
|
|
assert!(got.is_ok());
|
|
|
|
}
|
|
|
|
|
2019-12-31 10:16:59 +00:00
|
|
|
fn dummy_book_with_backend(
|
|
|
|
name: &str,
|
|
|
|
command: &str,
|
|
|
|
backend_is_optional: bool,
|
|
|
|
) -> (MDBook, TempDir) {
|
2018-03-26 23:47:37 +00:00
|
|
|
let temp = TempFileBuilder::new().prefix("mdbook").tempdir().unwrap();
|
2018-01-07 14:10:48 +00:00
|
|
|
|
|
|
|
let mut config = Config::default();
|
|
|
|
config
|
|
|
|
.set(format!("output.{}.command", name), command)
|
|
|
|
.unwrap();
|
|
|
|
|
2019-12-31 10:16:59 +00:00
|
|
|
if backend_is_optional {
|
|
|
|
config
|
|
|
|
.set(format!("output.{}.optional", name), true)
|
|
|
|
.unwrap();
|
|
|
|
}
|
|
|
|
|
2018-01-07 14:10:48 +00:00
|
|
|
let md = MDBook::init(temp.path())
|
|
|
|
.with_config(config)
|
|
|
|
.build()
|
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
(md, temp)
|
|
|
|
}
|
2018-12-05 21:26:53 +00:00
|
|
|
|
|
|
|
fn fail_cmd() -> &'static str {
|
|
|
|
if cfg!(windows) {
|
|
|
|
r#"cmd.exe /c "exit 1""#
|
|
|
|
} else {
|
|
|
|
"false"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn success_cmd() -> &'static str {
|
|
|
|
if cfg!(windows) {
|
|
|
|
r#"cmd.exe /c "exit 0""#
|
|
|
|
} else {
|
|
|
|
"true"
|
|
|
|
}
|
|
|
|
}
|