From 206c593519681a024409d9dd23ef55b1d13d938f Mon Sep 17 00:00:00 2001 From: Geert-Jan Zwiers Date: Thu, 30 Mar 2023 19:40:22 +0200 Subject: [PATCH] fix(coverage): ignore files from npm registry (#18457) Fixes https://github.com/denoland/deno/issues/17664 and part of https://github.com/denoland/deno/issues/18454 by excluding files belonging to npm modules by default in the coverage output. --- cli/npm/resolvers/mod.rs | 4 ++ cli/tests/integration/coverage_tests.rs | 48 +++++++++++++++++++ .../coverage/no_npm_coverage/expected.out | 1 + .../no_npm_coverage/no_npm_coverage.ts | 4 ++ .../no_npm_coverage/no_npm_coverage_test.ts | 4 ++ cli/tools/coverage/mod.rs | 4 ++ 6 files changed, 65 insertions(+) create mode 100644 cli/tests/testdata/coverage/no_npm_coverage/expected.out create mode 100644 cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts create mode 100644 cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs index 61b020885b..c8ac6f44a6 100644 --- a/cli/npm/resolvers/mod.rs +++ b/cli/npm/resolvers/mod.rs @@ -74,6 +74,10 @@ impl NpmPackageResolver { } } + pub fn root_dir_url(&self) -> &Url { + self.fs_resolver.root_dir_url() + } + pub fn resolve_pkg_id_from_pkg_req( &self, req: &NpmPackageReq, diff --git a/cli/tests/integration/coverage_tests.rs b/cli/tests/integration/coverage_tests.rs index 022f216d87..440d6b17ed 100644 --- a/cli/tests/integration/coverage_tests.rs +++ b/cli/tests/integration/coverage_tests.rs @@ -277,6 +277,54 @@ fn no_snaps_included(test_name: &str, extension: &str) { output.assert_exit_code(0); } +#[test] +fn no_npm_cache_coverage() { + let context = TestContext::default(); + let tempdir = context.deno_dir(); + let tempdir = tempdir.path().join("cov"); + + let output = context + .new_command() + .args_vec(vec![ + "test".to_string(), + "--quiet".to_string(), + "--allow-read".to_string(), + format!("--coverage={}", tempdir.to_str().unwrap()), + format!("coverage/no_npm_coverage/no_npm_coverage_test.ts"), + ]) + .run(); + + output.assert_exit_code(0); + output.skip_output_check(); + + let output = context + .new_command() + .args_vec(vec![ + "coverage".to_string(), + format!("{}/", tempdir.to_str().unwrap()), + ]) + .split_output() + .run(); + + // Verify there's no "Check" being printed + assert!(output.stderr().is_empty()); + + let actual = util::strip_ansi_codes(output.stdout()).to_string(); + + let expected = fs::read_to_string( + util::testdata_path().join("coverage/no_npm_coverage/expected.out"), + ) + .unwrap(); + + if !util::wildcard_match(&expected, &actual) { + println!("OUTPUT\n{actual}\nOUTPUT"); + println!("EXPECTED\n{expected}\nEXPECTED"); + panic!("pattern match failed"); + } + + output.assert_exit_code(0); +} + #[test] fn no_transpiled_lines() { let context = TestContext::default(); diff --git a/cli/tests/testdata/coverage/no_npm_coverage/expected.out b/cli/tests/testdata/coverage/no_npm_coverage/expected.out new file mode 100644 index 0000000000..ca45112771 --- /dev/null +++ b/cli/tests/testdata/coverage/no_npm_coverage/expected.out @@ -0,0 +1 @@ +cover [WILDCARD]/no_npm_coverage/no_npm_coverage.ts ... 100.000% (4/4) diff --git a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts b/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts new file mode 100644 index 0000000000..4233b2e5d4 --- /dev/null +++ b/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage.ts @@ -0,0 +1,4 @@ +import chalk from "npm:chalk"; +export function main() { + console.log(chalk.red("RED")); +} diff --git a/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts b/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts new file mode 100644 index 0000000000..8305f95977 --- /dev/null +++ b/cli/tests/testdata/coverage/no_npm_coverage/no_npm_coverage_test.ts @@ -0,0 +1,4 @@ +import { main } from "./no_npm_coverage.ts"; +Deno.test("main", () => { + main(); +}); diff --git a/cli/tools/coverage/mod.rs b/cli/tools/coverage/mod.rs index 9fead6e370..2346b3614b 100644 --- a/cli/tools/coverage/mod.rs +++ b/cli/tools/coverage/mod.rs @@ -588,6 +588,7 @@ fn filter_coverages( coverages: Vec, include: Vec, exclude: Vec, + npm_root_dir: &str, ) -> Vec { let include: Vec = include.iter().map(|e| Regex::new(e).unwrap()).collect(); @@ -599,6 +600,7 @@ fn filter_coverages( .into_iter() .filter(|e| { let is_internal = e.url.starts_with("ext:") + || e.url.starts_with(npm_root_dir) || e.url.ends_with("__anonymous__") || e.url.ends_with("$deno$test.js") || e.url.ends_with(".snap"); @@ -620,12 +622,14 @@ pub async fn cover_files( } let ps = ProcState::build(flags).await?; + let root_dir_url = ps.npm_resolver.root_dir_url(); let script_coverages = collect_coverages(coverage_flags.files)?; let script_coverages = filter_coverages( script_coverages, coverage_flags.include, coverage_flags.exclude, + root_dir_url.as_str(), ); let proc_coverages: Vec<_> = script_coverages