From e1bef8e0aa919554552d4433b3b222d9bff51bc8 Mon Sep 17 00:00:00 2001 From: Mike North Date: Wed, 20 May 2015 18:13:22 -0700 Subject: [PATCH 1/3] Ember-cli 0.2.5 --- .editorconfig | 1 + .npmignore | 2 + .travis.yml | 16 ++++++- addon/mixins/route.js | 2 +- bower.json | 16 +++---- config/ember-try.js | 47 +++++++++++++++++++ package.json | 35 +++++++------- testem.json | 1 + .../infinity-route-with-meta-test.js | 12 ++--- tests/dummy/app/styles/app.css | 3 ++ tests/dummy/public/crossdomain.xml | 18 +++---- tests/dummy/public/robots.txt | 1 + tests/unit/mixins/route-test.js | 4 +- 13 files changed, 116 insertions(+), 42 deletions(-) create mode 100644 config/ember-try.js diff --git a/.editorconfig b/.editorconfig index 2fe4874a..47c54384 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,6 +18,7 @@ indent_style = space indent_size = 2 [*.hbs] +insert_final_newline = false indent_style = space indent_size = 2 diff --git a/.npmignore b/.npmignore index 0533b918..49996f5a 100644 --- a/.npmignore +++ b/.npmignore @@ -1,5 +1,7 @@ bower_components/ tests/ +tmp/ +dist/ .bowerrc .editorconfig diff --git a/.travis.yml b/.travis.yml index cf23938b..6f884725 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ --- language: node_js +node_js: + - "0.12" sudo: false @@ -7,7 +9,19 @@ cache: directories: - node_modules +env: + - EMBER_TRY_SCENARIO=default + - EMBER_TRY_SCENARIO=ember-1.10 + - EMBER_TRY_SCENARIO=ember-1.11 + - EMBER_TRY_SCENARIO=ember-release + - EMBER_TRY_SCENARIO=ember-beta + - EMBER_TRY_SCENARIO=ember-canary + +matrix: + fast_finish: true + before_install: + - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH - "npm config set spin false" - "npm install -g npm@^2" @@ -17,4 +31,4 @@ install: - bower install script: - - npm test + - ember try $EMBER_TRY_SCENARIO test diff --git a/addon/mixins/route.js b/addon/mixins/route.js index c443ec44..9431bfa8 100644 --- a/addon/mixins/route.js +++ b/addon/mixins/route.js @@ -92,7 +92,7 @@ export default Ember.Mixin.create({ infinityModel: function(modelName, options) { var _this = this; - if (this.store === undefined){ + if (Ember.isEmpty(this.store) || Ember.isEmpty(this.store.find)){ throw new Ember.Error("Ember Data store is not available to infinityModel"); } else if (modelName === undefined) { throw new Ember.Error("You must pass a Model Name to infinityModel"); diff --git a/bower.json b/bower.json index b0b0c8f1..5a4ecd29 100644 --- a/bower.json +++ b/bower.json @@ -1,17 +1,17 @@ { "name": "ember-infinity", "dependencies": { - "jquery": "^1.11.1", "ember": "1.10.0", - "ember-data": "1.0.0-beta.15", - "ember-resolver": "~0.1.12", - "loader.js": "ember-cli/loader.js#3.2.0", "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3", "ember-cli-test-loader": "ember-cli-test-loader#0.1.3", - "ember-load-initializers": "ember-cli/ember-load-initializers#0.0.2", - "ember-qunit": "0.2.8", + "ember-data": "1.0.0-beta.17", + "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.4", + "ember-qunit": "0.3.3", "ember-qunit-notifications": "0.0.7", - "qunit": "~1.17.1", - "pretender": "0.1.0" + "ember-resolver": "~0.1.15", + "jquery": "^1.11.1", + "loader.js": "ember-cli/loader.js#3.2.0", + "pretender": "0.6.0", + "qunit": "~1.17.1" } } diff --git a/config/ember-try.js b/config/ember-try.js new file mode 100644 index 00000000..009c2403 --- /dev/null +++ b/config/ember-try.js @@ -0,0 +1,47 @@ +module.exports = { + scenarios: [ + { + name: 'default', + dependencies: {} + }, + { + name: 'ember-1.10', + dependencies: { + 'ember': '~1.10.0' + } + }, + { + name: 'ember-1.11', + dependencies: { + 'ember': '~1.11.3' + } + }, + { + name: 'ember-release', + dependencies: { + 'ember': 'components/ember#release' + }, + resolutions: { + 'ember': 'release' + } + }, + { + name: 'ember-beta', + dependencies: { + 'ember': 'components/ember#beta' + }, + resolutions: { + 'ember': 'beta' + } + }, + { + name: 'ember-canary', + dependencies: { + 'ember': 'components/ember#canary' + }, + resolutions: { + 'ember': 'canary' + } + } + ] +}; diff --git a/package.json b/package.json index fcfb3708..0f09f335 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "start": "ember server", "build": "ember build", - "test": "ember test" + "test": "ember try:testall" }, "repository": "https://github.com/hhff/ember-infinity", "engines": { @@ -17,28 +17,31 @@ }, "author": "Hugh Francis", "license": "MIT", - "dependencies": { - "ember-cli-htmlbars": "0.7.4", - "ember-cli-version-checker": "^1.0.2" - }, "devDependencies": { - "broccoli-asset-rev": "^2.0.0", - "ember-cli": "0.2.0", - "ember-cli-app-version": "0.3.2", - "ember-cli-babel": "^4.0.0", - "ember-cli-content-security-policy": "0.3.0", - "ember-cli-dependency-checker": "0.0.8", + "broccoli-asset-rev": "^2.0.2", + "ember-cli": "0.2.5", + "ember-cli-app-version": "0.3.3", + "ember-cli-content-security-policy": "0.4.0", + "ember-cli-dependency-checker": "^1.0.0", "ember-cli-ic-ajax": "0.1.1", "ember-cli-inject-live-reload": "^1.3.0", - "ember-cli-pretender": "0.3.1", - "ember-cli-qunit": "0.3.9", - "ember-cli-uglify": "1.0.1", - "ember-data": "1.0.0-beta.15", - "ember-export-application-global": "^1.0.2" + "ember-cli-pretender": "0.3.2", + "ember-cli-qunit": "0.3.13", + "ember-cli-version-checker": "^1.0.2", + "ember-cli-uglify": "^1.0.1", + "ember-data": "1.0.0-beta.17", + "ember-disable-proxy-controllers": "^0.7.0", + "ember-export-application-global": "^1.0.2", + "ember-disable-prototype-extensions": "^1.0.0", + "ember-try": "0.0.5" }, "keywords": [ "ember-addon" ], + "dependencies": { + "ember-cli-babel": "^5.0.0", + "ember-cli-htmlbars": "0.7.6" + }, "ember-addon": { "configPath": "tests/dummy/config" } diff --git a/testem.json b/testem.json index 42a4ddb2..0f35392c 100644 --- a/testem.json +++ b/testem.json @@ -1,6 +1,7 @@ { "framework": "qunit", "test_page": "tests/index.html?hidepassed", + "disable_watching": true, "launch_in_ci": [ "PhantomJS" ], diff --git a/tests/acceptance/infinity-route-with-meta-test.js b/tests/acceptance/infinity-route-with-meta-test.js index b7c81672..1f9e0c52 100644 --- a/tests/acceptance/infinity-route-with-meta-test.js +++ b/tests/acceptance/infinity-route-with-meta-test.js @@ -28,8 +28,8 @@ module('Acceptance: Infinity Route', { } else { subset = posts; } - perPage = parseInt(request.queryParams.per_page); - startPage = parseInt(request.queryParams.page); + perPage = parseInt(request.queryParams.per_page, 10); + startPage = parseInt(request.queryParams.page, 10); var pageCount = Math.ceil(subset.length / perPage); offset = perPage * (startPage - 1); @@ -69,9 +69,9 @@ test('it works with parameters', function(assert) { var postList = find('ul'); var infinityLoader = find('.infinity-loader'); - assert.equal(postsTitle.text(), "Listing Posts using Parameters"); - assert.equal(postList.find('li').length, 2); - assert.equal(postList.find('li:first-child').text(), "Squarepusher"); - assert.equal(infinityLoader.hasClass('reached-infinity'), false); + assert.equal(postsTitle.text(), "Listing Posts using Parameters", "Post title text is correct"); + assert.equal(postList.find('li').length, 2, "Two items should be in the list"); + assert.equal(postList.find('li:first-child').text(), "Squarepusher", "First item should be 'Squarepusher'"); + assert.equal(infinityLoader.hasClass('reached-infinity'), false, "Infinity should not yet have been reached"); }); }); diff --git a/tests/dummy/app/styles/app.css b/tests/dummy/app/styles/app.css index e69de29b..6d934965 100644 --- a/tests/dummy/app/styles/app.css +++ b/tests/dummy/app/styles/app.css @@ -0,0 +1,3 @@ +ul li { + height: 500px; +} diff --git a/tests/dummy/public/crossdomain.xml b/tests/dummy/public/crossdomain.xml index 29a035d7..0c16a7a0 100644 --- a/tests/dummy/public/crossdomain.xml +++ b/tests/dummy/public/crossdomain.xml @@ -1,15 +1,15 @@ - + - - + + - - + + diff --git a/tests/dummy/public/robots.txt b/tests/dummy/public/robots.txt index 5debfa4d..f5916452 100644 --- a/tests/dummy/public/robots.txt +++ b/tests/dummy/public/robots.txt @@ -1,2 +1,3 @@ # http://www.robotstxt.org User-agent: * +Disallow: diff --git a/tests/unit/mixins/route-test.js b/tests/unit/mixins/route-test.js index 9b9f8900..6816f7c7 100644 --- a/tests/unit/mixins/route-test.js +++ b/tests/unit/mixins/route-test.js @@ -36,7 +36,9 @@ test('it can not use infinityModel without a Model Name', function(assert) { } }); var route = RouteObject.create(); - route.store = {}; + route.store = { + find() {} + }; var infinityError; try { From 7f100484772ee36bf2989669b363dcef6e3f4c84 Mon Sep 17 00:00:00 2001 From: Mike North Date: Wed, 20 May 2015 18:16:00 -0700 Subject: [PATCH 2/3] Allow customization of pagination API params --- .travis.yml | 2 + README.md | 63 ++++++++++++++++++++++++++++---- addon/mixins/route.js | 36 ++++++++++++++++-- tests/unit/mixins/route-test.js | 65 +++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6f884725..1ec00a2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,8 @@ env: matrix: fast_finish: true + allow_failures: + - env: EMBER_TRY_SCENARIO=ember-canary before_install: - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH diff --git a/README.md b/README.md index 854ebdb5..2f53a142 100644 --- a/README.md +++ b/README.md @@ -43,18 +43,67 @@ Now, whenever the `infinity-loader` is in view, it will send an action to the ro When the new records are loaded, they will automatically be pushed into the Model array. -#### JSON Response +## Advanced Usage + +### JSON Request/Response Customization + +By default, ember-infinity will send pagination parameters as part of a GET request as follows + +```` +/items?per_page=5&page=1 +```` -The response provided by your server should include the number of total pages. +and will expect to recieve metadata in the response payload via a `total_pages` param in a `meta` object -```json - { "meta": { "total_pages": 4 } } +```js +{ + items: [ + {id: 1, name: 'Test'}, + {id: 2, name: 'Test 2'} + ], + meta: { + total_pages: 3 + } +} ``` -If your query returns 20 objects, and you're showing 6 per page, then the -number of total pages would be 4. +If you wish to customize some aspects of the JSON contract for pagination, you may do so via your routes. For example: -## Advanced Usage +```js +import Ember from 'ember'; +import InfinityRoute from "ember-infinity/mixins/route"; + +export default Ember.Route.extend(InfinityRoute, { + + perPageParam: "per", // instead of "per_page" + pageParam: "pg", // instead of "page" + totalPagesParam: "meta.total", // instead of "meta.total_pages" + + model() { + /* Load pages of the Product Model, starting from page 1, in groups of 12. */ + return this.infinityModel("product", { perPage: 12, startingPage: 1 }); + } +}); +``` + +This will result in request query params being sent out as follows + +```` +/items?per=5&pg=1 +```` + +and ember-infinity will be set up to parse the total number of pages from a JSON response like this: + +```js +{ + items: [ + ... + ], + meta: { + total: 3 + } +} +``` ### infinityModel diff --git a/addon/mixins/route.js b/addon/mixins/route.js index 9431bfa8..bd16301a 100644 --- a/addon/mixins/route.js +++ b/addon/mixins/route.js @@ -68,6 +68,30 @@ export default Ember.Mixin.create({ */ _modelPath: 'controller.model', + /** + * Name of the "per page" param in the + * resource request payload + * @type {String} + * @default "per_page" + */ + perPageParam: 'per_page', + + /** + * Name of the "page" param in the + * resource request payload + * @type {String} + * @default "page" + */ + pageParam: 'page', + + /** + * Path of the "total pages" param in + * the HTTP response + * @type {String} + * @default "meta.total_pages" + */ + totalPagesParam: 'meta.total_pages', + /** @private @property _canLoadMore @@ -113,18 +137,22 @@ export default Ember.Mixin.create({ this.set('_modelPath', modelPath); this.set('_extraParams', options); - var params = Ember.merge({ page: startingPage, per_page: perPage }, options); + var requestPayloadBase = {}; + requestPayloadBase[this.get('perPageParam')] = perPage; + requestPayloadBase[this.get('pageParam')] = startingPage; + + var params = Ember.merge(requestPayloadBase, options); var promise = this.store.find(modelName, params); promise.then( - function(infinityModel) { - var totalPages = infinityModel.get('meta.total_pages'); + infinityModel => { + var totalPages = infinityModel.get(this.get('totalPagesParam')); _this.set('_currentPage', startingPage); _this.set('_totalPages', totalPages); infinityModel.set('reachedInfinity', !_this.get('_canLoadMore')); Ember.run.scheduleOnce('afterRender', _this, 'infinityModelUpdated', { lastPageLoaded: startingPage, totalPages: totalPages, newObjects: infinityModel }); }, - function() { + () => { throw new Ember.Error("Could not fetch Infinity Model. Please check your serverside configuration."); } ); diff --git a/tests/unit/mixins/route-test.js b/tests/unit/mixins/route-test.js index 6816f7c7..9b7e50ba 100644 --- a/tests/unit/mixins/route-test.js +++ b/tests/unit/mixins/route-test.js @@ -89,6 +89,71 @@ test('it sets state before it reaches the end', function(assert) { assert.ok(!model.get('reachedInfinity'), 'Should not reach infinity'); }); +test('it allows customizations of request params', assert => { + var RouteObject = Ember.Route.extend(RouteMixin, { + perPageParam: 'per', + pageParam: 'p', + model() { + return this.infinityModel('item'); + } + }); + var route = RouteObject.create(); + + var dummyStore = { + find(modelType, findQuery) { + assert.deepEqual(findQuery, {per: 25, p: 1}); + return new Ember.RSVP.Promise(resolve => { + Ember.run(this, resolve, Ember.Object.create({ + items: [] + })); + }); + } + }; + + route.store = dummyStore; + + var model; + Ember.run(function() { + route.model().then(function(result) { + model = result; + }); + }); +}); + +test('it allows customizations of meta parsing params', assert => { + var RouteObject = Ember.Route.extend(RouteMixin, { + totalPagesParam: 'pagination.total', + model() { + return this.infinityModel('item'); + } + }); + var route = RouteObject.create(); + + var dummyStore = { + find(modelType, findQuery) { + return new Ember.RSVP.Promise(resolve => { + Ember.run(this, resolve, Ember.Object.create({ + items: [{id: 1, name: 'Walter White'}], + pagination: { + total: 22 + } + })); + }); + } + }; + + route.store = dummyStore; + + var model; + Ember.run(function() { + route.model().then(function(result) { + model = result; + }); + }); + + assert.equal(22, route.get('_totalPages')); +}); + test('it sets state when it reaches the end', function(assert) { var RouteObject = Ember.Route.extend(RouteMixin, { From 18f21451b83c8c971a07fad6b1efa7c97387b1d9 Mon Sep 17 00:00:00 2001 From: Mike North Date: Wed, 20 May 2015 18:19:39 -0700 Subject: [PATCH 3/3] Refactor to align with new ES6 language features --- addon/components/infinity-loader.js | 31 +++++----- addon/mixins/route.js | 49 +++++++++------- .../infinity-route-with-meta-test.js | 14 ++--- .../infinity-route-without-meta-test.js | 12 ++-- tests/dummy/app/routes/category.js | 2 +- tests/helpers/start-app.js | 2 +- tests/unit/mixins/route-test.js | 58 +++++++++---------- 7 files changed, 90 insertions(+), 78 deletions(-) diff --git a/addon/components/infinity-loader.js b/addon/components/infinity-loader.js index e32fa606..5929d5f9 100644 --- a/addon/components/infinity-loader.js +++ b/addon/components/infinity-loader.js @@ -14,43 +14,44 @@ export default Ember.Component.extend({ developmentMode: false, scrollable: null, - didInsertElement: function() { + didInsertElement() { + this._super(...arguments); this._setupScrollable(); this.set('guid', Ember.guidFor(this)); this._bindScroll(); this._checkIfInView(); }, - willDestroyElement: function() { + willDestroyElement() { + this._super(...arguments); this._unbindScroll(); }, - _bindScroll: function() { - var _this = this; - this.get("scrollable").on("scroll."+this.get('guid'), function() { - Ember.run.debounce(_this, _this._checkIfInView, _this.get('scrollDebounce')); + _bindScroll() { + this.get("scrollable").on(`scroll.${this.get('guid')}`, () => { + Ember.run.debounce(this, this._checkIfInView, this.get('scrollDebounce')); }); }, - _unbindScroll: function() { - this.get("scrollable").off("scroll."+this.get('guid')); + _unbindScroll() { + this.get("scrollable").off(`scroll.${this.get('guid')}`); }, - _checkIfInView: function() { + _checkIfInView() { var selfOffset = this.$().offset().top; var scrollable = this.get("scrollable"); var scrollableBottom = scrollable.height() + scrollable.scrollTop(); - var inView = selfOffset < scrollableBottom ? true : false; + var inView = selfOffset < scrollableBottom; if (inView && !this.get('developmentMode')) { this.sendAction('loadMoreAction'); } }, - _setupScrollable: function() { + _setupScrollable() { var scrollable = this.get('scrollable'); - if (Ember.$.type(scrollable) === 'string') { + if (Ember.typeOf(scrollable) === 'string') { var items = Ember.$(scrollable); if (items.length === 1) { this.set('scrollable', items.eq(0)); @@ -64,7 +65,9 @@ export default Ember.Component.extend({ } }, - loadedStatusDidChange: Ember.observer('infinityModel.reachedInfinity', 'destroyOnInfinity', function() { - if (this.get('infinityModel.reachedInfinity') && this.get('destroyOnInfinity')) { this.destroy(); } + loadedStatusDidChange: Ember.observer('infinityModel.reachedInfinity', 'destroyOnInfinity', function () { + if (this.get('infinityModel.reachedInfinity') && this.get('destroyOnInfinity')) { + this.destroy(); + } }) }); diff --git a/addon/mixins/route.js b/addon/mixins/route.js index bd16301a..bced854e 100644 --- a/addon/mixins/route.js +++ b/addon/mixins/route.js @@ -101,7 +101,7 @@ export default Ember.Mixin.create({ _canLoadMore: Ember.computed('_totalPages', '_currentPage', function() { var totalPages = this.get('_totalPages'); var currentPage = this.get('_currentPage'); - return totalPages && currentPage ? currentPage < totalPages : false; + return (totalPages && currentPage) ? (currentPage < totalPages) : false; }), /** @@ -113,8 +113,7 @@ export default Ember.Mixin.create({ @param {Object} options Optional, the perPage and startingPage to load from. @return {Ember.RSVP.Promise} */ - infinityModel: function(modelName, options) { - var _this = this; + infinityModel(modelName, options) { if (Ember.isEmpty(this.store) || Ember.isEmpty(this.store.find)){ throw new Ember.Error("Ember Data store is not available to infinityModel"); @@ -147,10 +146,14 @@ export default Ember.Mixin.create({ promise.then( infinityModel => { var totalPages = infinityModel.get(this.get('totalPagesParam')); - _this.set('_currentPage', startingPage); - _this.set('_totalPages', totalPages); - infinityModel.set('reachedInfinity', !_this.get('_canLoadMore')); - Ember.run.scheduleOnce('afterRender', _this, 'infinityModelUpdated', { lastPageLoaded: startingPage, totalPages: totalPages, newObjects: infinityModel }); + this.set('_currentPage', startingPage); + this.set('_totalPages', totalPages); + infinityModel.set('reachedInfinity', !this.get('_canLoadMore')); + Ember.run.scheduleOnce('afterRender', this, 'infinityModelUpdated', { + lastPageLoaded: startingPage, + totalPages: totalPages, + newObjects: infinityModel + }); }, () => { throw new Ember.Error("Could not fetch Infinity Model. Please check your serverside configuration."); @@ -166,8 +169,7 @@ export default Ember.Mixin.create({ @method infinityLoad @return {Boolean} */ - _infinityLoad: function() { - var _this = this; + _infinityLoad() { var nextPage = this.get('_currentPage') + 1; var perPage = this.get('_perPage'); var totalPages = this.get('_totalPages'); @@ -179,33 +181,40 @@ export default Ember.Mixin.create({ var params = Ember.merge({ page: nextPage, per_page: perPage }, this.get('_extraParams')); var promise = this.store.find(modelName, params); + promise.then( - function(infinityModel) { + infinityModel => { model.pushObjects(infinityModel.get('content')); - _this.set('_loadingMore', false); - _this.set('_currentPage', nextPage); - Ember.run.scheduleOnce('afterRender', _this, 'infinityModelUpdated', { lastPageLoaded: nextPage, totalPages: totalPages, newObjects: infinityModel }); - if (!_this.get('_canLoadMore')) { - _this.set(_this.get('_modelPath') + '.reachedInfinity', true); - Ember.run.scheduleOnce('afterRender', _this, 'infinityModelLoaded', { totalPages: totalPages }); + this.set('_loadingMore', false); + this.set('_currentPage', nextPage); + Ember.run.scheduleOnce('afterRender', this, 'infinityModelUpdated', { + lastPageLoaded: nextPage, + totalPages: totalPages, + newObjects: infinityModel + }); + if (!this.get('_canLoadMore')) { + this.set(this.get('_modelPath') + '.reachedInfinity', true); + Ember.run.scheduleOnce('afterRender', this, 'infinityModelLoaded', { + totalPages: totalPages + }); } }, - function() { - _this.set('_loadingMore', false); + () => { + this.set('_loadingMore', false); throw new Ember.Error("You must pass a Model Name to infinityModel"); } ); } else { if (!this.get('_canLoadMore')) { this.set(this.get('_modelPath') + '.reachedInfinity', true); - Ember.run.scheduleOnce('afterRender', _this, 'infinityModelLoaded', { totalPages: totalPages }); + Ember.run.scheduleOnce('afterRender', this, 'infinityModelLoaded', { totalPages: totalPages }); } } return false; }, actions: { - infinityLoad: function() { + infinityLoad() { this._infinityLoad(); } } diff --git a/tests/acceptance/infinity-route-with-meta-test.js b/tests/acceptance/infinity-route-with-meta-test.js index 1f9e0c52..e92076c5 100644 --- a/tests/acceptance/infinity-route-with-meta-test.js +++ b/tests/acceptance/infinity-route-with-meta-test.js @@ -15,14 +15,14 @@ var posts = [ ]; module('Acceptance: Infinity Route', { - setup: function() { + setup() { App = startApp(); server = new Pretender(function() { this.get('/posts', function(request) { var body, subset, perPage, startPage, offset; if (request.queryParams.category) { - subset = posts.filter(function(post) { + subset = posts.filter(post => { return post.category === request.queryParams.category; }); } else { @@ -41,16 +41,16 @@ module('Acceptance: Infinity Route', { }); }); }, - teardown: function() { + teardown() { Ember.run(App, 'destroy'); server.shutdown(); } }); -test('it works when meta is present in payload', function(assert) { +test('it works when meta is present in payload', assert => { visit('/'); - andThen(function() { + andThen(() => { var postsTitle = find('#posts-title'); var postList = find('ul'); var infinityLoader = find('.infinity-loader'); @@ -61,10 +61,10 @@ test('it works when meta is present in payload', function(assert) { }); }); -test('it works with parameters', function(assert) { +test('it works with parameters', assert => { visit('/category/a?per_page=2'); - andThen(function() { + andThen(() => { var postsTitle = find('#posts-title'); var postList = find('ul'); var infinityLoader = find('.infinity-loader'); diff --git a/tests/acceptance/infinity-route-without-meta-test.js b/tests/acceptance/infinity-route-without-meta-test.js index 2f7d2456..575ae455 100644 --- a/tests/acceptance/infinity-route-without-meta-test.js +++ b/tests/acceptance/infinity-route-without-meta-test.js @@ -6,28 +6,28 @@ import Pretender from 'pretender'; var App, server; module('Acceptance: Infinity Route', { - setup: function() { + setup() { App = startApp(); server = new Pretender(function() { - this.get('/posts', function(request) { + this.get('/posts', request => { var posts = [ { id: 1, name: "Squarepusher" }, { id: 2, name: "Aphex Twin" } ]; - return [200, {"Content-Type": "application/json"}, JSON.stringify({posts: posts})]; + return [200, {"Content-Type": "application/json"}, JSON.stringify({posts})]; }); }); }, - teardown: function() { + teardown() { Ember.run(App, 'destroy'); server.shutdown(); } }); -test('it works when meta is not present in payload', function(assert) { +test('it works when meta is not present in payload', assert => { visit('/'); - andThen(function() { + andThen(() => { var postsTitle = find('#posts-title'); var postList = find('ul'); var infinityLoader = find('.infinity-loader'); diff --git a/tests/dummy/app/routes/category.js b/tests/dummy/app/routes/category.js index 8b98bca6..c62536bf 100644 --- a/tests/dummy/app/routes/category.js +++ b/tests/dummy/app/routes/category.js @@ -2,7 +2,7 @@ import Ember from 'ember'; import InfinityRoute from 'ember-infinity/mixins/route'; export default Ember.Route.extend(InfinityRoute, { - model: function(params) { + model(params) { return this.infinityModel('post', { category: params.category, perPage: 2 }); } diff --git a/tests/helpers/start-app.js b/tests/helpers/start-app.js index 16cc7c39..e08b02d1 100644 --- a/tests/helpers/start-app.js +++ b/tests/helpers/start-app.js @@ -9,7 +9,7 @@ export default function startApp(attrs) { var attributes = Ember.merge({}, config.APP); attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; - Ember.run(function() { + Ember.run(() => { application = Application.create(attributes); application.setupForTesting(); application.injectTestHelpers(); diff --git a/tests/unit/mixins/route-test.js b/tests/unit/mixins/route-test.js index 9b7e50ba..4fe7305f 100644 --- a/tests/unit/mixins/route-test.js +++ b/tests/unit/mixins/route-test.js @@ -4,15 +4,15 @@ import { module, test } from 'qunit'; module('RouteMixin'); -test('it works', function(assert) { +test('it works', assert => { var RouteObject = Ember.Route.extend(RouteMixin); var route = RouteObject.create(); assert.ok(route); }); -test('it can not use infinityModel without Ember Data Store', function(assert) { +test('it can not use infinityModel without Ember Data Store', assert => { var RouteObject = Ember.Route.extend(RouteMixin, { - model: function() { + model() { return this.infinityModel('post'); } }); @@ -29,9 +29,9 @@ test('it can not use infinityModel without Ember Data Store', function(assert) { assert.equal(infinityError.message, "Ember Data store is not available to infinityModel"); }); -test('it can not use infinityModel without a Model Name', function(assert) { +test('it can not use infinityModel without a Model Name', assert => { var RouteObject = Ember.Route.extend(RouteMixin, { - model: function() { + model() { return this.infinityModel(); } }); @@ -51,18 +51,18 @@ test('it can not use infinityModel without a Model Name', function(assert) { assert.equal(infinityError.message, "You must pass a Model Name to infinityModel"); }); -test('it sets state before it reaches the end', function(assert) { +test('it sets state before it reaches the end', assert => { var RouteObject = Ember.Route.extend(RouteMixin, { - model: function() { + model() { return this.infinityModel('item'); } }); var route = RouteObject.create(); var dummyStore = { - find: function() { - return new Ember.RSVP.Promise(function(resolve) { + find() { + return new Ember.RSVP.Promise(resolve => { Ember.run(this, resolve, Ember.Object.create({ items: [{id: 1, name: 'Test'}], meta: { @@ -76,8 +76,8 @@ test('it sets state before it reaches the end', function(assert) { route.store = dummyStore; var model; - Ember.run(function() { - route.model().then(function(result) { + Ember.run(() => { + route.model().then(result => { model = result; }); }); @@ -113,8 +113,8 @@ test('it allows customizations of request params', assert => { route.store = dummyStore; var model; - Ember.run(function() { - route.model().then(function(result) { + Ember.run(() => { + route.model().then(result => { model = result; }); }); @@ -145,8 +145,8 @@ test('it allows customizations of meta parsing params', assert => { route.store = dummyStore; var model; - Ember.run(function() { - route.model().then(function(result) { + Ember.run(() => { + route.model().then(result => { model = result; }); }); @@ -154,18 +154,18 @@ test('it allows customizations of meta parsing params', assert => { assert.equal(22, route.get('_totalPages')); }); -test('it sets state when it reaches the end', function(assert) { +test('it sets state when it reaches the end', assert => { var RouteObject = Ember.Route.extend(RouteMixin, { - model: function() { + model() { return this.infinityModel('item', {startingPage: 31}); } }); var route = RouteObject.create(); var dummyStore = { - find: function() { - return new Ember.RSVP.Promise(function(resolve) { + find() { + return new Ember.RSVP.Promise(resolve => { Ember.run(this, resolve, Ember.Object.create({ items: [{id: 1, name: 'Test'}], meta: { @@ -179,8 +179,8 @@ test('it sets state when it reaches the end', function(assert) { route.store = dummyStore; var model; - Ember.run(function() { - route.model().then(function(result) { + Ember.run(() => { + route.model().then(result => { model = result; }); }); @@ -192,21 +192,21 @@ test('it sets state when it reaches the end', function(assert) { assert.ok(model.get('reachedInfinity'), 'Should reach infinity'); }); -test('it uses extra params when loading more data', function(assert) { +test('it uses extra params when loading more data', assert => { assert.expect(8); var RouteObject = Ember.Route.extend(RouteMixin, { - model: function() { + model() { return this.infinityModel('item', {extra: 'param'}); } }); var route = RouteObject.create(); var dummyStore = { - find: function(name, params) { + find(name, params) { assert.equal('param', params.extra); - return new Ember.RSVP.Promise(function(resolve) { + return new Ember.RSVP.Promise(resolve => { Ember.run(this, resolve, Ember.Object.create({ items: [{id: 1, name: 'Test'}], pushObjects: Ember.K, @@ -221,8 +221,8 @@ test('it uses extra params when loading more data', function(assert) { route.store = dummyStore; var model; - Ember.run(function() { - route.model().then(function(result) { + Ember.run(() => { + route.model().then(result => { model = result; }); }); @@ -230,7 +230,7 @@ test('it uses extra params when loading more data', function(assert) { // The controller needs to be set so _infinityLoad() can call // pushObjects() var dummyController = Ember.Object.create({ - model: model + model }); route.set('controller', dummyController); @@ -238,7 +238,7 @@ test('it uses extra params when loading more data', function(assert) { assert.equal(true, route.get('_canLoadMore')); // Load more - Ember.run(function() { + Ember.run(() => { route._infinityLoad(); });