@bahmutov/cy-grep 1.5.1 → 1.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bahmutov/cy-grep",
3
- "version": "1.5.1",
3
+ "version": "1.6.0",
4
4
  "description": "Filter Cypress tests using title or tags",
5
5
  "main": "src/support.js",
6
6
  "scripts": {
package/src/plugin.js CHANGED
@@ -1,13 +1,12 @@
1
1
  // @ts-check
2
2
  const debug = require('debug')('cy-grep')
3
- const globby = require('globby')
4
3
 
5
4
  const { getSpecs } = require('find-cypress-specs')
6
5
  const { getTestNames, findEffectiveTestTags } = require('find-test-names')
7
6
  const fs = require('fs')
8
7
  const path = require('path')
9
8
  const { version } = require('../package.json')
10
- const { parseGrep, shouldTestRun } = require('./utils')
9
+ const { parseGrep, shouldTestRun, getMentionedTags } = require('./utils')
11
10
 
12
11
  const isCypressV9 = (config) => !('specPattern' in config)
13
12
 
@@ -107,8 +106,12 @@ function cypressGrepPlugin(config) {
107
106
  debug('%o', greppedSpecs)
108
107
  } else if (grepTags) {
109
108
  const parsedGrep = parseGrep(null, grepTags)
110
-
111
109
  debug('parsed grep tags %o', parsedGrep)
110
+ const mentionedTags = getMentionedTags(grepTags)
111
+ debug('user mentioned tags %o', mentionedTags)
112
+ // unique tags found across all specs we search
113
+ const foundTags = new Set()
114
+
112
115
  greppedSpecs = specFiles.filter((specFile) => {
113
116
  const text = fs.readFileSync(specFile, { encoding: 'utf8' })
114
117
 
@@ -121,6 +124,15 @@ function cypressGrepPlugin(config) {
121
124
  return Object.keys(testTags).some((testTitle) => {
122
125
  const effectiveTags = testTags[testTitle].effectiveTags
123
126
  const requiredTags = testTags[testTitle].requiredTags
127
+
128
+ // remember all found tags
129
+ effectiveTags.forEach((tag) => {
130
+ foundTags.add(tag)
131
+ })
132
+ requiredTags.forEach((tag) => {
133
+ foundTags.add(tag)
134
+ })
135
+
124
136
  return shouldTestRun(
125
137
  parsedGrep,
126
138
  undefined,
@@ -139,6 +151,17 @@ function cypressGrepPlugin(config) {
139
151
 
140
152
  debug('found grep tags "%s" in %d specs', grepTags, greppedSpecs.length)
141
153
  debug('%o', greppedSpecs)
154
+
155
+ debug('all found tags across the specs %o', ...foundTags)
156
+ debug('user mentioned tags %o', mentionedTags)
157
+ mentionedTags.forEach((tag) => {
158
+ if (!foundTags.has(tag)) {
159
+ console.warn(
160
+ 'cy-grep: could not find the tag "%s" in any of the specs',
161
+ tag,
162
+ )
163
+ }
164
+ })
142
165
  } else {
143
166
  // we have no tags to grep
144
167
  debug('will try eliminating specs with required tags')
@@ -176,13 +199,14 @@ function cypressGrepPlugin(config) {
176
199
  const relativeNames = greppedSpecs.map((filename) =>
177
200
  path.relative(integrationFolder, filename),
178
201
  )
202
+ const relativeSpecs = relativeNames.join(', ')
179
203
  debug(
180
204
  'specs in the integration folder %s %s',
181
205
  integrationFolder,
182
- relativeNames.join(', '),
206
+ relativeSpecs,
183
207
  )
184
208
  // @ts-ignore
185
- config.testFiles = relativeNames.join(',')
209
+ config.testFiles = relativeNames
186
210
  } else {
187
211
  debug('setting selected %d specs (>= v10)', greppedSpecs.length)
188
212
  // @ts-ignore
@@ -190,10 +214,10 @@ function cypressGrepPlugin(config) {
190
214
  }
191
215
  } else {
192
216
  // hmm, we filtered out all specs, probably something is wrong
193
- console.warn('grep and/or grepTags has eliminated all specs')
194
- grep ? console.warn('grep: %s', grep) : null
195
- grepTags ? console.warn('grepTags: %s', grepTags) : null
196
- console.warn('Will leave all specs to run to filter at run-time')
217
+ console.warn('cy-grep: grep and/or grepTags has eliminated all specs')
218
+ grep ? console.warn('cy-grep: title: %s', grep) : null
219
+ grepTags ? console.warn('cy-grep: tags: %s', grepTags) : null
220
+ console.warn('cy-grep: Will leave all specs to run to filter at run-time')
197
221
  }
198
222
  }
199
223
 
package/src/utils.js CHANGED
@@ -95,6 +95,28 @@ function parseTagsGrep(s) {
95
95
  return ORS_filtered
96
96
  }
97
97
 
98
+ /**
99
+ * Given a user string of tags to find, with various connectors,
100
+ * returns the list of just the tags themselves. Could be used to
101
+ * quickly filter test specs or find misspelled tags.
102
+ * @returns {string[]} list of unique tags
103
+ */
104
+ function getMentionedTags(s) {
105
+ if (!s) {
106
+ return []
107
+ }
108
+ const spaced = s.replaceAll(/[+,]/g, ' ')
109
+ const tags = spaced
110
+ .split(' ')
111
+ .map((s) => s.trim())
112
+ .filter(Boolean)
113
+ // remove any "-" at the start of the tag
114
+ // because these are to signal inverted tags
115
+ .map((s) => (s.startsWith('-') ? s.slice(1) : s))
116
+ const uniqueTags = [...new Set(tags)]
117
+ return uniqueTags.sort()
118
+ }
119
+
98
120
  function shouldTestRunRequiredTags(parsedGrepTags, requiredTags = []) {
99
121
  if (!requiredTags.length) {
100
122
  // there are no tags to check
@@ -216,4 +238,5 @@ module.exports = {
216
238
  shouldTestRunTags,
217
239
  shouldTestRunRequiredTags,
218
240
  shouldTestRunTitle,
241
+ getMentionedTags,
219
242
  }