From 088335c702c59045b8fdaaa17eeb6d6dcdd8c742 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 5 Apr 2020 11:42:24 -0400 Subject: [PATCH 1/4] add coverage check after same-folder example --- .circleci/config.yml | 4 ++++ scripts/check-coverage.js | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 scripts/check-coverage.js diff --git a/.circleci/config.yml b/.circleci/config.yml index b90df468..d9cd881b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -194,6 +194,10 @@ workflows: - run: command: npx nyc report --check-coverage true --lines 100 --include unit-utils.js working_directory: examples/same-folder + - run: + command: node ../../scripts/check-coverage main.js + - run: + command: node ../../scripts/check-coverage unit-utils.js - publish: filters: diff --git a/scripts/check-coverage.js b/scripts/check-coverage.js new file mode 100644 index 00000000..6fa80eb7 --- /dev/null +++ b/scripts/check-coverage.js @@ -0,0 +1,47 @@ +const { join } = require('path') + +const filename = process.argv[2] +if (!filename) { + console.error('Usage: node %s ', __filename) + process.exit(1) +} +const coverageFilename = join(process.cwd(), '.nyc_output', 'out.json') +const coverage = require(coverageFilename) +const fileCoverageKey = Object.keys(coverage).find(name => { + const fileCover = coverage[name] + if (fileCover.path.endsWith(filename)) { + return fileCover + } +}) + +if (!fileCoverageKey) { + console.error( + 'Could not find file %s in coverage in file %s', + filename, + coverageFilename + ) + process.exit(1) +} + +const fileCoverage = coverage[fileCoverageKey] +const statementCounters = fileCoverage.s +const isThereUncoveredStatement = Object.keys(statementCounters).some( + (k, key) => { + return statementCounters[key] === 0 + } +) +if (isThereUncoveredStatement) { + console.error( + 'file %s has statements that were not covered by tests', + fileCoverage.path + ) + console.log('statement counters %o', statementCounters) + + process.exit(1) +} + +console.log( + 'All statements in file %s (found for %s) were covered', + fileCoverage.path, + filename +) From b95f57dc818ea861a4eb6faa20bbded559f1e71b Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 5 Apr 2020 11:46:20 -0400 Subject: [PATCH 2/4] move folder --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index d9cd881b..ec0bade2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -196,8 +196,10 @@ workflows: working_directory: examples/same-folder - run: command: node ../../scripts/check-coverage main.js + working_directory: examples/same-folder - run: command: node ../../scripts/check-coverage unit-utils.js + working_directory: examples/same-folder - publish: filters: From db2e60c19a44ef456066bf6d83aa4e5e9d12f1c0 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 5 Apr 2020 16:07:26 -0400 Subject: [PATCH 3/4] check if extra files are covered --- .circleci/config.yml | 9 ++++---- scripts/only-covered.js | 49 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 scripts/only-covered.js diff --git a/.circleci/config.yml b/.circleci/config.yml index ec0bade2..a43f4c7c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -195,10 +195,11 @@ workflows: command: npx nyc report --check-coverage true --lines 100 --include unit-utils.js working_directory: examples/same-folder - run: - command: node ../../scripts/check-coverage main.js - working_directory: examples/same-folder - - run: - command: node ../../scripts/check-coverage unit-utils.js + name: Check code coverage 📈 + command: | + node ../../scripts/check-coverage main.js + node ../../scripts/check-coverage unit-utils.js + node ../../scripts/only-covered main.js unit-utils.js working_directory: examples/same-folder - publish: diff --git a/scripts/only-covered.js b/scripts/only-covered.js new file mode 100644 index 00000000..74288e34 --- /dev/null +++ b/scripts/only-covered.js @@ -0,0 +1,49 @@ +const { join } = require('path') +const _ = require('lodash') + +const filenames = process.argv.slice(2) +if (!filenames.length) { + console.error('Usage: node %s ', __filename) + process.exit(1) +} + +const shouldBeCovered = filepath => + filenames.some(name => filepath.endsWith(name)) + +const coverageFilename = join(process.cwd(), '.nyc_output', 'out.json') +const coverage = require(coverageFilename) + +const coveredFilepaths = Object.keys(coverage).map(name => coverage[name].path) + +// console.log(coveredFilepaths) + +const [covered, extraCoveredFiles] = _.partition( + coveredFilepaths, + shouldBeCovered +) + +if (extraCoveredFiles.length) { + console.error('Error: found extra covered files 🔥') + console.error('Expected the following files in coverage results') + console.error(filenames.join('\n')) + console.error('extra files covered 🔥') + console.error(extraCoveredFiles.join('\n')) + process.exit(1) +} + +if (covered.length < filenames.length) { + console.error('Error: expected all files from the list to be covered 🔥') + console.error('Expected the following files in coverage results') + console.error(filenames.join('\n')) + console.error('But found only these files to be covered') + console.error(covered.join('\n')) + + console.error('Files missing from the coverage 🔥') + const missingFiles = filenames.filter( + filename => + !covered.some(coveredFilename => coveredFilename.endsWith(filename)) + ) + console.error(missingFiles.join('\n')) + + process.exit(1) +} From 1937e228488603ce687a1ef9dbf93ce5041b53f4 Mon Sep 17 00:00:00 2001 From: Gleb Bahmutov Date: Sun, 5 Apr 2020 16:14:49 -0400 Subject: [PATCH 4/4] ad more validation --- .circleci/config.yml | 19 +++++++++++++++++++ scripts/check-coverage.js | 2 +- scripts/only-covered.js | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a43f4c7c..d4182b2e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -122,6 +122,12 @@ workflows: - run: command: npx nyc report --check-coverage true --lines 100 working_directory: examples/before-each-visit + - run: + name: Check code coverage 📈 + command: | + node ../../scripts/check-coverage main.js + node ../../scripts/only-covered main.js + working_directory: examples/before-each-visit - cypress/run: attach-workspace: true @@ -145,6 +151,12 @@ workflows: - run: command: npx nyc report --check-coverage true --lines 100 working_directory: examples/before-all-visit + - run: + name: Check code coverage 📈 + command: | + node ../../scripts/check-coverage main.js + node ../../scripts/only-covered main.js + working_directory: examples/before-all-visit - cypress/run: attach-workspace: true @@ -168,6 +180,13 @@ workflows: command: npm run coverage:check working_directory: examples/ts-example + - run: + name: Check code coverage 📈 + command: | + node ../../scripts/check-coverage main.ts + node ../../scripts/only-covered main.ts + working_directory: examples/ts-example + - cypress/run: attach-workspace: true name: example-same-folder diff --git a/scripts/check-coverage.js b/scripts/check-coverage.js index 6fa80eb7..4ff6bad1 100644 --- a/scripts/check-coverage.js +++ b/scripts/check-coverage.js @@ -41,7 +41,7 @@ if (isThereUncoveredStatement) { } console.log( - 'All statements in file %s (found for %s) were covered', + '✅ All statements in file %s (found for %s) were covered', fileCoverage.path, filename ) diff --git a/scripts/only-covered.js b/scripts/only-covered.js index 74288e34..073d397f 100644 --- a/scripts/only-covered.js +++ b/scripts/only-covered.js @@ -47,3 +47,5 @@ if (covered.length < filenames.length) { process.exit(1) } + +console.log('✅ All and only expected files were covered')