@bahmutov/cy-grep 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -1
- package/package.json +4 -4
- package/src/plugin.js +35 -1
package/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# @bahmutov/cy-grep 
|
2
2
|
|
3
3
|
> Filter tests using substring or tag
|
4
4
|
|
@@ -119,6 +119,15 @@ registerCypressGrep()
|
|
119
119
|
|
120
120
|
Installing the plugin via `setupNodeEvents()` is required to enable the [grepFilterSpecs](#pre-filter-specs-grepfilterspecs) feature.
|
121
121
|
|
122
|
+
**Tip:** you probably want to set these `env` settings in your config file
|
123
|
+
|
124
|
+
```js
|
125
|
+
module.exports = defineConfig({
|
126
|
+
env: { grepFilterSpecs: true, grepOmitFiltered: true },
|
127
|
+
...
|
128
|
+
})
|
129
|
+
```
|
130
|
+
|
122
131
|
## Usage Overview
|
123
132
|
|
124
133
|
You can filter tests to run using part of their title via `grep`, and via explicit tags via `grepTags` Cypress environment variables.
|
@@ -421,6 +430,10 @@ it('cleans up the data', { requiredTags: '@nightly' }, () => {...})
|
|
421
430
|
|
422
431
|
When you run the tests now, this test will be skipped, as if it were `it.skip`. It will only run if you use the tag `@nightly`, for example: `npx cypress run --env grepTags=@nightly`.
|
423
432
|
|
433
|
+
If `grepFilterSpecs=true` and a spec has only required tags, and you are running without any tags, the the spec will be skipped completely.
|
434
|
+
|
435
|
+
Read the blog post 📝 [Required Tags](https://glebbahmutov.com/blog/required-tags/).
|
436
|
+
|
424
437
|
## TypeScript support
|
425
438
|
|
426
439
|
Because the Cypress test config object type definition does not have the `tags` property we are using above, the TypeScript linter will show an error. Just add an ignore comment above the test:
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@bahmutov/cy-grep",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.4.0",
|
4
4
|
"description": "Filter Cypress tests using title or tags",
|
5
5
|
"main": "src/support.js",
|
6
6
|
"scripts": {
|
@@ -16,11 +16,11 @@
|
|
16
16
|
"globby": "^11.0.4"
|
17
17
|
},
|
18
18
|
"devDependencies": {
|
19
|
-
"cypress": "12.
|
19
|
+
"cypress": "12.4.0",
|
20
20
|
"cypress-each": "^1.11.0",
|
21
|
-
"cypress-expect": "^
|
21
|
+
"cypress-expect": "^3.1.0",
|
22
22
|
"prettier": "^2.8.1",
|
23
|
-
"semantic-release": "^20.0.
|
23
|
+
"semantic-release": "^20.0.4",
|
24
24
|
"typescript": "^4.7.4"
|
25
25
|
},
|
26
26
|
"peerDependencies": {
|
package/src/plugin.js
CHANGED
@@ -124,7 +124,14 @@ function cypressGrepPlugin(config) {
|
|
124
124
|
debug('effective test tags %o', testTags)
|
125
125
|
return Object.keys(testTags).some((testTitle) => {
|
126
126
|
const effectiveTags = testTags[testTitle].effectiveTags
|
127
|
-
|
127
|
+
const requiredTags = testTags[testTitle].requiredTags
|
128
|
+
return shouldTestRun(
|
129
|
+
parsedGrep,
|
130
|
+
null,
|
131
|
+
effectiveTags,
|
132
|
+
false,
|
133
|
+
requiredTags,
|
134
|
+
)
|
128
135
|
})
|
129
136
|
} catch (err) {
|
130
137
|
console.error('Could not determine test names in file: %s', specFile)
|
@@ -136,6 +143,33 @@ function cypressGrepPlugin(config) {
|
|
136
143
|
|
137
144
|
debug('found grep tags "%s" in %d specs', grepTags, greppedSpecs.length)
|
138
145
|
debug('%o', greppedSpecs)
|
146
|
+
} else {
|
147
|
+
// we have no tags to grep
|
148
|
+
debug('will try eliminating specs with required tags')
|
149
|
+
|
150
|
+
greppedSpecs = specFiles.filter((specFile) => {
|
151
|
+
const text = fs.readFileSync(specFile, { encoding: 'utf8' })
|
152
|
+
|
153
|
+
try {
|
154
|
+
const testTags = findEffectiveTestTags(text)
|
155
|
+
debug('spec file %s', specFile)
|
156
|
+
debug('effective test tags %o', testTags)
|
157
|
+
// eliminate all tests with required tags, since we have no tags right now
|
158
|
+
const testsWithoutRequiredTags = Object.keys(testTags).filter(
|
159
|
+
(testTitle) => {
|
160
|
+
return testTags[testTitle].requiredTags.length === 0
|
161
|
+
},
|
162
|
+
)
|
163
|
+
// if there are any tests remaining, we should run this spec
|
164
|
+
// (we should not run empty specs where all tests have required tags)
|
165
|
+
return testsWithoutRequiredTags.length
|
166
|
+
} catch (err) {
|
167
|
+
console.error('Could not determine test names in file: %s', specFile)
|
168
|
+
console.error('Will run it to let the grep filter the tests')
|
169
|
+
|
170
|
+
return true
|
171
|
+
}
|
172
|
+
})
|
139
173
|
}
|
140
174
|
|
141
175
|
if (greppedSpecs.length) {
|