From ae8f747789d63e951044d8893bf542c4d170095d Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Tue, 9 Aug 2016 15:01:40 +0200 Subject: [PATCH 1/5] Update Ember CLI + deps --- .editorconfig | 14 -------------- .jshintrc | 2 +- .travis.yml | 18 +++++++++++++++++- bower.json | 3 +-- package.json | 19 +++++++++---------- tests/.jshintrc | 2 +- tests/dummy/app/index.html | 8 ++++---- tests/dummy/config/environment.js | 3 +-- tests/helpers/module-for-acceptance.js | 12 ++++++------ tests/index.html | 17 ++++++++--------- 10 files changed, 48 insertions(+), 50 deletions(-) diff --git a/.editorconfig b/.editorconfig index 47c5438..219985c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -13,22 +13,8 @@ insert_final_newline = true indent_style = space indent_size = 2 -[*.js] -indent_style = space -indent_size = 2 - [*.hbs] insert_final_newline = false -indent_style = space -indent_size = 2 - -[*.css] -indent_style = space -indent_size = 2 - -[*.html] -indent_style = space -indent_size = 2 [*.{diff,md}] trim_trailing_whitespace = false diff --git a/.jshintrc b/.jshintrc index 08096ef..d421faa 100644 --- a/.jshintrc +++ b/.jshintrc @@ -27,6 +27,6 @@ "strict": false, "white": false, "eqnull": true, - "esnext": true, + "esversion": 6, "unused": true } diff --git a/.travis.yml b/.travis.yml index 64533be..68b59ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,14 +9,30 @@ cache: directories: - node_modules +env: + - EMBER_TRY_SCENARIO=default + - EMBER_TRY_SCENARIO=ember-1.13 + - EMBER_TRY_SCENARIO=ember-release + - EMBER_TRY_SCENARIO=ember-beta + - EMBER_TRY_SCENARIO=ember-canary + +matrix: + fast_finish: true + allow_failures: + - env: EMBER_TRY_SCENARIO=ember-canary + before_install: - npm config set spin false - npm install -g bower + - bower --version - npm install phantomjs-prebuilt + - phantomjs --version install: - npm install - bower install script: - - npm test + # Usually, it's ok to finish the test scenario without reverting + # to the addon's original dependency state, skipping "cleanup". + - ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup diff --git a/bower.json b/bower.json index cdea90e..0cd130d 100644 --- a/bower.json +++ b/bower.json @@ -1,9 +1,8 @@ { "name": "ember-admin", "dependencies": { - "ember": "~2.5.0", + "ember": "~2.7.0", "ember-cli-shims": "0.1.1", - "ember-cli-test-loader": "0.2.2", "ember-qunit-notifications": "0.1.0", "pretender": "~0.10.0" } diff --git a/package.json b/package.json index a58d45b..a3b6cf4 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "build": "ember build", "start": "ember server", - "test": "ember try:testall" + "test": "ember try:each" }, "repository": "https://github.com/dockyard/ember-admin", "engines": { @@ -19,26 +19,25 @@ "license": "MIT", "devDependencies": { "broccoli-asset-rev": "^2.4.2", - "ember-ajax": "0.7.1", - "ember-cli": "2.5.0", + "ember-ajax": "^2.0.1", + "ember-cli": "2.7.0", "ember-cli-app-version": "^1.0.0", "ember-cli-dependency-checker": "^1.2.0", - "ember-cli-htmlbars": "^1.0.3", "ember-cli-htmlbars-inline-precompile": "^0.3.1", "ember-cli-inject-live-reload": "^1.4.0", "ember-cli-jshint": "^1.0.0", "ember-cli-pretender": "^0.5.0", - "ember-cli-qunit": "^1.4.0", - "ember-cli-release": "0.2.8", + "ember-cli-qunit": "^2.0.0", + "ember-cli-release": "^0.2.9", "ember-cli-sri": "^2.1.0", + "ember-cli-test-loader": "^1.1.0", "ember-cli-uglify": "^1.2.0", - "ember-data": "^2.5.0", + "ember-data": "^2.7.0", "ember-disable-prototype-extensions": "^1.1.0", "ember-export-application-global": "^1.0.5", "ember-load-initializers": "^0.5.1", "ember-resolver": "^2.0.3", - "ember-suave": "1.2.3", - "ember-try": "^0.2.2", + "ember-suave": "4.0.0", "loader.js": "^4.0.1" }, "keywords": [ @@ -46,7 +45,7 @@ ], "dependencies": { "ember-async-button": "0.7.0", - "ember-cli-htmlbars": "0.7.9", + "ember-cli-htmlbars": "^1.0.3", "ember-data-route": "0.2.0", "ember-cli-babel": "^5.1.6" }, diff --git a/tests/.jshintrc b/tests/.jshintrc index 6ec0b7c..d2bd113 100644 --- a/tests/.jshintrc +++ b/tests/.jshintrc @@ -47,6 +47,6 @@ "strict": false, "white": false, "eqnull": true, - "esnext": true, + "esversion": 6, "unused": true } diff --git a/tests/dummy/app/index.html b/tests/dummy/app/index.html index c9b4327..5120bd7 100644 --- a/tests/dummy/app/index.html +++ b/tests/dummy/app/index.html @@ -9,16 +9,16 @@ {{content-for "head"}} - - + + {{content-for "head-footer"}} {{content-for "body"}} - - + + {{content-for "body-footer"}} diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js index c59bcd5..2529939 100644 --- a/tests/dummy/config/environment.js +++ b/tests/dummy/config/environment.js @@ -4,7 +4,7 @@ module.exports = function(environment) { var ENV = { modulePrefix: 'dummy', environment: environment, - baseURL: '/', + rootURL: '/', locationType: 'auto', EmberENV: { FEATURES: { @@ -29,7 +29,6 @@ module.exports = function(environment) { if (environment === 'test') { // Testem prefers this... - ENV.baseURL = '/'; ENV.locationType = 'none'; // keep test console output quieter diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 8c8b74e..76996fd 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -1,23 +1,23 @@ import { module } from 'qunit'; +import Ember from 'ember'; import startApp from '../helpers/start-app'; import destroyApp from '../helpers/destroy-app'; +const { RSVP: { Promise } } = Ember; + export default function(name, options = {}) { module(name, { beforeEach() { this.application = startApp(); if (options.beforeEach) { - options.beforeEach.apply(this, arguments); + return options.beforeEach.apply(this, arguments); } }, afterEach() { - if (options.afterEach) { - options.afterEach.apply(this, arguments); - } - - destroyApp(this.application); + let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + return Promise.resolve(afterEach).then(() => destroyApp(this.application)); } }); } diff --git a/tests/index.html b/tests/index.html index 64cb47e..f7ff652 100644 --- a/tests/index.html +++ b/tests/index.html @@ -10,9 +10,9 @@ {{content-for "head"}} {{content-for "test-head"}} - - - + + + {{content-for "head-footer"}} {{content-for "test-head-footer"}} @@ -21,12 +21,11 @@ {{content-for "body"}} {{content-for "test-body"}} - - - - - - + + + + + {{content-for "body-footer"}} {{content-for "test-body-footer"}} From 2643e88d3def3372f6d931a67090c116577680be Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Tue, 9 Aug 2016 15:24:37 +0200 Subject: [PATCH 2/5] Fix all new Ember Suave rules --- addon/components/admin-input.js | 8 +- addon/components/model-records-table.js | 19 ++--- addon/components/property-print.js | 13 +-- addon/controllers/admin.js | 2 +- addon/controllers/model-records/edit.js | 6 +- addon/controllers/model-records/index.js | 6 +- addon/controllers/model-records/new.js | 6 +- addon/mixins/model-records/columns.js | 18 +++-- addon/mixins/model-records/model-record.js | 7 +- addon/mixins/model-records/relationships.js | 8 +- addon/mixins/model-records/write.js | 6 +- addon/routes/model-records/edit.js | 2 +- addon/stores/admin.js | 6 +- addon/utils/array.js | 2 +- tests/acceptance/admin-test.js | 90 ++++++++++----------- tests/dummy/.jshintrc | 32 -------- tests/dummy/app/app.js | 4 +- tests/dummy/app/router.js | 7 +- tests/helpers/destroy-app.js | 6 +- tests/helpers/equality-helpers.js | 6 +- tests/helpers/fill-in-by.js | 4 +- tests/helpers/module-for-acceptance.js | 4 +- tests/helpers/start-app.js | 11 ++- tests/unit/admin-store-test.js | 16 ++-- 24 files changed, 142 insertions(+), 147 deletions(-) delete mode 100644 tests/dummy/.jshintrc diff --git a/addon/components/admin-input.js b/addon/components/admin-input.js index b3316dc..59d0911 100644 --- a/addon/components/admin-input.js +++ b/addon/components/admin-input.js @@ -10,13 +10,13 @@ const { export default TextField.extend({ value: computed('columnValue', { get() { - const columnValue = get(this, 'columnValue'); - const record = get(this, 'record'); + let columnValue = get(this, 'columnValue'); + let record = get(this, 'record'); return get(record, `model.${columnValue}`); }, set(key, value) { - const columnValue = get(this, 'columnValue'); - const record = get(this, 'record'); + let columnValue = get(this, 'columnValue'); + let record = get(this, 'record'); set(record, `model.${columnValue}`, value); return value; } diff --git a/addon/components/model-records-table.js b/addon/components/model-records-table.js index 80f0115..cd9b591 100644 --- a/addon/components/model-records-table.js +++ b/addon/components/model-records-table.js @@ -3,6 +3,7 @@ import ColumnsMixin from 'ember-admin/mixins/model-records/columns'; const { get, + isBlank, isNone, computed, getOwner, @@ -20,11 +21,11 @@ export default Component.extend(ColumnsMixin, { return getOwner(this).lookup(`template:${templatePath}`); }), filteredRecords: computed('records', 'filter', function() { - if (Ember.isBlank(get(this, 'filter'))) { + if (isBlank(get(this, 'filter'))) { return get(this, 'records'); } else { - const filter = get(this, 'filter').toLowerCase(); - const columns = get(this, 'filteredColumns'); + let filter = get(this, 'filter').toLowerCase(); + let columns = get(this, 'filteredColumns'); return get(this, 'records').filter(function(record) { let value; @@ -42,17 +43,17 @@ export default Component.extend(ColumnsMixin, { return get(this, 'relationshipName') && get(this, 'relationshipId'); }), hideCreate: computed('relationshipName', 'relationshipId', function() { - const relationshipName = get(this, 'relationshipName'); - const relationshipId = get(this, 'relationshipId'); + let relationshipName = get(this, 'relationshipName'); + let relationshipId = get(this, 'relationshipId'); if (relationshipId) { if (isNone(relationshipName)) { return true; } else { - const { store } = this.admin; - const constructor = store.modelFor(get(this, 'recordType')); - const inverseFor = constructor.inverseFor(relationshipName, store); - const { kind } = inverseFor; + let { store } = this.admin; + let constructor = store.modelFor(get(this, 'recordType')); + let inverseFor = constructor.inverseFor(relationshipName, store); + let { kind } = inverseFor; if (kind && kind === 'belongsTo' && get(this, 'records.length') > 0) { return true; diff --git a/addon/components/property-print.js b/addon/components/property-print.js index 43dc10f..69bd1fe 100644 --- a/addon/components/property-print.js +++ b/addon/components/property-print.js @@ -2,6 +2,7 @@ import Ember from 'ember'; import layout from '../templates/property-print'; const { + Component, on, get, set, @@ -9,10 +10,10 @@ const { addObserver } = Ember; -export default Ember.Component.extend({ +export default Component.extend({ setupCellObsever: observer('record', 'column', on('init', function() { - const record = get(this, 'record'); - const column = get(this, 'column'); + let record = get(this, 'record'); + let column = get(this, 'column'); if (!record || !column) { return; @@ -23,9 +24,9 @@ export default Ember.Component.extend({ })), _updateCell() { - const record = get(this, 'record'); - const column = get(this, 'column'); - const value = get(record, column); + let record = get(this, 'record'); + let column = get(this, 'column'); + let value = get(record, column); set(this, 'cellValue', value); }, diff --git a/addon/controllers/admin.js b/addon/controllers/admin.js index e47edde..198d936 100644 --- a/addon/controllers/admin.js +++ b/addon/controllers/admin.js @@ -10,7 +10,7 @@ const { export default Controller.extend({ filteredModels: computed(function() { - const { + let { includedModels, excludedModels } = this.admin; diff --git a/addon/controllers/model-records/edit.js b/addon/controllers/model-records/edit.js index e10ccd4..e3073da 100644 --- a/addon/controllers/model-records/edit.js +++ b/addon/controllers/model-records/edit.js @@ -3,6 +3,10 @@ import RelationshipsMixin from 'ember-admin/mixins/model-records/relationships'; import RecordTypeMixin from 'ember-admin/mixins/model-records/record-type'; import ColumnsMixin from 'ember-admin/mixins/model-records/columns'; -export default Ember.Controller.extend(RecordTypeMixin, ColumnsMixin, RelationshipsMixin, { +const { + Controller +} = Ember; + +export default Controller.extend(RecordTypeMixin, ColumnsMixin, RelationshipsMixin, { excludedColumns: ['id'] }); diff --git a/addon/controllers/model-records/index.js b/addon/controllers/model-records/index.js index 1022c8b..fe6d28e 100644 --- a/addon/controllers/model-records/index.js +++ b/addon/controllers/model-records/index.js @@ -1,4 +1,8 @@ import Ember from 'ember'; import RecordTypeMixin from 'ember-admin/mixins/model-records/record-type'; -export default Ember.Controller.extend(RecordTypeMixin); +const { + Controller +} = Ember; + +export default Controller.extend(RecordTypeMixin); diff --git a/addon/controllers/model-records/new.js b/addon/controllers/model-records/new.js index fbf31fd..8e61da1 100644 --- a/addon/controllers/model-records/new.js +++ b/addon/controllers/model-records/new.js @@ -16,11 +16,11 @@ export default Controller.extend(RecordTypeMixin, ColumnsMixin, { 'relationship-id': null, setupRelation: observer('model', function() { - const name = get(this, 'relationship-name'); - const id = get(this, 'relationship-id'); + let name = get(this, 'relationship-name'); + let id = get(this, 'relationship-id'); if (name && id) { - const meta = get(this, 'model').constructor.metaForProperty(name); + let meta = get(this, 'model').constructor.metaForProperty(name); this.admin.store.find(meta.type, id).then((model) => { if (meta.kind && meta.kind === 'hasMany') { diff --git a/addon/mixins/model-records/columns.js b/addon/mixins/model-records/columns.js index 36690a2..c7cb854 100644 --- a/addon/mixins/model-records/columns.js +++ b/addon/mixins/model-records/columns.js @@ -3,6 +3,8 @@ import RecordTypeMixin from 'ember-admin/mixins/model-records/model-record'; import { contains } from 'ember-admin/utils/array'; const { + Mixin, + A: emberArray, get, computed, computed: { filter }, @@ -13,14 +15,14 @@ function columnContains(columnType, parameter) { return columnType && contains(columnType, parameter); } -export default Ember.Mixin.create(RecordTypeMixin, { +export default Mixin.create(RecordTypeMixin, { columns: computed('model', function() { - const adapter = getOwner(this).lookup('data-adapter:main'); - const recordType = this.get('recordType'); - const type = adapter.getModelTypes().findBy('name', recordType); - const { klass } = type; + let adapter = getOwner(this).lookup('data-adapter:main'); + let recordType = this.get('recordType'); + let type = adapter.getModelTypes().findBy('name', recordType); + let { klass } = type; - const keys = Ember.A(['id']); + let keys = emberArray(['id']); klass.eachAttribute(function(key) { keys.push(key); @@ -30,11 +32,11 @@ export default Ember.Mixin.create(RecordTypeMixin, { }), filteredColumns: filter('columns', function(name) { - const modelName = get(this, 'model-record.name'); + let modelName = get(this, 'model-record.name'); let allowColumn = true; /*jshint -W024 */ - const { + let { admin: { includedColumns: adminIncludedColumns, excludedColumns: adminExcludedColumns diff --git a/addon/mixins/model-records/model-record.js b/addon/mixins/model-records/model-record.js index b0ab394..e08b69a 100644 --- a/addon/mixins/model-records/model-record.js +++ b/addon/mixins/model-records/model-record.js @@ -1,15 +1,16 @@ import Ember from 'ember'; const { + computed, get, getOwner, Mixin } = Ember; export default Mixin.create({ - 'model-record': Ember.computed('recordType', function() { - const adapter = getOwner(this).lookup('data-adapter:main'); - const type = adapter.getModelTypes().findBy('name', get(this, 'recordType')); + 'model-record': computed('recordType', function() { + let adapter = getOwner(this).lookup('data-adapter:main'); + let type = adapter.getModelTypes().findBy('name', get(this, 'recordType')); return adapter.wrapModelType(type.klass, get(this, 'recordType')); }) }); diff --git a/addon/mixins/model-records/relationships.js b/addon/mixins/model-records/relationships.js index 08ea378..cb94185 100644 --- a/addon/mixins/model-records/relationships.js +++ b/addon/mixins/model-records/relationships.js @@ -26,10 +26,10 @@ function relationshipMacro(type) { records = emberArray([records]); } - const store = getOwner(this).lookup('store:admin'); - const constructor = get(this, 'model.constructor'); - const inverse = constructor.inverseFor(property, store); - const meta = constructor.metaForProperty(property); + let store = getOwner(this).lookup('store:admin'); + let constructor = get(this, 'model.constructor'); + let inverse = constructor.inverseFor(property, store); + let meta = constructor.metaForProperty(property); pushObject(relationships, { name: property, diff --git a/addon/mixins/model-records/write.js b/addon/mixins/model-records/write.js index 1f1c34e..1313efa 100644 --- a/addon/mixins/model-records/write.js +++ b/addon/mixins/model-records/write.js @@ -9,8 +9,8 @@ const { export default Mixin.create(EmberDataRouteMixin, { renderTemplate() { - const templatePath = `${this.templateAdminPath}/${this.paramsFor('model-records').name}`; - const defaultTemplatePath = `${this.templateAdminPath}/default`; + let templatePath = `${this.templateAdminPath}/${this.paramsFor('model-records').name}`; + let defaultTemplatePath = `${this.templateAdminPath}/default`; if (getOwner(this).lookup(`template:${templatePath}`)) { this.render(templatePath); @@ -20,7 +20,7 @@ export default Mixin.create(EmberDataRouteMixin, { }, actions: { save(callback) { - const promise = get(this, 'controller.model').save(); + let promise = get(this, 'controller.model').save(); callback(promise); promise.then(() => { diff --git a/addon/routes/model-records/edit.js b/addon/routes/model-records/edit.js index 1a4100c..f9501d3 100644 --- a/addon/routes/model-records/edit.js +++ b/addon/routes/model-records/edit.js @@ -14,7 +14,7 @@ export default Route.extend(WriteMixin, { templateAdminPath: 'admin/edit', actions: { destroyRecord(callback) { - const canDestroy = window.confirm('Are you sure you want to destroy this record?'); + let canDestroy = window.confirm('Are you sure you want to destroy this record?'); let promise; if (canDestroy) { diff --git a/addon/stores/admin.js b/addon/stores/admin.js index f116bbb..5560ee4 100644 --- a/addon/stores/admin.js +++ b/addon/stores/admin.js @@ -17,8 +17,8 @@ export default Store.extend({ } if (!this.typeAdapter[type]) { let namespaces = []; - const adapter = this._super(type); - const adminService = getOwner(this).lookup('service:admin'); + let adapter = this._super(type); + let adminService = getOwner(this).lookup('service:admin'); if (adapter.namespace) { namespaces = adapter.namespace.split('/'); @@ -33,7 +33,7 @@ export default Store.extend({ namespace = undefined; } - const AdminAdapter = adapter.constructor.extend({ + let AdminAdapter = adapter.constructor.extend({ namespace }); diff --git a/addon/utils/array.js b/addon/utils/array.js index 185f515..04e2b40 100644 --- a/addon/utils/array.js +++ b/addon/utils/array.js @@ -8,7 +8,7 @@ const { contains: _contains, pushObject: _pushObject, removeObject: _removeObject -} = Ember.A(); +} = emberArray(); export function contains(array, ...values) { return _contains.apply(emberArray(array), values); diff --git a/tests/acceptance/admin-test.js b/tests/acceptance/admin-test.js index 5f9d222..6136b42 100644 --- a/tests/acceptance/admin-test.js +++ b/tests/acceptance/admin-test.js @@ -24,17 +24,17 @@ module('Acceptance: Admin', { return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ cats })]; }); this.get('/admin/cats/1', function() { - const cat = { id: 1, name: 'Felix', age: 10 }; + let cat = { id: 1, name: 'Felix', age: 10 }; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ cats: [cat] })]; }); this.put('/admin/cats/1', function() { - const cat = { id: 1, name: 'Hobbes', age: 29 }; + let cat = { id: 1, name: 'Hobbes', age: 29 }; cats[0] = cat; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ cats: [cat] })]; }); this.post('/admin/cats', function() { - const cat = { id: 3, name: 'Lion-O', age: 30 }; + let cat = { id: 3, name: 'Lion-O', age: 30 }; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ cats: [cat] })]; }); this.delete('/admin/cats/1', function() { @@ -42,13 +42,13 @@ module('Acceptance: Admin', { return [204, { 'Content-Type': 'application/json' }, '']; }); this.get('/admin/dogs', function() { - const dogs = [ + let dogs = [ { id: 1, name: 'Boomer', age: 2 } ]; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ dogs })]; }); this.get('/admin/dogs/1', function() { - const dogs = [ + let dogs = [ { id: 1, name: 'Boomer', age: 2 } ]; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ dogs })]; @@ -65,7 +65,7 @@ test('listing all models', function(assert) { visit('/admin'); andThen(function() { - const links = find('a'); + let links = find('a'); assert.equal(links.first().text(), 'bird'); assert.equal(links.last().text(), 'toy'); }); @@ -75,12 +75,12 @@ test('viewing a model\'s records', function(assert) { visit('/admin'); andThen(function() { - const links = find('a:contains("cat")'); + let links = find('a:contains("cat")'); click(`#${links.first().prop('id')}`); }); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(0), 'id', 'name', 'age', 'foo', 'bar', 'baz'); rowValuesEqual(assert, rows.eq(1), '1', 'Felix', '10', '', '', ''); @@ -96,7 +96,7 @@ test('filtering records by value', function(assert) { }); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(0), 'id', 'name', 'age', 'foo', 'bar', 'baz'); rowValuesEqual(assert, rows.eq(1), '1', 'Felix', '10', '', '', ''); @@ -108,7 +108,7 @@ test('editing a record', function(assert) { visit('/admin/cat'); andThen(function() { - const link = find('.cat a:contains("Felix")'); + let link = find('.cat a:contains("Felix")'); click(link); }); @@ -121,7 +121,7 @@ test('editing a record', function(assert) { andThen(function() {}); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(1), '1', 'Hobbes', '29', '', '', ''); }); }); @@ -130,7 +130,7 @@ test('creating a new record', function(assert) { visit('/admin/cat'); andThen(function() { - const link = find('.cat a:contains("Create")'); + let link = find('.cat a:contains("Create")'); click(link, 'cannot find "Create"'); }); @@ -143,14 +143,14 @@ test('creating a new record', function(assert) { andThen(function() {}); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(3), '3', 'Lion-O', '30', '', '', ''); }); }); test('creating doesn\'t affect list', function(assert) { visit('/admin/cat'); - const oldConfirm = window.confirm; + let oldConfirm = window.confirm; window.confirm = function() { return true; }; @@ -158,7 +158,7 @@ test('creating doesn\'t affect list', function(assert) { let rows; andThen(function() { - const link = find('.cat a:contains("Create")'); + let link = find('.cat a:contains("Create")'); rows = find('.cat tr'); @@ -170,7 +170,7 @@ test('creating doesn\'t affect list', function(assert) { }); andThen(function() { - const newRows = find('.cat tr'); + let newRows = find('.cat tr'); assert.equal(rows.length, newRows.length, 'Number of rows unaffected'); window.confirm = oldConfirm; }); @@ -178,7 +178,7 @@ test('creating doesn\'t affect list', function(assert) { test('deleting a record & confirming', function(assert) { let confirmCount = 0; - const oldConfirm = window.confirm; + let oldConfirm = window.confirm; window.confirm = function() { confirmCount = 1; return true; @@ -192,7 +192,7 @@ test('deleting a record & confirming', function(assert) { andThen(function() {}); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(1), '2', 'Nyan', '3', '', '', ''); assert.equal(confirmCount, 1); window.confirm = oldConfirm; @@ -200,7 +200,7 @@ test('deleting a record & confirming', function(assert) { }); test('deleting a record & not confirming', function(assert) { - const oldConfirm = window.confirm; + let oldConfirm = window.confirm; window.confirm = function() { return false; }; @@ -230,7 +230,7 @@ test('canceling edit', function(assert) { }); test('canceling new', function(assert) { - const oldConfirm = window.confirm; + let oldConfirm = window.confirm; window.confirm = function() { return true; }; @@ -247,7 +247,7 @@ test('canceling new', function(assert) { }); test('excluding models', function(assert) { - const adminSettings = App.__container__.lookup('service:admin'); + let adminSettings = App.__container__.lookup('service:admin'); adminSettings.set('excludedModels', ['cat']); visit('/admin'); @@ -259,7 +259,7 @@ test('excluding models', function(assert) { }); test('including models', function(assert) { - const adminSettings = App.__container__.lookup('service:admin'); + let adminSettings = App.__container__.lookup('service:admin'); adminSettings.set('includedModels', ['dog']); visit('/admin'); @@ -271,7 +271,7 @@ test('including models', function(assert) { }); test('including & excluding model', function(assert) { - const adminSettings = App.__container__.lookup('service:admin'); + let adminSettings = App.__container__.lookup('service:admin'); adminSettings.set('includedModels', ['cat', 'dog']); adminSettings.set('excludedModels', ['cat']); @@ -285,7 +285,7 @@ test('including & excluding model', function(assert) { }); test('including model columns', function(assert) { - const adminSettings = App.__container__.lookup('service:admin'); + let adminSettings = App.__container__.lookup('service:admin'); adminSettings.set('includedColumns', { 'cat': ['name'] }); @@ -293,7 +293,7 @@ test('including model columns', function(assert) { visit('/admin/cat'); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(0), 'id', 'name'); rowValuesEqual(assert, rows.eq(1), '1', 'Felix'); rowValuesEqual(assert, rows.eq(2), '2', 'Nyan'); @@ -302,7 +302,7 @@ test('including model columns', function(assert) { }); andThen(function() { - const inputs = find('input[type="text"]:not([placeholder="Filter"])'); + let inputs = find('input[type="text"]:not([placeholder="Filter"])'); inputPropertiesEqual(assert, inputs, 'name'); adminSettings.set('includedColumns', null); @@ -310,7 +310,7 @@ test('including model columns', function(assert) { }); test('excluding model columns', function(assert) { - const adminSettings = App.__container__.lookup('service:admin'); + let adminSettings = App.__container__.lookup('service:admin'); adminSettings.set('excludedColumns', { 'cat': ['name'] }); @@ -318,7 +318,7 @@ test('excluding model columns', function(assert) { visit('/admin/cat'); andThen(function() { - const rows = find('.cat table tr'); + let rows = find('.cat table tr'); rowValuesEqual(assert, rows.eq(0), 'id', 'age', 'foo', 'bar', 'baz'); rowValuesEqual(assert, rows.eq(1), '1', '10', '', '', ''); rowValuesEqual(assert, rows.eq(2), '2', '3', '', '', ''); @@ -327,7 +327,7 @@ test('excluding model columns', function(assert) { }); andThen(function() { - const inputs = find('input[type="text"]:not([placeholder="Filter"])'); + let inputs = find('input[type="text"]:not([placeholder="Filter"])'); inputPropertiesEqual(assert, inputs, 'age', 'foo', 'bar', 'baz'); adminSettings.set('excludedColumns', null); @@ -363,13 +363,13 @@ module('Acceptance: Admin Relationships', { return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ cats: [], owners: [], toys: [] })]; }); this.get('/admin/cats/1', function() { - const cats = [ + let cats = [ { id: 1, name: 'Felix', age: 10, owner: 1, toys: [1,2] } ]; - const owners = [ + let owners = [ { id: 1, name: 'Pat Sullivan', cats: [1] } ]; - const toys = [ + let toys = [ { id: 1, name: 'Ball', cat: 1 }, { id: 2, name: 'Mouse', cat: 1 } ]; @@ -379,10 +379,10 @@ module('Acceptance: Admin Relationships', { return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ birds: [], toys: [] })]; }); this.get('/admin/birds/1', function() { - const birds = [ + let birds = [ { id: 1, name: 'Boomer', toys: [3] } ]; - const toys = [ + let toys = [ { id: 3, name: 'Duck', bird: 1 } ]; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ birds, toys })]; @@ -393,12 +393,12 @@ module('Acceptance: Admin Relationships', { return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ toys: [toy] })]; }); this.post('/admin/courses', function(request) { - const { course } = JSON.parse(request.requestBody); + let { course } = JSON.parse(request.requestBody); course.id = 3; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ courses: [course] })]; }); this.get('/admin/toys', function() { - const toys = [ + let toys = [ { id: 1, name: 'Ball', cat: 1 }, { id: 2, name: 'Mouse', cat: 1 } ]; @@ -415,10 +415,10 @@ module('Acceptance: Admin Relationships', { return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ courses: [] })]; }); this.get('/admin/owners/1', function() { - const owners = [ + let owners = [ { id: 1, name: 'Brian', courses: [1] } ]; - const courses = [ + let courses = [ { id: 1, title: 'Teach Your Dog', owners: [1] } ]; return [200, { 'Content-Type': 'application/json' }, JSON.stringify({ owners, courses })]; @@ -436,11 +436,11 @@ test('should list relationships', function(assert) { visit('/admin/cat/1/edit'); andThen(function() { - const ownerRows = find('.owner table tr'); + let ownerRows = find('.owner table tr'); rowValuesEqual(assert, ownerRows.eq(0), 'id', 'name'); rowValuesEqual(assert, ownerRows.eq(1), '1', 'Pat Sullivan'); - const toyRows = find('.toy table tr'); + let toyRows = find('.toy table tr'); rowValuesEqual(assert, toyRows.eq(0), 'id', 'name'); rowValuesEqual(assert, toyRows.eq(1), '1', 'Ball'); rowValuesEqual(assert, toyRows.eq(2), '2', 'Mouse'); @@ -468,7 +468,7 @@ test('should create new model as a relationship to parent', function(assert) { }); andThen(function() { - const toyRows = find('.toy table tr'); + let toyRows = find('.toy table tr'); rowValuesEqual(assert, toyRows.eq(3), '3', 'Bell'); }); }); @@ -477,7 +477,7 @@ test('should not display "Create" if singular relationship model exists', functi visit('/admin/cat/1/edit'); andThen(function() { - const createLink = find('.owner a:contains("Create")'); + let createLink = find('.owner a:contains("Create")'); assert.equal(0, createLink.length, 'should not find the Create link'); }); }); @@ -486,9 +486,9 @@ test('should not display "Create" if no inverse relationship exists', function(a visit('/admin/bird/1/edit'); andThen(function() { - const toysTable = find('.toy'); + let toysTable = find('.toy'); assert.equal(1, toysTable.length, 'should find the toy relationship table'); - const createLink = find('.toy a:contains("Create")'); + let createLink = find('.toy a:contains("Create")'); assert.equal(0, createLink.length, 'should not find the Create link'); }); }); @@ -497,7 +497,7 @@ test('should properly create Many-to-Many relationship with inverse', function(a visit('/admin/owner/1/edit'); andThen(function() { - const coursesTable = find('.course'); + let coursesTable = find('.course'); assert.equal(1, coursesTable.length, 'should find the course relationship table'); click('.course a:contains("Create")'); }); diff --git a/tests/dummy/.jshintrc b/tests/dummy/.jshintrc deleted file mode 100644 index 7547475..0000000 --- a/tests/dummy/.jshintrc +++ /dev/null @@ -1,32 +0,0 @@ -{ - "predef": { - "document": true, - "window": true, - "-Promise": true - }, - "browser" : true, - "boss" : true, - "curly": true, - "debug": false, - "devel": true, - "eqeqeq": true, - "evil": true, - "forin": false, - "immed": false, - "laxbreak": false, - "newcap": true, - "noarg": true, - "noempty": false, - "nonew": false, - "nomen": false, - "onevar": false, - "plusplus": false, - "regexp": false, - "undef": true, - "sub": true, - "strict": false, - "white": false, - "eqnull": true, - "esnext": true, - "unused": true -} diff --git a/tests/dummy/app/app.js b/tests/dummy/app/app.js index 831ad61..df55202 100644 --- a/tests/dummy/app/app.js +++ b/tests/dummy/app/app.js @@ -3,11 +3,13 @@ import Resolver from './resolver'; import loadInitializers from 'ember-load-initializers'; import config from './config/environment'; +const { Application: EmberApplication } = Ember; + let App; Ember.MODEL_FACTORY_INJECTIONS = true; -App = Ember.Application.extend({ +App = EmberApplication.extend({ modulePrefix: config.modulePrefix, podModulePrefix: config.podModulePrefix, Resolver diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js index 6e6b8a1..0c4ed9e 100644 --- a/tests/dummy/app/router.js +++ b/tests/dummy/app/router.js @@ -2,8 +2,11 @@ import Ember from 'ember'; import config from './config/environment'; import adminRouter from 'ember-admin/router'; -let Router = Ember.Router.extend({ - location: config.locationType +const { Router: EmberRouter } = Ember; + +const Router = EmberRouter.extend({ + location: config.locationType, + rootURL: config.rootURL }); Router.map(function() { diff --git a/tests/helpers/destroy-app.js b/tests/helpers/destroy-app.js index c3d4d1a..b244f6d 100644 --- a/tests/helpers/destroy-app.js +++ b/tests/helpers/destroy-app.js @@ -1,5 +1,9 @@ import Ember from 'ember'; +const { + run +} = Ember; + export default function destroyApp(application) { - Ember.run(application, 'destroy'); + run(application, 'destroy'); } diff --git a/tests/helpers/equality-helpers.js b/tests/helpers/equality-helpers.js index b5b8811..56f57ed 100644 --- a/tests/helpers/equality-helpers.js +++ b/tests/helpers/equality-helpers.js @@ -1,8 +1,8 @@ export { rowValuesEqual, inputPropertiesEqual }; function rowValuesEqual(assert, row) { - const values = Array.prototype.slice.call(arguments, 2, arguments.length); - const columns = row.find('th, td'); + let values = Array.prototype.slice.call(arguments, 2, arguments.length); + let columns = row.find('th, td'); let columnText; assert.equal(columns.length, values.length, `expected ${values.length} columns: (${values.join(', ')})`); @@ -14,7 +14,7 @@ function rowValuesEqual(assert, row) { } function inputPropertiesEqual(assert, inputs) { - const values = Array.prototype.slice.call(arguments, 2, arguments.length); + let values = Array.prototype.slice.call(arguments, 2, arguments.length); let labelText; assert.equal(inputs.length, values.length, `expected ${values.length} inputs: (${values.join(', ')})`); diff --git a/tests/helpers/fill-in-by.js b/tests/helpers/fill-in-by.js index ef3020f..4eb3180 100644 --- a/tests/helpers/fill-in-by.js +++ b/tests/helpers/fill-in-by.js @@ -1,7 +1,7 @@ export { fillInByLabel, fillInByPlaceholder}; function fillInByLabel(text, value) { - const label = find(`label:contains("${text}")`); + let label = find(`label:contains("${text}")`); let input; if (label.prop('for')) { input = find(`#${label.prop('for')}`); @@ -12,7 +12,7 @@ function fillInByLabel(text, value) { } function fillInByPlaceholder(text, value) { - const input = find(`[placeholder="${text}"]`); + let input = find(`[placeholder="${text}"]`); return fillIn(input, value); } diff --git a/tests/helpers/module-for-acceptance.js b/tests/helpers/module-for-acceptance.js index 76996fd..c1184b8 100644 --- a/tests/helpers/module-for-acceptance.js +++ b/tests/helpers/module-for-acceptance.js @@ -11,12 +11,12 @@ export default function(name, options = {}) { this.application = startApp(); if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); + return options.beforeEach.call(this, ...arguments); } }, afterEach() { - let afterEach = options.afterEach && options.afterEach.apply(this, arguments); + let afterEach = options.afterEach && options.afterEach.call(this, ...arguments); return Promise.resolve(afterEach).then(() => destroyApp(this.application)); } }); diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index e098f1d..2fafac4 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -2,13 +2,18 @@ import Ember from 'ember'; import Application from '../../app'; import config from '../../config/environment'; +const { + merge, + run +} = Ember; + export default function startApp(attrs) { let application; - let attributes = Ember.merge({}, config.APP); - attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + let attributes = merge({}, config.APP); + attributes = merge(attributes, attrs); // use defaults, but you can override; - Ember.run(() => { + run(() => { application = Application.create(attributes); application.setupForTesting(); application.injectTestHelpers(); diff --git a/tests/unit/admin-store-test.js b/tests/unit/admin-store-test.js index c94183e..489d1bd 100644 --- a/tests/unit/admin-store-test.js +++ b/tests/unit/admin-store-test.js @@ -1,6 +1,6 @@ import Ember from 'ember'; import { moduleFor, test } from 'ember-qunit'; -import DS from 'ember-data'; +import RESTAdapter from 'ember-data/adapters/rest'; let adminService; @@ -18,35 +18,35 @@ moduleFor('ember-admin@store:admin', 'Unit | Store | admin', { }); test('defaults to "api" namespace', function(assert) { - const adapter = this.subject().adapterFor('dog'); + let adapter = this.subject().adapterFor('dog'); assert.equal(adapter.namespace, 'admin'); }); test('appends ember-admin\'s namespace to the end of the adapter namespaces', function(assert) { set(this.subject(), 'lookupAdapter', function() { - return DS.RESTAdapter.create({ namespace: 'api/v1' }); + return RESTAdapter.create({ namespace: 'api/v1' }); }); - const adapter = this.subject().adapterFor('dog'); + let adapter = this.subject().adapterFor('dog'); assert.equal(adapter.namespace, 'api/v1/admin'); }); test('allow overriding of default namespace', function(assert) { adminService.namespace = 'hobbes'; - const adapter = this.subject().adapterFor('dog'); + let adapter = this.subject().adapterFor('dog'); assert.equal(adapter.namespace, 'hobbes'); }); test('allow `null` namespace', function(assert) { adminService.namespace = undefined; - const adapter = this.subject().adapterFor('dog'); + let adapter = this.subject().adapterFor('dog'); assert.equal(adapter.namespace, undefined); }); test('empty admin namespace does not add tralining slash to adapter namespace', function(assert) { set(this.subject(), 'lookupAdapter', function() { - return DS.RESTAdapter.create({ namespace: 'api/v1' }); + return RESTAdapter.create({ namespace: 'api/v1' }); }); adminService.namespace = ''; - const adapter = this.subject().adapterFor('dog'); + let adapter = this.subject().adapterFor('dog'); assert.equal(adapter.namespace, 'api/v1'); }); From 4bb4e5851851616b74b5e713bf0647769848291f Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Tue, 9 Aug 2016 16:28:11 +0200 Subject: [PATCH 3/5] Configure Ember Try to run scenarios in one go --- .travis.yml | 18 ++---------------- config/ember-try.js | 33 +++++++++++++++++++-------------- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/.travis.yml b/.travis.yml index 68b59ab..3e12d16 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ --- language: node_js node_js: - - "4" + - "stable" sudo: false @@ -9,18 +9,6 @@ cache: directories: - node_modules -env: - - EMBER_TRY_SCENARIO=default - - EMBER_TRY_SCENARIO=ember-1.13 - - EMBER_TRY_SCENARIO=ember-release - - EMBER_TRY_SCENARIO=ember-beta - - EMBER_TRY_SCENARIO=ember-canary - -matrix: - fast_finish: true - allow_failures: - - env: EMBER_TRY_SCENARIO=ember-canary - before_install: - npm config set spin false - npm install -g bower @@ -33,6 +21,4 @@ install: - bower install script: - # Usually, it's ok to finish the test scenario without reverting - # to the addon's original dependency state, skipping "cleanup". - - ember try:one $EMBER_TRY_SCENARIO test --skip-cleanup + - npm test diff --git a/config/ember-try.js b/config/ember-try.js index da1933b..c956c14 100644 --- a/config/ember-try.js +++ b/config/ember-try.js @@ -2,52 +2,57 @@ module.exports = { scenarios: [ { - name: 'default', + name: 'ember-lts', bower: { - dependencies: { } + dependencies: { + "ember": "~2.4.0" + } } }, { - name: 'ember-2.5.0', + name: 'ember-latest', bower: { dependencies: { - 'ember': '~2.5.0' + "ember": "release" }, resolutions: { - 'ember': '~2.5.0' + "ember": "release" } } }, { - name: 'ember-release', + name: 'ember-beta', + allowedToFail: true, bower: { dependencies: { - 'ember': 'components/ember#release' + "ember": "beta" }, resolutions: { - 'ember': 'release' + "ember": "beta" } } }, { - name: 'ember-beta', + name: 'ember-canary', + allowedToFail: true, bower: { dependencies: { - 'ember': 'components/ember#beta' + "ember": "canary" }, resolutions: { - 'ember': 'beta' + "ember": "canary" } } }, { - name: 'ember-canary', + name: 'ember-alpha', + allowedToFail: true, bower: { dependencies: { - 'ember': 'components/ember#canary' + "ember": "alpha" }, resolutions: { - 'ember': 'canary' + "ember": "alpha" } } } From 85c751ba56e77a33d090d516c96fc243192278fb Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Tue, 9 Aug 2016 16:53:34 +0200 Subject: [PATCH 4/5] Fix finding layout with Ember 2.9-alpha --- addon/components/model-records-table.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/addon/components/model-records-table.js b/addon/components/model-records-table.js index cd9b591..30adbee 100644 --- a/addon/components/model-records-table.js +++ b/addon/components/model-records-table.js @@ -3,6 +3,7 @@ import ColumnsMixin from 'ember-admin/mixins/model-records/columns'; const { get, + set, isBlank, isNone, computed, @@ -12,14 +13,17 @@ const { export default Component.extend(ColumnsMixin, { includedColumns: ['id'], - layout: computed(function() { + didReceiveAttrs() { + this._super(...arguments); + + let owner = getOwner(this); let templatePath = `admin/index/${get(this, 'recordType')}`; - if (!getOwner(this).lookup(`template:${templatePath}`)) { + if (!owner.resolveRegistration(`template:${templatePath}`)) { templatePath = 'admin/index/default'; } - return getOwner(this).lookup(`template:${templatePath}`); - }), + set(this, 'layout', owner.resolveRegistration(`template:${templatePath}`)); + }, filteredRecords: computed('records', 'filter', function() { if (isBlank(get(this, 'filter'))) { return get(this, 'records'); From 47f48509090bee59884086c62c5f6f0cbaa1f02b Mon Sep 17 00:00:00 2001 From: Marten Schilstra Date: Tue, 9 Aug 2016 16:58:10 +0200 Subject: [PATCH 5/5] Test with Chrome --- .travis.yml | 14 +++++++------- testem.js | 3 +-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e12d16..f52bef4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,21 +3,21 @@ language: node_js node_js: - "stable" -sudo: false +sudo: required +dist: trusty cache: directories: - node_modules before_install: - - npm config set spin false - - npm install -g bower - - bower --version - - npm install phantomjs-prebuilt - - phantomjs --version + - "export DISPLAY=:99.0" + - "sh -e /etc/init.d/xvfb start" + - "npm config set progress false" install: - - npm install + - npm install -g bower + - npm install --no-optional - bower install script: diff --git a/testem.js b/testem.js index 26044b2..cf056bd 100644 --- a/testem.js +++ b/testem.js @@ -4,10 +4,9 @@ module.exports = { "test_page": "tests/index.html?hidepassed", "disable_watching": true, "launch_in_ci": [ - "PhantomJS" + "Chrome" ], "launch_in_dev": [ - "PhantomJS", "Chrome" ] };