Skip to content

Commit 325301b

Browse files
committed
feat(rules): add 'no-absolute-url' rule
1 parent 9cfd024 commit 325301b

File tree

7 files changed

+171
-20
lines changed

7 files changed

+171
-20
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ Rule | Default | Options
4949
[use-first-last][] | 1 |
5050
[no-get-in-it][] | 1 |
5151
[array-callback-return][] | 1 |
52+
[no-absolute-url][] | 1 |
5253
[by-css-shortcut][] | 0 |
5354

5455
For example, the `missing-perform` rule is enabled by default and will cause
@@ -79,6 +80,7 @@ See [configuring rules][] for more information.
7980
[use-first-last]: docs/rules/use-first-last.md
8081
[no-get-in-it]: docs/rules/no-get-in-it.md
8182
[array-callback-return]: docs/rules/array-callback-return.md
83+
[no-absolute-url]: docs/rules/no-absolute-url.md
8284
[by-css-shortcut]: docs/rules/by-css-shortcut.md
8385
[configuring rules]: http://eslint.org/docs/user-guide/configuring#configuring-rules
8486

docs/rules/no-absolute-url.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Recommend against navigating to absolute URLs inside `browser.get()` or `browser.driver.get()`
2+
3+
The rule would warn if `browser.get()` or `browser.driver.get()` are called with an absolute URL as an argument.
4+
5+
Instead, it is recommended to have [`baseUrl` configuration option](https://github.com/angular/protractor/blob/master/docs/referenceConf.js) set and navigating to relative URLs in tests.
6+
This helps to easily switch to a different target application URL by simply changing the `baseUrl` setting (e.g. switch from dev to test or staging).
7+
8+
## Rule details
9+
10+
Any use of the following patterns are considered warnings:
11+
12+
```js
13+
browser.get("http://google.com");
14+
browser.driver.get("https://google.com");
15+
```
16+
17+
The following patterns are not warnings:
18+
19+
```js
20+
browser.get("login");
21+
browser.driver.get("account/signup");
22+
```

index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var noShadowing = require('./lib/rules/no-shadowing')
1414
var useFirstLast = require('./lib/rules/use-first-last')
1515
var noGetInIt = require('./lib/rules/no-get-in-it')
1616
var arrayCallbackReturn = require('./lib/rules/array-callback-return')
17+
var noAbsoluteURL = require('./lib/rules/no-absolute-url')
1718

1819
module.exports = {
1920
rules: {
@@ -30,7 +31,8 @@ module.exports = {
3031
'no-shadowing': noShadowing,
3132
'use-first-last': useFirstLast,
3233
'no-get-in-it': noGetInIt,
33-
'array-callback-return': arrayCallbackReturn
34+
'array-callback-return': arrayCallbackReturn,
35+
'no-absolute-url': noAbsoluteURL
3436
},
3537
configs: {
3638
recommended: {
@@ -48,6 +50,7 @@ module.exports = {
4850
'protractor/use-first-last': 1,
4951
'protractor/no-get-in-it': 1,
5052
'protractor/array-callback-return': 1,
53+
'protractor/no-absolute-url': 1,
5154
'protractor/by-css-shortcut': 0
5255
},
5356
globals: {

lib/is-browser-get.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict'
2+
3+
/**
4+
* @fileoverview Utility function to determine if a node is a browser.get() or browser.driver.get() call
5+
* @author Alexander Afanasyev
6+
*/
7+
module.exports = function (node) {
8+
var object = node.callee.object
9+
var property = node.callee.property
10+
11+
if (object && property && property.name === 'get') {
12+
var isBrowser = object.name === 'browser'
13+
var isBrowserDriver = object.object && object.object.name === 'browser' &&
14+
object.property && object.property.name === 'driver'
15+
if (isBrowser || isBrowserDriver) {
16+
return {
17+
'browserGet': isBrowser,
18+
'browserDriverGet': isBrowserDriver
19+
}
20+
}
21+
}
22+
23+
return false
24+
}

lib/rules/no-absolute-url.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
'use strict'
2+
3+
/**
4+
* @fileoverview Recommend against navigating to absolute URLs inside `browser.get()` or `browser.driver.get()`
5+
* @author Alexander Afanasyev
6+
*/
7+
8+
var isBrowserGet = require('../is-browser-get')
9+
var isAbsoluteURL = new RegExp('^(?:[a-z]+:)?//', 'i')
10+
11+
module.exports = {
12+
meta: {
13+
schema: []
14+
},
15+
16+
create: function (context) {
17+
return {
18+
'CallExpression': function (node) {
19+
if (node.arguments && node.arguments[0]) {
20+
var result = isBrowserGet(node)
21+
22+
if (result) {
23+
var url = node.arguments[0].value
24+
25+
if (isAbsoluteURL.test(url)) {
26+
context.report({
27+
node: node,
28+
message: 'Unexpected absolute URL'
29+
})
30+
}
31+
}
32+
}
33+
}
34+
}
35+
}
36+
}

lib/rules/no-get-in-it.js

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* @author Alexander Afanasyev
66
*/
77

8+
var isBrowserGet = require('../is-browser-get')
9+
810
var testFunctionNames = [
911
'it'
1012
]
@@ -17,26 +19,19 @@ module.exports = {
1719
create: function (context) {
1820
return {
1921
'CallExpression': function (node) {
20-
var object = node.callee.object
21-
var property = node.callee.property
22-
23-
if (object && property && property.name === 'get') {
24-
var isBrowserGet = object.name === 'browser'
25-
var isBrowserDriverGet = object.object && object.object.name === 'browser' &&
26-
object.property && object.property.name === 'driver'
22+
var result = isBrowserGet(node)
2723

28-
if (isBrowserGet || isBrowserDriverGet) {
29-
// Use ancestors to determine if we are inside the it() block currently
30-
for (var i = 0; i < context.getAncestors().length; i++) {
31-
var parent = context.getAncestors()[i]
32-
if (parent.type === 'CallExpression' && testFunctionNames.indexOf(parent.callee.name) >= 0) {
33-
var methodName = isBrowserGet ? 'browser.get()' : 'browser.driver.get()'
34-
context.report({
35-
node: node,
36-
message: 'Unexpected "' + methodName + '" inside it'
37-
})
38-
break
39-
}
24+
if (result) {
25+
// Use ancestors to determine if we are inside the it() block currently
26+
for (var i = 0; i < context.getAncestors().length; i++) {
27+
var parent = context.getAncestors()[i]
28+
if (parent.type === 'CallExpression' && testFunctionNames.indexOf(parent.callee.name) >= 0) {
29+
var methodName = result.browserGet ? 'browser.get()' : 'browser.driver.get()'
30+
context.report({
31+
node: node,
32+
message: 'Unexpected "' + methodName + '" inside it'
33+
})
34+
break
4035
}
4136
}
4237
}

test/rules/no-absolute-url.js

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
'use strict'
2+
3+
var rule = require('../../lib/rules/no-absolute-url')
4+
var RuleTester = require('eslint').RuleTester
5+
var eslintTester = new RuleTester()
6+
7+
eslintTester.run('no-absolute-url', rule, {
8+
valid: [
9+
'browser.get();',
10+
'browser.driver.get();',
11+
'browser.get("mypage");',
12+
'browser.driver.get("mypage");',
13+
'browser.get("MYPAGE");',
14+
'browser.driver.get("MYPAGE");',
15+
'browser.get("/mypage/mypage");',
16+
'browser.driver.get("/mypage/mypage");'
17+
],
18+
19+
invalid: [
20+
{
21+
code: 'browser.get("http://google.com");',
22+
errors: [{
23+
message: 'Unexpected absolute URL'
24+
}]
25+
},
26+
{
27+
code: 'browser.driver.get("https://google.com");',
28+
errors: [{
29+
message: 'Unexpected absolute URL'
30+
}]
31+
},
32+
{
33+
code: 'browser.get("HTTP://google.com");',
34+
errors: [{
35+
message: 'Unexpected absolute URL'
36+
}]
37+
},
38+
{
39+
code: 'browser.driver.get("HTTPS://google.com");',
40+
errors: [{
41+
message: 'Unexpected absolute URL'
42+
}]
43+
},
44+
{
45+
code: 'browser.get("ftp://google.com");',
46+
errors: [{
47+
message: 'Unexpected absolute URL'
48+
}]
49+
},
50+
{
51+
code: 'browser.driver.get("ftp://google.com");',
52+
errors: [{
53+
message: 'Unexpected absolute URL'
54+
}]
55+
},
56+
{
57+
code: 'browser.get("//google.com");',
58+
errors: [{
59+
message: 'Unexpected absolute URL'
60+
}]
61+
},
62+
{
63+
code: 'browser.driver.get("//google.com");',
64+
errors: [{
65+
message: 'Unexpected absolute URL'
66+
}]
67+
}
68+
]
69+
})

0 commit comments

Comments
 (0)