diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-11-19 19:19:34 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-19 19:19:34 +0100 |
commit | 9eaa1fb71d03679367ebca0e0361fa0e47a1274f (patch) | |
tree | c57776a00293b4acae95773108315d1f827bf43c /cli/tools/test_runner.rs | |
parent | 21e8ff6fc1d88d85b9a6235324eb0f70066ee038 (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.rs | 173 |
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); + } +} |