Skip to content

Commit de98a5d

Browse files
feat: require-data-selector uses consistent rules with assignments (#302)
1 parent 14d086b commit de98a5d

3 files changed

Lines changed: 24 additions & 16 deletions

File tree

docs/rules/require-data-selectors.md

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ cy.get('.btn-.large').click()
2121

2222
const CLASS_SELECTOR = ".my-class";
2323
cy.get(CLASS_SELECTOR)
24+
25+
const TYPE = 'submit'
26+
const SUBMIT_TEMPLATE = `.${TYPE}`
27+
cy.get(SUBMIT_TEMPLATE)
28+
29+
const MY_SUBMIT_TEMPLATE = SUBMIT_TEMPLATE;
30+
cy.get(MY_SUBMIT_TEMPLATE)
2431
```
2532

2633
Examples of **correct** code for this rule:
@@ -29,11 +36,16 @@ Examples of **correct** code for this rule:
2936
cy.get('[data-cy=submit]').click()
3037
cy.get('[data-QA=submit]')
3138
cy.get(`[data-QA=submit]`)
32-
```
3339

34-
```js
3540
const ASSESSMENT_SUBMIT = "[data-cy=assessment-submit]"
3641
cy.get(ASSESSMENT_SUBMIT).click()
42+
43+
const TYPE = 'submit'
44+
const SUBMIT_TEMPLATE = `[data-QA=${TYPE}]`
45+
cy.get(SUBMIT_TEMPLATE)
46+
47+
const MY_SUBMIT_TEMPLATE = SUBMIT_TEMPLATE;
48+
cy.get(MY_SUBMIT_TEMPLATE)
3749
```
3850

3951
## Further Reading

lib/rules/require-data-selectors.js

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,7 @@ module.exports = {
1919
return {
2020
VariableDeclarator(node) {
2121
if (node.init && node.id && node.id.type === 'Identifier') {
22-
let selectorValue = null
23-
24-
if (node.init.type === 'Literal' && typeof node.init.value === 'string') {
25-
selectorValue = node.init.value
26-
}
27-
else if (node.init.type === 'TemplateLiteral'
28-
&& node.init.expressions.length === 0
29-
&& node.init.quasis.length === 1) {
30-
selectorValue = node.init.quasis[0].value.cooked
31-
}
32-
33-
if (selectorValue && isAliasOrDataSelector(selectorValue)) {
22+
if (isDataNode(node.init, variablesSet)) {
3423
variablesSet.add(node.id.name)
3524
}
3625
}
@@ -57,7 +46,10 @@ function isDataArgument(node, dataVariables) {
5746
if (node.arguments.length === 0) return false
5847

5948
const firstArg = node.arguments[0]
49+
return isDataNode(firstArg, dataVariables)
50+
}
6051

52+
function isDataNode(firstArg, dataVariables) {
6153
if (firstArg.type === 'Literal') {
6254
return isAliasOrDataSelector(String(firstArg.value))
6355
}

tests/lib/rules/require-data-selectors.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ ruleTester.run('require-data-selectors', rule, {
1414
{ code: 'cy.clock(5000)' },
1515
{ code: 'cy.scrollTo(0, 10)' },
1616
{ code: 'cy.tick(500)' },
17-
{ code: 'cy.get(\`[data-cy=${1}]\`)' }, // eslint-disable-line no-useless-escape
17+
{ code: 'cy.get(`[data-cy=${1}]`)' },
1818
{ code: 'cy.get("@my-alias")' },
1919
{ code: 'cy.get(`@my-alias`)' },
2020
{ code: 'const ASSESSMENT_SUBMIT = "[data-cy=assessment-submit]"; cy.get(ASSESSMENT_SUBMIT)' },
2121
{ code: 'const ALIAS_TEMPLATE = `@my-alias`; cy.get(ALIAS_TEMPLATE)' },
22+
{ code: 'const TEMPLATE = `[data-cy=${1}]`; cy.get(TEMPLATE)' },
23+
{ code: 'const ALIAS_TEMPLATE = `@my-alias`; const REASSIGNED = ALIAS_TEMPLATE; cy.get(REASSIGNED)' },
2224
],
2325

2426
invalid: [
@@ -27,8 +29,10 @@ ruleTester.run('require-data-selectors', rule, {
2729
{ code: 'cy.get(".btn-large").click()', errors },
2830
{ code: 'cy.get(".btn-.large").click()', errors },
2931
{ code: 'cy.get(".a")', errors },
30-
{ code: 'cy.get(\`[daedta-cy=${1}]\`)', errors }, // eslint-disable-line no-useless-escape
32+
{ code: 'cy.get(`[daedta-cy=${1}]`)', errors },
3133
{ code: 'const BAD_SELECTOR = ".my-class"; cy.get(BAD_SELECTOR)', errors },
3234
{ code: 'const GOOD = "[data-cy=good]"; const BAD = ".bad"; cy.get(GOOD); cy.get(BAD)', errors },
35+
{ code: 'const TEMPLATE = `[daedta-cy=${1}]`; cy.get(TEMPLATE)', errors },
36+
{ code: 'const BAD = ".bad"; const REASSIGNED = BAD; cy.get(REASSIGNED)', errors },
3337
],
3438
})

0 commit comments

Comments
 (0)