// ██████╗ █████╗ ███████╗███████╗██╗███╗ ██╗ ██████╗ // ██╔══██╗██╔══██╗██╔════╝██╔════╝██║████╗ ██║██╔════╝ // ██████╔╝███████║███████╗███████╗██║██╔██╗ ██║██║ ███╗ // ██╔═══╝ ██╔══██║╚════██║╚════██║██║██║╚██╗██║██║ ██║ // ██║ ██║ ██║███████║███████║██║██║ ╚████║╚██████╔╝ // ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═══╝ ╚═════╝ #[cfg(test)] mod passing { use assert_cmd::prelude::*; use std::env; use std::fs; use std::path::{Path, MAIN_SEPARATOR}; use std::process::Command; use url::Url; #[test] fn local_file_target_input_relative_target_path() { let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap(); let cwd_normalized: String = str!(env::current_dir().unwrap().to_str().unwrap()).replace("\\", "/"); let out = cmd .arg("-M") .arg(format!( "src{s}tests{s}data{s}basic{s}local-file.html", s = MAIN_SEPARATOR )) .output() .unwrap(); let file_url_protocol: &str = if cfg!(windows) { "file:///" } else { "file://" }; // STDERR should contain list of retrieved file URLs, two missing assert_eq!( String::from_utf8_lossy(&out.stderr), format!( "\ {file}{cwd}/src/tests/data/basic/local-file.html\n \ {file}{cwd}/src/tests/data/basic/local-style.css\n \ {file}{cwd}/src/tests/data/basic/local-style-does-not-exist.css (not found)\n \ {file}{cwd}/src/tests/data/basic/monolith.png (not found)\n \ {file}{cwd}/src/tests/data/basic/local-script.js\n\ ", file = file_url_protocol, cwd = cwd_normalized ) ); // STDOUT should contain HTML from the local file assert_eq!( String::from_utf8_lossy(&out.stdout), "\ \n \ \n \ Local HTML file\n \ \n \ \n\n\n\n \ \"\"\n \ Tricky href\n \ Remote URL\n \ \n\n\n\n\ \n\ " ); // Exit code should be 0 out.assert().code(0); } #[test] fn local_file_target_input_absolute_target_path() { let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap(); let path_html: &Path = Path::new("src/tests/data/basic/local-file.html"); let out = cmd .arg("-M") .arg("-Ijci") .arg(path_html.as_os_str()) .output() .unwrap(); // STDERR should contain only the target file assert_eq!( String::from_utf8_lossy(&out.stderr), format!( "{file_url_html}\n", file_url_html = Url::from_file_path(fs::canonicalize(&path_html).unwrap()).unwrap(), ) ); // STDOUT should contain HTML from the local file assert_eq!( String::from_utf8_lossy(&out.stdout), format!( "\ \ \n \ \n \ Local HTML file\n \ \n \ \n\n\n\n \ \"\"\n \ Tricky href\n \ Remote URL\n \ \n\n\n\n\ \n\ ", empty_image = empty_image!() ) ); // Exit code should be 0 out.assert().code(0); } #[test] fn local_file_url_target_input() { let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap(); let cwd_normalized: String = str!(env::current_dir().unwrap().to_str().unwrap()).replace("\\", "/"); let file_url_protocol: &str = if cfg!(windows) { "file:///" } else { "file://" }; let out = cmd .arg("-M") .arg("-cji") .arg(format!( "{file}{cwd}/src/tests/data/basic/local-file.html", file = file_url_protocol, cwd = cwd_normalized, )) .output() .unwrap(); // STDERR should contain list of retrieved file URLs assert_eq!( String::from_utf8_lossy(&out.stderr), format!( "{file}{cwd}/src/tests/data/basic/local-file.html\n", file = file_url_protocol, cwd = cwd_normalized, ) ); // STDOUT should contain HTML from the local file assert_eq!( String::from_utf8_lossy(&out.stdout), format!( "\ \ \n \ \n \ Local HTML file\n \ \n \ \n\n\n\n \ \"\"\n \ Tricky href\n \ Remote URL\n \ \n\n\n\n\ \n\ ", empty_image = empty_image!() ) ); // Exit code should be 0 out.assert().code(0); } #[test] fn embed_file_url_local_asset_within_style_attribute() { let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap(); let path_html: &Path = Path::new("src/tests/data/svg/index.html"); let path_svg: &Path = Path::new("src/tests/data/svg/image.svg"); let out = cmd.arg("-M").arg(path_html.as_os_str()).output().unwrap(); // STDERR should list files that got retrieved assert_eq!( String::from_utf8_lossy(&out.stderr), format!( "\ {file_url_html}\n \ {file_url_svg}\n\ ", file_url_html = Url::from_file_path(fs::canonicalize(&path_html).unwrap()).unwrap(), file_url_svg = Url::from_file_path(fs::canonicalize(&path_svg).unwrap()).unwrap(), ) ); // STDOUT should contain HTML with date URL for background-image in it assert_eq!( String::from_utf8_lossy(&out.stdout), "
\n\n" ); // Exit code should be 0 out.assert().code(0); } #[test] fn discard_integrity_for_local_files() { let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap(); let cwd_normalized: String = str!(env::current_dir().unwrap().to_str().unwrap()).replace("\\", "/"); let file_url_protocol: &str = if cfg!(windows) { "file:///" } else { "file://" }; let out = cmd .arg("-M") .arg("-i") .arg(if cfg!(windows) { format!( "{file}{cwd}/src/tests/data/integrity/index.html", file = file_url_protocol, cwd = cwd_normalized, ) } else { format!( "{file}{cwd}/src/tests/data/integrity/index.html", file = file_url_protocol, cwd = cwd_normalized, ) }) .output() .unwrap(); // STDERR should contain list of retrieved file URLs assert_eq!( String::from_utf8_lossy(&out.stderr), format!( "\ {file}{cwd}/src/tests/data/integrity/index.html\n \ {file}{cwd}/src/tests/data/integrity/style.css\n \ {file}{cwd}/src/tests/data/integrity/style.css\n \ {file}{cwd}/src/tests/data/integrity/script.js\n \ {file}{cwd}/src/tests/data/integrity/script.js\n\ ", file = file_url_protocol, cwd = cwd_normalized, ) ); // STDOUT should contain HTML from the local file; integrity attributes should be missing assert_eq!( String::from_utf8_lossy(&out.stdout), format!( "\ \ \n \ Local HTML file\n \ \n \ \n\n\n\n \

This page should have black background and white foreground, but only when served via http: (not via file:)

\n \ \n \ \n\n\n\n\ \n\ " ) ); // Exit code should be 0 out.assert().code(0); } }