summaryrefslogtreecommitdiff
path: root/cli/tools/test_runner.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2020-11-19 19:19:34 +0100
committerGitHub <noreply@github.com>2020-11-19 19:19:34 +0100
commit9eaa1fb71d03679367ebca0e0361fa0e47a1274f (patch)
treec57776a00293b4acae95773108315d1f827bf43c /cli/tools/test_runner.rs
parent21e8ff6fc1d88d85b9a6235324eb0f70066ee038 (diff)
refactor(cli): move tooling to cli/tools/ (#8424)
This commit moves following tools into a single "tools" module located at "cli/tools/mod.rs": - formatter - linter - test runner - coverage collector - installer - binary upgrader - repl
Diffstat (limited to 'cli/tools/test_runner.rs')
-rw-r--r--cli/tools/test_runner.rs173
1 files changed, 173 insertions, 0 deletions
diff --git a/cli/tools/test_runner.rs b/cli/tools/test_runner.rs
new file mode 100644
index 000000000..599a95059
--- /dev/null
+++ b/cli/tools/test_runner.rs
@@ -0,0 +1,173 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+use crate::fs_util;
+use crate::tools::installer::is_remote_url;
+use deno_core::error::AnyError;
+use deno_core::serde_json::json;
+use deno_core::url::Url;
+use std::path::Path;
+use std::path::PathBuf;
+
+fn is_supported(p: &Path) -> bool {
+ use std::path::Component;
+ if let Some(Component::Normal(basename_os_str)) = p.components().next_back() {
+ let basename = basename_os_str.to_string_lossy();
+ basename.ends_with("_test.ts")
+ || basename.ends_with("_test.tsx")
+ || basename.ends_with("_test.js")
+ || basename.ends_with("_test.mjs")
+ || basename.ends_with("_test.jsx")
+ || basename.ends_with(".test.ts")
+ || basename.ends_with(".test.tsx")
+ || basename.ends_with(".test.js")
+ || basename.ends_with(".test.mjs")
+ || basename.ends_with(".test.jsx")
+ || basename == "test.ts"
+ || basename == "test.tsx"
+ || basename == "test.js"
+ || basename == "test.mjs"
+ || basename == "test.jsx"
+ } else {
+ false
+ }
+}
+
+pub fn prepare_test_modules_urls(
+ include: Vec<String>,
+ root_path: &PathBuf,
+) -> Result<Vec<Url>, AnyError> {
+ let (include_paths, include_urls): (Vec<String>, Vec<String>) =
+ include.into_iter().partition(|n| !is_remote_url(n));
+
+ let mut prepared = vec![];
+
+ for path in include_paths {
+ let p = fs_util::normalize_path(&root_path.join(path));
+ if p.is_dir() {
+ let test_files =
+ crate::fs_util::collect_files(vec![p], vec![], is_supported).unwrap();
+ let test_files_as_urls = test_files
+ .iter()
+ .map(|f| Url::from_file_path(f).unwrap())
+ .collect::<Vec<Url>>();
+ prepared.extend(test_files_as_urls);
+ } else {
+ let url = Url::from_file_path(p).unwrap();
+ prepared.push(url);
+ }
+ }
+
+ for remote_url in include_urls {
+ let url = Url::parse(&remote_url)?;
+ prepared.push(url);
+ }
+
+ Ok(prepared)
+}
+
+pub fn render_test_file(
+ modules: Vec<Url>,
+ fail_fast: bool,
+ quiet: bool,
+ filter: Option<String>,
+) -> String {
+ let mut test_file = "".to_string();
+
+ for module in modules {
+ test_file.push_str(&format!("import \"{}\";\n", module.to_string()));
+ }
+
+ let options = if let Some(filter) = filter {
+ json!({ "failFast": fail_fast, "reportToConsole": !quiet, "disableLog": quiet, "filter": filter })
+ } else {
+ json!({ "failFast": fail_fast, "reportToConsole": !quiet, "disableLog": quiet })
+ };
+
+ test_file.push_str("// @ts-ignore\n");
+
+ test_file.push_str(&format!(
+ "await Deno[Deno.internal].runTests({});\n",
+ options
+ ));
+
+ test_file
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_prepare_test_modules_urls() {
+ let test_data_path = test_util::root_path().join("cli/tests/subdir");
+ let mut matched_urls = prepare_test_modules_urls(
+ vec![
+ "https://example.com/colors_test.ts".to_string(),
+ "./mod1.ts".to_string(),
+ "./mod3.js".to_string(),
+ "subdir2/mod2.ts".to_string(),
+ "http://example.com/printf_test.ts".to_string(),
+ ],
+ &test_data_path,
+ )
+ .unwrap();
+ let test_data_url =
+ Url::from_file_path(test_data_path).unwrap().to_string();
+
+ let expected: Vec<Url> = vec![
+ format!("{}/mod1.ts", test_data_url),
+ format!("{}/mod3.js", test_data_url),
+ format!("{}/subdir2/mod2.ts", test_data_url),
+ "http://example.com/printf_test.ts".to_string(),
+ "https://example.com/colors_test.ts".to_string(),
+ ]
+ .into_iter()
+ .map(|f| Url::parse(&f).unwrap())
+ .collect();
+ matched_urls.sort();
+ assert_eq!(matched_urls, expected);
+ }
+
+ #[test]
+ fn test_is_supported() {
+ assert!(is_supported(Path::new("tests/subdir/foo_test.ts")));
+ assert!(is_supported(Path::new("tests/subdir/foo_test.tsx")));
+ assert!(is_supported(Path::new("tests/subdir/foo_test.js")));
+ assert!(is_supported(Path::new("tests/subdir/foo_test.jsx")));
+ assert!(is_supported(Path::new("bar/foo.test.ts")));
+ assert!(is_supported(Path::new("bar/foo.test.tsx")));
+ assert!(is_supported(Path::new("bar/foo.test.js")));
+ assert!(is_supported(Path::new("bar/foo.test.jsx")));
+ assert!(is_supported(Path::new("foo/bar/test.js")));
+ assert!(is_supported(Path::new("foo/bar/test.jsx")));
+ assert!(is_supported(Path::new("foo/bar/test.ts")));
+ assert!(is_supported(Path::new("foo/bar/test.tsx")));
+ assert!(!is_supported(Path::new("README.md")));
+ assert!(!is_supported(Path::new("lib/typescript.d.ts")));
+ assert!(!is_supported(Path::new("notatest.js")));
+ assert!(!is_supported(Path::new("NotAtest.ts")));
+ }
+
+ #[test]
+ fn supports_dirs() {
+ let root = test_util::root_path().join("std").join("http");
+ println!("root {:?}", root);
+ let mut matched_urls =
+ prepare_test_modules_urls(vec![".".to_string()], &root).unwrap();
+ matched_urls.sort();
+ let root_url = Url::from_file_path(root).unwrap().to_string();
+ println!("root_url {}", root_url);
+ let expected: Vec<Url> = vec![
+ format!("{}/_io_test.ts", root_url),
+ format!("{}/cookie_test.ts", root_url),
+ format!("{}/file_server_test.ts", root_url),
+ format!("{}/racing_server_test.ts", root_url),
+ format!("{}/server_test.ts", root_url),
+ format!("{}/test.ts", root_url),
+ ]
+ .into_iter()
+ .map(|f| Url::parse(&f).unwrap())
+ .collect();
+ assert_eq!(matched_urls, expected);
+ }
+}