1 //  ██████╗  █████╗ ███████╗███████╗██╗███╗   ██╗ ██████╗
2 //  ██╔══██╗██╔══██╗██╔════╝██╔════╝██║████╗  ██║██╔════╝
3 //  ██████╔╝███████║███████╗███████╗██║██╔██╗ ██║██║  ███╗
4 //  ██╔═══╝ ██╔══██║╚════██║╚════██║██║██║╚██╗██║██║   ██║
5 //  ██║     ██║  ██║███████║███████║██║██║ ╚████║╚██████╔╝
6 //  ╚═╝     ╚═╝  ╚═╝╚══════╝╚══════╝╚═╝╚═╝  ╚═══╝ ╚═════╝
7 
8 #[cfg(test)]
9 mod passing {
10     use assert_cmd::prelude::*;
11     use std::env;
12     use std::fs;
13     use std::path::Path;
14     use std::process::{Command, Stdio};
15     use url::Url;
16 
17     #[test]
print_help_information()18     fn print_help_information() {
19         let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap();
20         let out = cmd.arg("-h").output().unwrap();
21 
22         // STDERR should be empty
23         assert_eq!(String::from_utf8_lossy(&out.stderr), "");
24 
25         // STDOUT should contain program name, version, and usage information
26         // TODO
27 
28         // Exit code should be 0
29         out.assert().code(0);
30     }
31 
32     #[test]
print_version()33     fn print_version() {
34         let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap();
35         let out = cmd.arg("-V").output().unwrap();
36 
37         // STDERR should be empty
38         assert_eq!(String::from_utf8_lossy(&out.stderr), "");
39 
40         // STDOUT should contain program name and version
41         assert_eq!(
42             String::from_utf8_lossy(&out.stdout),
43             format!("{} {}\n", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"))
44         );
45 
46         // Exit code should be 0
47         out.assert().code(0);
48     }
49 
50     #[test]
stdin_target_input()51     fn stdin_target_input() {
52         let mut echo = Command::new("echo")
53             .arg("Hello from STDIN")
54             .stdout(Stdio::piped())
55             .spawn()
56             .unwrap();
57         let echo_out = echo.stdout.take().unwrap();
58         echo.wait().unwrap();
59 
60         let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap();
61         cmd.stdin(echo_out);
62         let out = cmd.arg("-M").arg("-").output().unwrap();
63 
64         // STDERR should be empty
65         assert_eq!(String::from_utf8_lossy(&out.stderr), "");
66 
67         // STDOUT should contain HTML created out of STDIN
68         assert_eq!(
69             String::from_utf8_lossy(&out.stdout),
70             "<html><head></head><body>Hello from STDIN\n</body></html>\n"
71         );
72 
73         // Exit code should be 0
74         out.assert().code(0);
75     }
76 
77     #[test]
css_import_string()78     fn css_import_string() {
79         let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap();
80         let path_html: &Path = Path::new("src/tests/data/css/index.html");
81         let path_css: &Path = Path::new("src/tests/data/css/style.css");
82 
83         assert!(path_html.is_file());
84         assert!(path_css.is_file());
85 
86         let out = cmd.arg("-M").arg(path_html.as_os_str()).output().unwrap();
87 
88         // STDERR should list files that got retrieved
89         assert_eq!(
90             String::from_utf8_lossy(&out.stderr),
91             format!(
92                 "\
93                 {file_url_html}\n \
94                 {file_url_css}\n \
95                 {file_url_css}\n \
96                 {file_url_css}\n\
97                 ",
98                 file_url_html = Url::from_file_path(fs::canonicalize(&path_html).unwrap()).unwrap(),
99                 file_url_css = Url::from_file_path(fs::canonicalize(&path_css).unwrap()).unwrap(),
100             )
101         );
102 
103         // STDOUT should contain embedded CSS url()'s
104         assert_eq!(
105             String::from_utf8_lossy(&out.stdout),
106             "<html><head><style>\n\n    @charset \"UTF-8\";\n\n    @import \"data:text/css;base64,Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Y29sb3I6I2ZmZn0K\";\n\n    @import url(\"data:text/css;base64,Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Y29sb3I6I2ZmZn0K\");\n\n    @import url(\"data:text/css;base64,Ym9keXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7Y29sb3I6I2ZmZn0K\");\n\n</style>\n</head><body></body></html>\n"
107         );
108 
109         // Exit code should be 0
110         out.assert().code(0);
111     }
112 }
113 
114 //  ███████╗ █████╗ ██╗██╗     ██╗███╗   ██╗ ██████╗
115 //  ██╔════╝██╔══██╗██║██║     ██║████╗  ██║██╔════╝
116 //  █████╗  ███████║██║██║     ██║██╔██╗ ██║██║  ███╗
117 //  ██╔══╝  ██╔══██║██║██║     ██║██║╚██╗██║██║   ██║
118 //  ██║     ██║  ██║██║███████╗██║██║ ╚████║╚██████╔╝
119 //  ╚═╝     ╚═╝  ╚═╝╚═╝╚══════╝╚═╝╚═╝  ╚═══╝ ╚═════╝
120 
121 #[cfg(test)]
122 mod failing {
123     use assert_cmd::prelude::*;
124     use std::env;
125     use std::process::Command;
126 
127     #[test]
bad_input_empty_target()128     fn bad_input_empty_target() {
129         let mut cmd = Command::cargo_bin(env!("CARGO_PKG_NAME")).unwrap();
130         let out = cmd.arg("").output().unwrap();
131 
132         // STDERR should contain error description
133         assert_eq!(
134             String::from_utf8_lossy(&out.stderr),
135             "No target specified\n"
136         );
137 
138         // STDOUT should be empty
139         assert_eq!(String::from_utf8_lossy(&out.stdout), "");
140 
141         // Exit code should be 1
142         out.assert().code(1);
143     }
144 }
145