Skip to content

Commit 1663a62

Browse files
Merge pull request #7 from SaladFork/feature/add-no-unnecessary-waiting-rule
Add `no-unnecessary-waiting` rule
2 parents 76b2207 + 15b4d60 commit 1663a62

File tree

6 files changed

+79
-1
lines changed

6 files changed

+79
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ rules which have a wrench (🔧) below.
4646
| | Rule ID | Description |
4747
|:---|:--------|:------------|
4848
|| [no-assigning-return-values](./docs/rules/no-assigning-return-values.md) | Prevent assigning return values of cy calls |
49+
|| [no-unnecessary-waiting](./docs/rules/no-unnecessary-waiting.md) | Prevent waiting for arbitrary time periods |
4950

5051
## Chai and `no-unused-expressions`
5152

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## No Assigning Return Values
2+
3+
See [the Cypress Best Practices guide](https://docs.cypress.io/guides/references/best-practices.html#Unnecessary-Waiting).

index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ const globals = require('globals')
33
module.exports = {
44
rules: {
55
'no-assigning-return-values': require('./lib/rules/no-assigning-return-values'),
6+
'no-unnecessary-waiting': require('./lib/rules/no-unnecessary-waiting'),
67
},
78
configs: {
89
recommended: require('./lib/config/recommended'),

lib/config/recommended.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
module.exports = {
44
plugins: ['cypress'],
55
rules: {
6-
'cypress/no-assigning-return-values': 'error'
6+
'cypress/no-assigning-return-values': 'error',
7+
'cypress/no-unnecessary-waiting': 'error'
78
}
89
};
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* @fileoverview Prevent waiting for arbitrary time periods
3+
* @author Elad Shahar
4+
*/
5+
6+
'use strict';
7+
8+
module.exports = {
9+
meta: {
10+
docs: {
11+
description: 'Prevent waiting for arbitrary time periods',
12+
category: 'Possible Errors',
13+
recommended: true,
14+
url: 'https://docs.cypress.io/guides/references/best-practices.html#Unnecessary-Waiting'
15+
},
16+
schema: [],
17+
messages: {
18+
unexpected: 'Do not wait for arbitrary time periods'
19+
}
20+
},
21+
create(context) {
22+
return {
23+
CallExpression(node) {
24+
if (isCallingCyWait(node) && isNumberArgument(node)) {
25+
context.report({ node, messageId: 'unexpected' });
26+
}
27+
}
28+
};
29+
}
30+
};
31+
32+
function isCallingCyWait(node) {
33+
return node.callee.type === 'MemberExpression' &&
34+
node.callee.object.type === 'Identifier' &&
35+
node.callee.object.name === 'cy' &&
36+
node.callee.property.type === 'Identifier' &&
37+
node.callee.property.name === 'wait';
38+
}
39+
40+
function isNumberArgument(node) {
41+
return node.arguments.length > 0 &&
42+
node.arguments[0].type === 'Literal' &&
43+
typeof(node.arguments[0].value) === 'number';
44+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"use strict";
2+
3+
const rule = require('../../../lib/rules/no-unnecessary-waiting');
4+
const RuleTester = require('eslint').RuleTester;
5+
6+
const ruleTester = new RuleTester();
7+
8+
const errors = [{ messageId: 'unexpected' }];
9+
const parserOptions = { ecmaVersion: 6 };
10+
11+
ruleTester.run('no-unnecessary-waiting', rule, {
12+
valid: [
13+
{ code: 'cy.wait("@someRequest")', parserOptions },
14+
{ code: 'cy.wait("@someRequest", { log: false })', parserOptions },
15+
{ code: 'cy.wait("@someRequest").then((xhr) => xhr)', parserOptions },
16+
{ code: 'cy.wait(["@someRequest", "@anotherRequest"])', parserOptions },
17+
18+
{ code: 'cy.clock(5000)', parserOptions},
19+
{ code: 'cy.scrollTo(0, 10)', parserOptions },
20+
{ code: 'cy.tick(500)', parserOptions }
21+
],
22+
23+
invalid: [
24+
{ code: 'cy.wait(0)', parserOptions, errors },
25+
{ code: 'cy.wait(100)', parserOptions, errors },
26+
{ code: 'cy.wait(5000)', parserOptions, errors }
27+
]
28+
});

0 commit comments

Comments
 (0)