eslint-plugin-ember
Version:
Eslint plugin for Ember.js apps
620 lines (608 loc) • 16.9 kB
JavaScript
// ------------------------------------------------------------------------------
// Requirements
// ------------------------------------------------------------------------------
const rule = require('../../../lib/rules/order-in-routes');
const RuleTester = require('eslint').RuleTester;
// ------------------------------------------------------------------------------
// Tests
// ------------------------------------------------------------------------------
const eslintTester = new RuleTester();
eslintTester.run('order-in-routes', rule, {
valid: [
{
code: 'export default Route.extend();',
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
currentUser: service(),
queryParams: {},
customProp: "test",
vehicle: alias("car"),
levelOfHappiness: computed("attitude", "health", () => {
}),
beforeModel() {},
model() {},
afterModel() {},
serialize() {},
redirect() {},
activate() {},
setupController() {},
renderTemplate() {},
resetController() {},
deactivate() {},
actions: {},
_customAction() { const foo = 'bar'; },
_customAction2: function() { const foo = 'bar'; },
tSomeTask: task(function* () {})
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
currentUser: inject(),
queryParams: {},
customProp: "test",
vehicle: alias("car"),
levelOfHappiness: computed("attitude", "health", () => {
}),
beforeModel() {},
model() {},
afterModel() {},
actions: {},
_customAction() {},
_customAction2: function() {},
tSomeTask: task(function* () {})
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
levelOfHappiness: computed("attitude", "health", () => {
}),
model() {},
actions: {
test() { return this._customAction() }
},
_customAction() { const foo = 'bar'; }
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
init() {},
model() {},
render() {},
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
mergedProperties: {},
vehicle: alias("car"),
levelOfHappiness: computed("attitude", "health", () => {
}),
model() {},
actions: {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
mergedProperties: {},
test: "asd",
vehicle: alias("car"),
model() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `export default Route.extend({
model() {},
beforeModel() {},
currentUser: service(),
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
options: [{
order: [
'model',
'lifecycle-hook',
'service'
]
}]
},
{
code: `export default Route.extend({
deactivate() {},
beforeModel() {},
currentUser: service(),
model() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
options: [{
order: [
'lifecycle-hook',
'service',
'model'
]
}]
},
{
code: `export default Route.extend({
deactivate() {},
setupController() {},
beforeModel() {},
currentUser: service(),
model() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
options: [{
order: [
[
'deactivate',
'setupController',
'beforeModel'
],
'service',
'model'
]
}]
},
{
code: `
export default Route.extend({
foo: service(),
init() {
this._super(...arguments);
},
actions: {}
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
{
code: `
export default Route.extend({
foo: service(),
init() {
this._super(...arguments);
},
customFoo() {}
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' }
},
],
invalid: [
{
code: `export default Route.extend({
queryParams: {},
currentUser: service(),
customProp: "test",
beforeModel() {},
model() {},
vehicle: alias("car"),
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "currentUser" service injection should be above the inherited "queryParams" property on line 2',
line: 3
}, {
message: 'The "vehicle" single-line function should be above the "beforeModel" lifecycle hook on line 5',
line: 7
}]
},
{
code: `export default Route.extend({
queryParams: {},
currentUser: inject(),
customProp: "test",
beforeModel() {},
model() {},
vehicle: alias("car"),
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "currentUser" service injection should be above the inherited "queryParams" property on line 2',
line: 3
}, {
message: 'The "vehicle" single-line function should be above the "beforeModel" lifecycle hook on line 5',
line: 7
}]
},
{
code: `export default Route.extend({
customProp: "test",
queryParams: {},
beforeModel() {},
model() {},
actions: {},
_customAction() {},
levelOfHappiness: computed("attitude", "health", () => {
})
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The inherited "queryParams" property should be above the "customProp" property on line 2',
line: 3
}, {
message: 'The "levelOfHappiness" multi-line function should be above the "beforeModel" lifecycle hook on line 4',
line: 8
}]
},
{
code: `export default Route.extend({
customProp: "test",
queryParams: {},
model() {},
beforeModel() {},
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The inherited "queryParams" property should be above the "customProp" property on line 2',
line: 3
}, {
message: 'The "beforeModel" lifecycle hook should be above the "model" hook on line 4',
line: 5
}]
},
{
code: `export default Route.extend({
queryParams: {},
vehicle: alias("car"),
customProp: "test",
model() {},
_customAction() { const foo = 'bar'; },
actions: {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "customProp" property should be above the "vehicle" single-line function on line 3',
line: 4
}, {
message: 'The actions hash should be above the "_customAction" method on line 6',
line: 7
}]
},
{
code: `export default Route.extend({
model() {},
customProp: "test",
actions: {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "customProp" property should be above the "model" hook on line 2',
line: 3
}]
},
{
code: `export default Route.extend({
test: "asd",
mergedProperties: {},
model() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The inherited "mergedProperties" property should be above the "test" property on line 2',
line: 3
}]
},
{
code: `export default Route.extend({
currentUser: service(),
queryParams: {},
customProp: "test",
vehicle: alias("car"),
levelOfHappiness: computed("attitude", "health", () => {
}),
beforeModel() {},
model() {},
afterModel() {},
setupController() {},
redirect() {},
serialize() {},
activate() {},
deactivate() {},
renderTemplate() {},
resetController() {},
actions: {},
_customAction() {},
_customAction2: function() {},
tSomeTask: task(function* () {})
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "redirect" lifecycle hook should be above the "setupController" lifecycle hook on line 11',
line: 12
}, {
message: 'The "serialize" lifecycle hook should be above the "setupController" lifecycle hook on line 11',
line: 13
}, {
message: 'The "activate" lifecycle hook should be above the "setupController" lifecycle hook on line 11',
line: 14
}, {
message: 'The "renderTemplate" lifecycle hook should be above the "deactivate" lifecycle hook on line 15',
line: 16
}, {
message: 'The "resetController" lifecycle hook should be above the "deactivate" lifecycle hook on line 15',
line: 17
}]
},
{
code: `export default Route.extend({
test: "asd",
_test2() { const foo = 'bar'; },
model() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "model" hook should be above the "_test2" method on line 3',
line: 4
}]
},
{
filename: 'example-app/routes/some-route.js',
code: `export default CustomRoute.extend({
model() {},
test: "asd",
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "test" property should be above the "model" hook on line 2',
line: 3
}]
},
{
filename: 'example-app/some-feature/route.js',
code: `export default CustomRoute.extend({
model() {},
test: "asd",
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "test" property should be above the "model" hook on line 2',
line: 3
}]
},
{
filename: 'example-app/twisted-path/some-file.js',
code: `export default Route.extend({
model() {},
test: "asd",
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "test" property should be above the "model" hook on line 2',
line: 3
}]
},
{
code: `
export default Route.extend({
foo: service(),
actions: {},
init() {
this._super(...arguments);
}
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "init" lifecycle hook should be above the actions hash on line 4',
line: 5
}]
},
{
code: `
export default Route.extend({
foo: service(),
customFoo() {},
init() {
this._super(...arguments);
},
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "init" lifecycle hook should be above the "customFoo" empty method on line 4',
line: 5
}]
},
{
code: `
export default Route.extend({
init() {
this._super(...arguments);
},
foo: service()
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "foo" service injection should be above the "init" lifecycle hook on line 3',
line: 6
}]
},
{
code: `
export default Route.extend({
init() {
this._super(...arguments);
},
someProp: null
});
`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "someProp" property should be above the "init" lifecycle hook on line 3',
line: 6
}]
},
{
code: `export default Route.extend({
queryParams: {},
currentUser: service(),
customProp: "test",
beforeModel() {},
model() {},
vehicle: alias("car"),
actions: {},
_customAction() {}
});`,
output: `export default Route.extend({
currentUser: service(),
queryParams: {},
customProp: "test",
vehicle: alias("car"),
beforeModel() {},
model() {},
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "currentUser" service injection should be above the inherited "queryParams" property on line 2',
line: 3
}, {
message: 'The "vehicle" single-line function should be above the "beforeModel" lifecycle hook on line 5',
line: 7
}]
},
{
code: `export default Route.extend({
customProp: "test",
// queryParams line comment
queryParams: {},
model() {},
/**
* actions block comment
*/
actions: {},
_customAction() {}
});`,
output: `export default Route.extend({
// queryParams line comment
queryParams: {},
customProp: "test",
model() {},
/**
* actions block comment
*/
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The inherited "queryParams" property should be above the "customProp" property on line 2',
line: 4
}]
},
{
code: `export default Route.extend({
customProp: "test",
model() {},
/**
* beforeModel block comment
*/
beforeModel() {},
/**
* actions block comment
*/
actions: {},
_customAction() {}
});`,
output: `export default Route.extend({
customProp: "test",
/**
* beforeModel block comment
*/
beforeModel() {},
model() {},
/**
* actions block comment
*/
actions: {},
_customAction() {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "beforeModel" lifecycle hook should be above the "model" hook on line 3',
line: 7
}]
},
{
code:
// whitespace is preserved inside `` and it's breaking the test
`export default Route.extend({
customProp: "test",
/**
* actions block comment
*/
actions: {},
/**
* beforeModel block comment
*/
beforeModel() {}
});`,
output:
`export default Route.extend({
customProp: "test",
/**
* beforeModel block comment
*/
beforeModel() {},
/**
* actions block comment
*/
actions: {},
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "beforeModel" lifecycle hook should be above the actions hash on line 6',
line: 10
}]
},
{
code:
// whitespace is preserved inside `` and it's breaking the test
`export default Route.extend({
model() {},
test: "asd"
});`,
output:
`export default Route.extend({
test: "asd",
model() {},
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "test" property should be above the "model" hook on line 2',
line: 3
}]
},
{
code: `export default Route.extend({
model() {},
test: "asd",
actions: {}
});`,
output: `export default Route.extend({
test: "asd",
model() {},
actions: {}
});`,
parserOptions: { ecmaVersion: 6, sourceType: 'module' },
errors: [{
message: 'The "test" property should be above the "model" hook on line 3',
line: 5
}]
}
]
});