Bump dependencies (#826)

no issue
- rollup of minor dependency updates
- bump yarn.lock sub-dependencies
- remove deprecated use of `testSelector`
This commit is contained in:
Kevin Ansfield 2017-08-11 16:28:05 +01:00 committed by GitHub
parent ac85d18d25
commit b3d1474f40
16 changed files with 1381 additions and 1224 deletions

View File

@ -26,9 +26,9 @@
"node": ">= 4"
},
"devDependencies": {
"@html-next/vertical-collection": "^1.0.0-beta.4",
"autoprefixer": "6.7.7",
"blueimp-md5": "2.7.0",
"@html-next/vertical-collection": "1.0.0-beta.4",
"autoprefixer": "7.1.2",
"blueimp-md5": "2.8.0",
"bower": "1.8.0",
"broccoli-asset-rev": "2.5.0",
"broccoli-clean-css": "^2.0.1",
@ -37,37 +37,37 @@
"broccoli-merge-trees": "2.0.0",
"broccoli-uglify-js": "0.2.0",
"chai-jquery": "2.0.0",
"codemirror": "5.25.2",
"codemirror": "5.28.0",
"coveralls": "2.13.1",
"csscomb": "4.0.1",
"csscomb": "4.2.0",
"cssnano": "3.10.0",
"ember-ajax": "2.5.6",
"ember-browserify": "1.1.13",
"ember-cli": "2.14.1",
"ember-browserify": "1.2.0",
"ember-cli": "2.14.2",
"ember-cli-active-link-wrapper": "0.3.2",
"ember-cli-app-version": "3.0.0",
"ember-cli-babel": "6.6.0",
"ember-cli-chai": "0.4.0",
"ember-cli-code-coverage": "0.3.12",
"ember-cli-dependency-checker": "1.4.0",
"ember-cli-babel": "6.7.2",
"ember-cli-chai": "0.4.2",
"ember-cli-code-coverage": "0.4.1",
"ember-cli-dependency-checker": "2.0.1",
"ember-cli-eslint": "3.1.0",
"ember-cli-htmlbars": "2.0.3",
"ember-cli-htmlbars-inline-precompile": "0.4.4",
"ember-cli-htmlbars-inline-precompile": "1.0.2",
"ember-cli-inject-live-reload": "1.7.0",
"ember-cli-mirage": "0.2.8",
"ember-cli-mocha": "0.14.3",
"ember-cli-mocha": "0.14.4",
"ember-cli-moment-shim": "3.1.0",
"ember-cli-node-assets": "0.2.2",
"ember-cli-postcss": "3.2.0",
"ember-cli-postcss": "3.5.0",
"ember-cli-pretender": "1.0.1",
"ember-cli-selectize": "0.5.12",
"ember-cli-shims": "1.1.0",
"ember-cli-string-helpers": "1.4.0",
"ember-cli-test-loader": "2.1.0",
"ember-cli-uglify": "1.2.0",
"ember-composable-helpers": "2.0.1",
"ember-concurrency": "0.8.3",
"ember-data": "2.14.9",
"ember-composable-helpers": "2.0.3",
"ember-concurrency": "0.8.7",
"ember-data": "2.14.10",
"ember-data-filter": "1.13.0",
"ember-element-resize-detector": "0.1.5",
"ember-export-application-global": "2.0.0",
@ -75,35 +75,35 @@
"ember-inline-svg": "0.1.11",
"ember-invoke-action": "1.4.0",
"ember-light-table": "1.8.6",
"ember-load": "0.0.11",
"ember-load": "0.0.12",
"ember-load-initializers": "1.0.0",
"ember-native-dom-helpers": "0.4.0",
"ember-one-way-controls": "2.0.0",
"ember-native-dom-helpers": "0.5.3",
"ember-one-way-controls": "2.0.1",
"ember-power-datepicker": "0.3.0",
"ember-power-select": "1.8.2",
"ember-resolver": "4.3.0",
"ember-responsive": "2.0.2",
"ember-route-action-helper": "2.0.3",
"ember-responsive": "2.0.4",
"ember-route-action-helper": "2.0.5",
"ember-simple-auth": "1.3.0",
"ember-sinon": "0.7.0",
"ember-sortable": "1.9.1",
"ember-source": "2.14.1",
"ember-test-selectors": "0.3.6",
"ember-test-selectors": "0.3.7",
"ember-truth-helpers": "1.3.0",
"ember-wormhole": "0.5.1",
"ember-wormhole": "0.5.2",
"emberx-file-input": "1.1.2",
"eslint-plugin-ember-suave": "1.0.0",
"eslint-plugin-sort-imports-es6-autofix": "https://github.com/kevinansfield/eslint-plugin-sort-imports-es6-autofix.git#node-4-compat",
"fs-extra": "3.0.1",
"glob": "7.1.1",
"glob": "7.1.2",
"grunt": "1.0.1",
"grunt-shell": "2.1.0",
"jquery-deparam": "0.5.3",
"liquid-fire": "0.27.3",
"liquid-tether": "2.0.4",
"liquid-wormhole": "2.0.5",
"loader.js": "4.4.0",
"markdown-it": "8.3.1",
"liquid-wormhole": "2.0.7",
"loader.js": "4.6.0",
"markdown-it": "8.3.2",
"markdown-it-footnote": "3.0.1",
"markdown-it-lazy-headers": "0.1.3",
"markdown-it-mark": "2.0.0",
@ -112,11 +112,11 @@
"password-generator": "2.1.0",
"postcss-color-function": "3.0.0",
"postcss-custom-properties": "5.0.2",
"postcss-easy-import": "2.0.0",
"postcss-easy-import": "2.1.0",
"simplemde": "https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost",
"top-gh-contribs": "2.0.4",
"torii": "0.8.2",
"walk-sync": "0.3.1"
"walk-sync": "0.3.2"
},
"ember-addon": {
"paths": [

View File

@ -1,6 +1,5 @@
import destroyApp from '../helpers/destroy-app';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {
authenticateSession,
@ -50,55 +49,55 @@ describe('Acceptance: Content', function() {
// Not checking request here as it won't be the last request made
// Displays all posts + pages
expect(find(testSelector('post-id')).length, 'all posts count').to.equal(5);
expect(find('[data-test-post-id]').length, 'all posts count').to.equal(5);
// show draft posts
await selectChoose(testSelector('type-select'), 'Draft posts');
await selectChoose('[data-test-type-select]', 'Draft posts');
// API request is correct
let [lastRequest] = server.pretender.handledRequests.slice(-1);
expect(lastRequest.queryParams.status, '"drafts" request status param').to.equal('draft');
expect(lastRequest.queryParams.staticPages, '"drafts" request staticPages param').to.equal('false');
// Displays draft post
expect(find(testSelector('post-id')).length, 'drafts count').to.equal(1);
expect(find(testSelector('post-id', draftPost.id)), 'draft post').to.exist;
expect(find('[data-test-post-id]').length, 'drafts count').to.equal(1);
expect(find(`[data-test-post-id="${draftPost.id}"]`), 'draft post').to.exist;
// show published posts
await selectChoose(testSelector('type-select'), 'Published posts');
await selectChoose('[data-test-type-select]', 'Published posts');
// API request is correct
[lastRequest] = server.pretender.handledRequests.slice(-1);
expect(lastRequest.queryParams.status, '"published" request status param').to.equal('published');
expect(lastRequest.queryParams.staticPages, '"published" request staticPages param').to.equal('false');
// Displays three published posts + pages
expect(find(testSelector('post-id')).length, 'published count').to.equal(2);
expect(find(testSelector('post-id', publishedPost.id)), 'admin published post').to.exist;
expect(find(testSelector('post-id', authorPost.id)), 'author published post').to.exist;
expect(find('[data-test-post-id]').length, 'published count').to.equal(2);
expect(find(`[data-test-post-id="${publishedPost.id}"]`), 'admin published post').to.exist;
expect(find(`[data-test-post-id="${authorPost.id}"]`), 'author published post').to.exist;
// show scheduled posts
await selectChoose(testSelector('type-select'), 'Scheduled posts');
await selectChoose('[data-test-type-select]', 'Scheduled posts');
// API request is correct
[lastRequest] = server.pretender.handledRequests.slice(-1);
expect(lastRequest.queryParams.status, '"scheduled" request status param').to.equal('scheduled');
expect(lastRequest.queryParams.staticPages, '"scheduled" request staticPages param').to.equal('false');
// Displays scheduled post
expect(find(testSelector('post-id')).length, 'scheduled count').to.equal(1);
expect(find(testSelector('post-id', scheduledPost.id)), 'scheduled post').to.exist;
expect(find('[data-test-post-id]').length, 'scheduled count').to.equal(1);
expect(find(`[data-test-post-id="${scheduledPost.id}"]`), 'scheduled post').to.exist;
// show pages
await selectChoose(testSelector('type-select'), 'Pages');
await selectChoose('[data-test-type-select]', 'Pages');
// API request is correct
[lastRequest] = server.pretender.handledRequests.slice(-1);
expect(lastRequest.queryParams.status, '"pages" request status param').to.equal('all');
expect(lastRequest.queryParams.staticPages, '"pages" request staticPages param').to.equal('true');
// Displays page
expect(find(testSelector('post-id')).length, 'pages count').to.equal(1);
expect(find(testSelector('post-id', publishedPage.id)), 'page post').to.exist;
expect(find('[data-test-post-id]').length, 'pages count').to.equal(1);
expect(find(`[data-test-post-id="${publishedPage.id}"]`), 'page post').to.exist;
// show all posts
await selectChoose(testSelector('type-select'), 'All posts');
await selectChoose('[data-test-type-select]', 'All posts');
// API request is correct
[lastRequest] = server.pretender.handledRequests.slice(-1);
@ -106,7 +105,7 @@ describe('Acceptance: Content', function() {
expect(lastRequest.queryParams.staticPages, '"all" request staticPages param').to.equal('all');
// show all posts by editor
await selectChoose(testSelector('author-select'), editor.name);
await selectChoose('[data-test-author-select]', editor.name);
// API request is correct
[lastRequest] = server.pretender.handledRequests.slice(-1);
@ -117,13 +116,13 @@ describe('Acceptance: Content', function() {
// Displays editor post
// TODO: implement "filter" param support and fix mirage post->author association
// expect(find(testSelector('post-id')).length, 'editor post count').to.equal(1);
// expect(find(testSelector('post-id', authorPost.id)), 'author post').to.exist;
// expect(find('[data-test-post-id]').length, 'editor post count').to.equal(1);
// expect(find(`[data-test-post-id="${authorPost.id}"]`), 'author post').to.exist;
// TODO: test tags dropdown
// Double-click on a post opens editor
await triggerEvent(testSelector('post-id', authorPost.id), 'dblclick');
await triggerEvent(`[data-test-post-id="${authorPost.id}"]`, 'dblclick');
expect(currentURL(), 'url after double-click').to.equal(`/editor/${authorPost.id}`);
});
@ -148,15 +147,15 @@ describe('Acceptance: Content', function() {
it('only fetches the author\'s posts', async function () {
await visit('/');
// trigger a filter request so we can grab the posts API request easily
await selectChoose(testSelector('type-select'), 'Published posts');
await selectChoose('[data-test-type-select]', 'Published posts');
// API request includes author filter
let [lastRequest] = server.pretender.handledRequests.slice(-1);
expect(lastRequest.queryParams.filter).to.equal(`author:${author.slug}`);
// only author's post is shown
expect(find(testSelector('post-id')).length, 'post count').to.equal(1);
expect(find(testSelector('post-id', authorPost.id)), 'author post').to.exist;
expect(find('[data-test-post-id]').length, 'post count').to.equal(1);
expect(find(`[data-test-post-id="${authorPost.id}"]`), 'author post').to.exist;
});
});
});

View File

@ -4,7 +4,6 @@ import destroyApp from '../helpers/destroy-app';
import moment from 'moment';
import sinon from 'sinon';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
import {expect} from 'chai';
@ -83,110 +82,110 @@ describe('Acceptance: Editor', function() {
.to.equal('/editor/1');
// open post settings menu
await click(testSelector('psm-trigger'));
await click('[data-test-psm-trigger]');
// should error, if the publish time is in the wrong format
await fillIn(testSelector('date-time-picker-time-input'), 'foo');
await triggerEvent(testSelector('date-time-picker-time-input'), 'blur');
await fillIn('[data-test-date-time-picker-time-input]', 'foo');
await triggerEvent('[data-test-date-time-picker-time-input]', 'blur');
expect(find(testSelector('date-time-picker-error')).text().trim(), 'inline error response for invalid time')
expect(find('[data-test-date-time-picker-error]').text().trim(), 'inline error response for invalid time')
.to.equal('Must be in format: "15:00"');
// should error, if the publish time is in the future
// NOTE: date must be selected first, changing the time first will save
// with the new time
await datepickerSelect(testSelector('date-time-picker-datepicker'), moment.tz('Etc/UTC'));
await fillIn(testSelector('date-time-picker-time-input'), futureTime.format('HH:mm'));
await triggerEvent(testSelector('date-time-picker-time-input'), 'blur');
await datepickerSelect('[data-test-date-time-picker-datepicker]', moment.tz('Etc/UTC'));
await fillIn('[data-test-date-time-picker-time-input]', futureTime.format('HH:mm'));
await triggerEvent('[data-test-date-time-picker-time-input]', 'blur');
expect(find(testSelector('date-time-picker-error')).text().trim(), 'inline error response for future time')
expect(find('[data-test-date-time-picker-error]').text().trim(), 'inline error response for future time')
.to.equal('Must be in the past');
// closing the PSM will reset the invalid date/time
await click(testSelector('close-settings-menu'));
await click(testSelector('psm-trigger'));
await click('[data-test-close-settings-menu]');
await click('[data-test-psm-trigger]');
expect(
find(testSelector('date-time-picker-error')).text().trim(),
find('[data-test-date-time-picker-error]').text().trim(),
'date picker error after closing PSM'
).to.equal('');
expect(
find(testSelector('date-time-picker-date-input')).val(),
find('[data-test-date-time-picker-date-input]').val(),
'PSM date value after closing with invalid date'
).to.equal(moment(post1.publishedAt).format('MM/DD/YYYY'));
expect(
find(testSelector('date-time-picker-time-input')).val(),
find('[data-test-date-time-picker-time-input]').val(),
'PSM time value after closing with invalid date'
).to.equal(moment(post1.publishedAt).format('HH:mm'));
// saves the post with the new date
let validTime = moment('2017-04-09 12:00');
await fillIn(testSelector('date-time-picker-time-input'), validTime.format('HH:mm'));
await triggerEvent(testSelector('date-time-picker-time-input'), 'blur');
await datepickerSelect(testSelector('date-time-picker-datepicker'), validTime);
await fillIn('[data-test-date-time-picker-time-input]', validTime.format('HH:mm'));
await triggerEvent('[data-test-date-time-picker-time-input]', 'blur');
await datepickerSelect('[data-test-date-time-picker-datepicker]', validTime);
// hide psm
await click(testSelector('psm-trigger'));
await click('[data-test-psm-trigger]');
// checking the flow of the saving button for a draft
expect(
find(testSelector('publishmenu-trigger')).text().trim(),
find('[data-test-publishmenu-trigger]').text().trim(),
'draft publish button text'
).to.equal('Publish');
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'draft status text'
).to.equal('Draft');
// click on publish now
await click(testSelector('publishmenu-trigger'));
await click('[data-test-publishmenu-trigger]');
expect(
find(testSelector('publishmenu-draft')),
find('[data-test-publishmenu-draft]'),
'draft publish menu is shown'
).to.exist;
await click(testSelector('publishmenu-scheduled-option'));
await click('[data-test-publishmenu-scheduled-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'draft post schedule button text'
).to.equal('Schedule');
await click(testSelector('publishmenu-published-option'));
await click('[data-test-publishmenu-published-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'draft post publish button text'
).to.equal('Publish');
// Publish the post
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after draft is published'
).to.equal('Published');
expect(
find(testSelector('publishmenu-published')),
find('[data-test-publishmenu-published]'),
'publish menu is shown after draft published'
).to.exist;
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'post status updated after draft published'
).to.equal('Published');
await click(testSelector('publishmenu-cancel'));
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-unpublished-option'));
await click('[data-test-publishmenu-cancel]');
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-unpublished-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'published post unpublish button text'
).to.equal('Unpublish');
@ -194,31 +193,31 @@ describe('Acceptance: Editor', function() {
await visit('/editor/2');
expect(currentURL(), 'currentURL').to.equal('/editor/2');
expect(find(testSelector('date-time-picker-date-input')).val()).to.equal('12/19/2015');
expect(find(testSelector('date-time-picker-time-input')).val()).to.equal('16:25');
expect(find('[data-test-date-time-picker-date-input]').val()).to.equal('12/19/2015');
expect(find('[data-test-date-time-picker-time-input]').val()).to.equal('16:25');
// saves the post with a new date
await datepickerSelect(testSelector('date-time-picker-datepicker'), moment('2016-05-10 10:00'));
await fillIn(testSelector('date-time-picker-time-input'), '10:00');
await triggerEvent(testSelector('date-time-picker-time-input'), 'blur');
await datepickerSelect('[data-test-date-time-picker-datepicker]', moment('2016-05-10 10:00'));
await fillIn('[data-test-date-time-picker-time-input]', '10:00');
await triggerEvent('[data-test-date-time-picker-time-input]', 'blur');
// saving
await click(testSelector('publishmenu-trigger'));
await click('[data-test-publishmenu-trigger]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'published button text'
).to.equal('Update');
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after published post is updated'
).to.equal('Updated');
// go to settings to change the timezone
await visit('/settings/general');
await click(testSelector('toggle-timezone'));
await click('[data-test-toggle-timezone]');
expect(currentURL(), 'currentURL for settings')
.to.equal('/settings/general');
@ -242,139 +241,139 @@ describe('Acceptance: Editor', function() {
.to.equal('/editor/2');
expect(
find(testSelector('date-time-picker-date-input')).val(),
find('[data-test-date-time-picker-date-input]').val(),
'date after timezone change'
).to.equal('05/10/2016');
expect(
find(testSelector('date-time-picker-time-input')).val(),
find('[data-test-date-time-picker-time-input]').val(),
'time after timezone change'
).to.equal('22:00');
// unpublish
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-unpublished-option'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-unpublished-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'published post unpublish button text'
).to.equal('Unpublish');
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after published post is unpublished'
).to.equal('Unpublished');
expect(
find(testSelector('publishmenu-draft')),
find('[data-test-publishmenu-draft]'),
'draft menu is shown after unpublished'
).to.exist;
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'post status updated after unpublished'
).to.equal('Draft');
// schedule post
await click(testSelector('publishmenu-cancel'));
await click(testSelector('publishmenu-trigger'));
await click('[data-test-publishmenu-cancel]');
await click('[data-test-publishmenu-trigger]');
let newFutureTime = moment.tz('Pacific/Kwajalein').add(10, 'minutes');
await click(testSelector('publishmenu-scheduled-option'));
await click('[data-test-publishmenu-scheduled-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'draft post, schedule button text'
).to.equal('Schedule');
await datepickerSelect(`${testSelector('publishmenu-draft')} ${testSelector('date-time-picker-datepicker')}`, newFutureTime);
await click(testSelector('publishmenu-save'));
await datepickerSelect('[data-test-publishmenu-draft] [data-test-date-time-picker-datepicker]', newFutureTime);
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after draft is scheduled'
).to.equal('Scheduled');
await click(testSelector('publishmenu-cancel'));
await click('[data-test-publishmenu-cancel]');
expect(
find(testSelector('publishmenu-scheduled')),
find('[data-test-publishmenu-scheduled]'),
'publish menu is not shown after closed'
).to.not.exist;
// expect countdown to show warning, that post will be published in x minutes
expect(find(testSelector('schedule-countdown')).text().trim(), 'notification countdown')
expect(find('[data-test-schedule-countdown]').text().trim(), 'notification countdown')
.to.contain('Post will be published in');
expect(
find(testSelector('publishmenu-trigger')).text().trim(),
find('[data-test-publishmenu-trigger]').text().trim(),
'scheduled publish button text'
).to.equal('Scheduled');
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'scheduled post status'
).to.equal('Scheduled');
// Re-schedule
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-scheduled-option'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-scheduled-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'scheduled post button reschedule text'
).to.equal('Reschedule');
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button text for a rescheduled post'
).to.equal('Rescheduled');
await click(testSelector('publishmenu-cancel'));
await click('[data-test-publishmenu-cancel]');
expect(
find(testSelector('publishmenu-scheduled')),
find('[data-test-publishmenu-scheduled]'),
'publish menu is not shown after closed'
).to.not.exist;
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'scheduled status text'
).to.equal('Scheduled');
// unschedule
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-draft-option'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-draft-option]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after scheduled post is unscheduled'
).to.equal('Unschedule');
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-save]');
expect(
find(testSelector('publishmenu-save')).text().trim(),
find('[data-test-publishmenu-save]').text().trim(),
'publish menu save button updated after scheduled post is unscheduled'
).to.equal('Unscheduled');
await click(testSelector('publishmenu-cancel'));
await click('[data-test-publishmenu-cancel]');
expect(
find(testSelector('publishmenu-trigger')).text().trim(),
find('[data-test-publishmenu-trigger]').text().trim(),
'publish button text after unschedule'
).to.equal('Publish');
expect(
find(testSelector('editor-post-status')).text().trim(),
find('[data-test-editor-post-status]').text().trim(),
'status text after unschedule'
).to.equal('Draft');
expect(
find(testSelector('schedule-countdown')),
find('[data-test-schedule-countdown]'),
'scheduled countdown after unschedule'
).to.not.exist;
});
@ -394,12 +393,12 @@ describe('Acceptance: Editor', function() {
await visit(`/editor/${post.id}`);
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-scheduled-option'));
await datepickerSelect(`${testSelector('publishmenu-draft')} ${testSelector('date-time-picker-datepicker')}`, plusTenMin);
await fillIn(`${testSelector('publishmenu-draft')} ${testSelector('date-time-picker-time-input')}`, plusTenMin.format('HH:mm'));
await triggerEvent(`${testSelector('publishmenu-draft')} ${testSelector('date-time-picker-time-input')}`, 'blur');
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-scheduled-option]');
await datepickerSelect('[data-test-publishmenu-draft] [data-test-date-time-picker-datepicker]', plusTenMin);
await fillIn('[data-test-publishmenu-draft] [data-test-date-time-picker-time-input]', plusTenMin.format('HH:mm'));
await triggerEvent('[data-test-publishmenu-draft] [data-test-date-time-picker-time-input]', 'blur');
await click('[data-test-publishmenu-save]');
expect(
find('.gh-alert').length,
@ -421,9 +420,9 @@ describe('Acceptance: Editor', function() {
expect(currentURL(), 'currentURL')
.to.equal('/editor/1');
await fillIn(testSelector('editor-title-input'), Array(260).join('a'));
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-save'));
await fillIn('[data-test-editor-title-input]', Array(260).join('a'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-save]');
expect(
find('.gh-alert').length,
@ -488,15 +487,15 @@ describe('Acceptance: Editor', function() {
expect(currentURL(), 'currentURL')
.to.equal('/editor/1');
expect(find(testSelector('date-time-picker-date-input')).val(), 'scheduled date')
expect(find('[data-test-date-time-picker-date-input]').val(), 'scheduled date')
.to.equal(compareDateString);
expect(find(testSelector('date-time-picker-time-input')).val(), 'scheduled time')
expect(find('[data-test-date-time-picker-time-input]').val(), 'scheduled time')
.to.equal(compareTimeString);
// Dropdown menu should be 'Update Post' and 'Unschedule'
expect(find(testSelector('publishmenu-trigger')).text().trim(), 'text in save button for scheduled post')
expect(find('[data-test-publishmenu-trigger]').text().trim(), 'text in save button for scheduled post')
.to.equal('Scheduled');
// expect countdown to show warning, that post will be published in x minutes
expect(find(testSelector('schedule-countdown')).text().trim(), 'notification countdown')
expect(find('[data-test-schedule-countdown]').text().trim(), 'notification countdown')
.to.contain('Post will be published in');
});
@ -536,10 +535,10 @@ describe('Acceptance: Editor', function() {
'url on initial visit'
).to.equal('/editor');
await triggerEvent(testSelector('editor-title-input'), 'blur');
await triggerEvent('[data-test-editor-title-input]', 'blur');
expect(
find(testSelector('editor-title-input')).val(),
find('[data-test-editor-title-input]').val(),
'title value after autosave'
).to.equal('(Untitled)');
@ -556,14 +555,14 @@ describe('Acceptance: Editor', function() {
// TODO: implement tests for other fields
await click(testSelector('psm-trigger'));
await click('[data-test-psm-trigger]');
// excerpt has validation
await fillIn(testSelector('field', 'custom-excerpt'), Array(302).join('a'));
await triggerEvent(testSelector('field', 'custom-excerpt'), 'blur');
await fillIn('[data-test-field="custom-excerpt"]', Array(302).join('a'));
await triggerEvent('[data-test-field="custom-excerpt"]', 'blur');
expect(
find(testSelector('error', 'custom-excerpt')).text().trim(),
find('[data-test-error="custom-excerpt"]').text().trim(),
'excerpt too long error'
).to.match(/cannot be longer than 300/);
@ -573,8 +572,8 @@ describe('Acceptance: Editor', function() {
).to.be.blank;
// changing custom excerpt auto-saves
await fillIn(testSelector('field', 'custom-excerpt'), 'Testing excerpt');
await triggerEvent(testSelector('field', 'custom-excerpt'), 'blur');
await fillIn('[data-test-field="custom-excerpt"]', 'Testing excerpt');
await triggerEvent('[data-test-field="custom-excerpt"]', 'blur');
expect(
server.db.posts[0].custom_excerpt,
@ -584,15 +583,15 @@ describe('Acceptance: Editor', function() {
// -------
// open code injection subview
await click(testSelector('button', 'codeinjection'));
await click('[data-test-button="codeinjection"]');
// header injection has validation
let headerCM = find(`${testSelector('field', 'codeinjection-head')} .CodeMirror`)[0].CodeMirror;
let headerCM = find('[data-test-field="codeinjection-head"] .CodeMirror')[0].CodeMirror;
await headerCM.setValue(Array(65540).join('a'));
await triggerEvent(headerCM.getInputField(), 'blur');
expect(
find(testSelector('error', 'codeinjection-head')).text().trim(),
find('[data-test-error="codeinjection-head"]').text().trim(),
'header injection too long error'
).to.match(/cannot be longer than 65535/);
@ -611,12 +610,12 @@ describe('Acceptance: Editor', function() {
).to.equal('<script src="http://example.com/inject-head.js"></script>');
// footer injection has validation
let footerCM = find(`${testSelector('field', 'codeinjection-foot')} .CodeMirror`)[0].CodeMirror;
let footerCM = find('[data-test-field="codeinjection-foot"] .CodeMirror')[0].CodeMirror;
await footerCM.setValue(Array(65540).join('a'));
await triggerEvent(footerCM.getInputField(), 'blur');
expect(
find(testSelector('error', 'codeinjection-foot')).text().trim(),
find('[data-test-error="codeinjection-foot"]').text().trim(),
'footer injection too long error'
).to.match(/cannot be longer than 65535/);
@ -635,24 +634,24 @@ describe('Acceptance: Editor', function() {
).to.equal('<script src="http://example.com/inject-foot.js"></script>');
// closing subview switches back to main PSM view
await click(testSelector('button', 'close-psm-subview'));
await click('[data-test-button="close-psm-subview"]');
expect(
find(testSelector('field', 'codeinjection-head')).length,
find('[data-test-field="codeinjection-head"]').length,
'header injection not present after closing subview'
).to.equal(0);
// -------
// open twitter data subview
await click(testSelector('button', 'twitter-data'));
await click('[data-test-button="twitter-data"]');
// twitter title has validation
await fillIn(testSelector('field', 'twitter-title'), Array(302).join('a'));
await triggerEvent(testSelector('field', 'twitter-title'), 'blur');
await fillIn('[data-test-field="twitter-title"]', Array(302).join('a'));
await triggerEvent('[data-test-field="twitter-title"]', 'blur');
expect(
find(testSelector('error', 'twitter-title')).text().trim(),
find('[data-test-error="twitter-title"]').text().trim(),
'twitter title too long error'
).to.match(/cannot be longer than 300/);
@ -663,8 +662,8 @@ describe('Acceptance: Editor', function() {
// changing twitter title auto-saves
// twitter title has validation
await fillIn(testSelector('field', 'twitter-title'), 'Test Twitter Title');
await triggerEvent(testSelector('field', 'twitter-title'), 'blur');
await fillIn('[data-test-field="twitter-title"]', 'Test Twitter Title');
await triggerEvent('[data-test-field="twitter-title"]', 'blur');
expect(
server.db.posts[0].twitter_title,
@ -672,11 +671,11 @@ describe('Acceptance: Editor', function() {
).to.equal('Test Twitter Title');
// twitter description has validation
await fillIn(testSelector('field', 'twitter-description'), Array(505).join('a'));
await triggerEvent(testSelector('field', 'twitter-description'), 'blur');
await fillIn('[data-test-field="twitter-description"]', Array(505).join('a'));
await triggerEvent('[data-test-field="twitter-description"]', 'blur');
expect(
find(testSelector('error', 'twitter-description')).text().trim(),
find('[data-test-error="twitter-description"]').text().trim(),
'twitter description too long error'
).to.match(/cannot be longer than 500/);
@ -687,8 +686,8 @@ describe('Acceptance: Editor', function() {
// changing twitter description auto-saves
// twitter description has validation
await fillIn(testSelector('field', 'twitter-description'), 'Test Twitter Description');
await triggerEvent(testSelector('field', 'twitter-description'), 'blur');
await fillIn('[data-test-field="twitter-description"]', 'Test Twitter Description');
await triggerEvent('[data-test-field="twitter-description"]', 'blur');
expect(
server.db.posts[0].twitter_description,
@ -696,24 +695,24 @@ describe('Acceptance: Editor', function() {
).to.equal('Test Twitter Description');
// closing subview switches back to main PSM view
await click(testSelector('button', 'close-psm-subview'));
await click('[data-test-button="close-psm-subview"]');
expect(
find(testSelector('field', 'twitter-title')).length,
find('[data-test-field="twitter-title"]').length,
'twitter title not present after closing subview'
).to.equal(0);
// -------
// open facebook data subview
await click(testSelector('button', 'facebook-data'));
await click('[data-test-button="facebook-data"]');
// facebook title has validation
await fillIn(testSelector('field', 'og-title'), Array(302).join('a'));
await triggerEvent(testSelector('field', 'og-title'), 'blur');
await fillIn('[data-test-field="og-title"]', Array(302).join('a'));
await triggerEvent('[data-test-field="og-title"]', 'blur');
expect(
find(testSelector('error', 'og-title')).text().trim(),
find('[data-test-error="og-title"]').text().trim(),
'facebook title too long error'
).to.match(/cannot be longer than 300/);
@ -724,8 +723,8 @@ describe('Acceptance: Editor', function() {
// changing facebook title auto-saves
// facebook title has validation
await fillIn(testSelector('field', 'og-title'), 'Test Facebook Title');
await triggerEvent(testSelector('field', 'og-title'), 'blur');
await fillIn('[data-test-field="og-title"]', 'Test Facebook Title');
await triggerEvent('[data-test-field="og-title"]', 'blur');
expect(
server.db.posts[0].og_title,
@ -733,11 +732,11 @@ describe('Acceptance: Editor', function() {
).to.equal('Test Facebook Title');
// facebook description has validation
await fillIn(testSelector('field', 'og-description'), Array(505).join('a'));
await triggerEvent(testSelector('field', 'og-description'), 'blur');
await fillIn('[data-test-field="og-description"]', Array(505).join('a'));
await triggerEvent('[data-test-field="og-description"]', 'blur');
expect(
find(testSelector('error', 'og-description')).text().trim(),
find('[data-test-error="og-description"]').text().trim(),
'facebook description too long error'
).to.match(/cannot be longer than 500/);
@ -748,8 +747,8 @@ describe('Acceptance: Editor', function() {
// changing facebook description auto-saves
// facebook description has validation
await fillIn(testSelector('field', 'og-description'), 'Test Facebook Description');
await triggerEvent(testSelector('field', 'og-description'), 'blur');
await fillIn('[data-test-field="og-description"]', 'Test Facebook Description');
await triggerEvent('[data-test-field="og-description"]', 'blur');
expect(
server.db.posts[0].og_description,
@ -757,10 +756,10 @@ describe('Acceptance: Editor', function() {
).to.equal('Test Facebook Description');
// closing subview switches back to main PSM view
await click(testSelector('button', 'close-psm-subview'));
await click('[data-test-button="close-psm-subview"]');
expect(
find(testSelector('field', 'og-title')).length,
find('[data-test-field="og-title"]').length,
'facebook title not present after closing subview'
).to.equal(0);
});

View File

@ -2,7 +2,6 @@
import Mirage from 'ember-cli-mirage';
import destroyApp from '../helpers/destroy-app';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
import {expect} from 'chai';
@ -44,8 +43,8 @@ describe('Acceptance: Error Handling', function() {
await visit('/');
await click('.posts-list li:nth-of-type(2) a'); // select second post
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-save')); // "Save post"
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-save]'); // "Save post"
// has the refresh to update alert
expect(find('.gh-alert').length).to.equal(1);
@ -131,8 +130,8 @@ describe('Acceptance: Error Handling', function() {
server.create('post');
await visit('/editor/1');
await click(testSelector('publishmenu-trigger'));
await click(testSelector('publishmenu-save'));
await click('[data-test-publishmenu-trigger]');
await click('[data-test-publishmenu-save]');
andThen(() => {
expect(find('.gh-alert').length).to.equal(1);
@ -145,8 +144,8 @@ describe('Acceptance: Error Handling', function() {
server.del('/themes/foo/', htmlErrorResponse);
await visit('/settings/design');
await click(`${testSelector('theme-id', 'foo')} ${testSelector('theme-delete-button')}`);
await click(`.fullscreen-modal ${testSelector('delete-button')}`);
await click('[data-test-theme-id="foo"] [data-test-theme-delete-button]');
await click('.fullscreen-modal [data-test-delete-button]');
andThen(() => {
expect(find('.gh-alert').length).to.equal(1);

View File

@ -2,7 +2,6 @@
import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import destroyApp from '../../helpers/destroy-app';
import startApp from '../../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {
afterEach,
beforeEach,
@ -65,13 +64,13 @@ describe('Acceptance: Settings - Apps - AMP', function () {
expect(currentURL(), 'currentURL').to.equal('/settings/apps/amp');
// AMP is enabled by default
expect(find(testSelector('amp-checkbox')).prop('checked'), 'AMP checkbox').to.be.true;
expect(find('[data-test-amp-checkbox]').prop('checked'), 'AMP checkbox').to.be.true;
await click(testSelector('amp-checkbox'));
await click('[data-test-amp-checkbox]');
expect(find(testSelector('amp-checkbox')).prop('checked'), 'AMP checkbox').to.be.false;
expect(find('[data-test-amp-checkbox]').prop('checked'), 'AMP checkbox').to.be.false;
await click(testSelector('save-button'));
await click('[data-test-save-button]');
let [lastRequest] = server.pretender.handledRequests.slice(-1);
let params = JSON.parse(lastRequest.requestBody);
@ -79,7 +78,7 @@ describe('Acceptance: Settings - Apps - AMP', function () {
expect(params.settings.findBy('key', 'amp').value).to.equal(false);
// CMD-S shortcut works
await click(testSelector('amp-checkbox'));
await click('[data-test-amp-checkbox]');
await triggerEvent('.gh-app', 'keydown', {
keyCode: 83, // s
metaKey: ctrlOrCmd === 'command',
@ -91,7 +90,7 @@ describe('Acceptance: Settings - Apps - AMP', function () {
let [newRequest] = server.pretender.handledRequests.slice(-1);
params = JSON.parse(newRequest.requestBody);
expect(find(testSelector('amp-checkbox')).prop('checked'), 'AMP checkbox').to.be.true;
expect(find('[data-test-amp-checkbox]').prop('checked'), 'AMP checkbox').to.be.true;
expect(params.settings.findBy('key', 'amp').value).to.equal(true);
});
});

View File

@ -3,7 +3,6 @@ import $ from 'jquery';
import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import destroyApp from '../../helpers/destroy-app';
import startApp from '../../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {
afterEach,
beforeEach,
@ -72,7 +71,7 @@ describe('Acceptance: Settings - Code-Injection', function() {
expect($('.gh-nav-settings-code-injection').hasClass('active'), 'highlights nav menu item')
.to.be.true;
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Save');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Save');
expect(find('#ghost-head .CodeMirror').length, 'ghost head codemirror element').to.equal(1);
expect($('#ghost-head .CodeMirror').hasClass('cm-s-xq-light'), 'ghost head editor theme').to.be.true;
@ -80,13 +79,13 @@ describe('Acceptance: Settings - Code-Injection', function() {
expect(find('#ghost-foot .CodeMirror').length, 'ghost head codemirror element').to.equal(1);
expect($('#ghost-foot .CodeMirror').hasClass('cm-s-xq-light'), 'ghost head editor theme').to.be.true;
await click(testSelector('save-button'));
await click('[data-test-save-button]');
let [lastRequest] = server.pretender.handledRequests.slice(-1);
let params = JSON.parse(lastRequest.requestBody);
expect(params.settings.findBy('key', 'ghost_head').value).to.equal('');
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Saved');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Saved');
// CMD-S shortcut works
await triggerEvent('.gh-app', 'keydown', {
@ -100,7 +99,7 @@ describe('Acceptance: Settings - Code-Injection', function() {
params = JSON.parse(newRequest.requestBody);
expect(params.settings.findBy('key', 'ghost_head').value).to.equal('');
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Saved');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Saved');
});
});
});

View File

@ -5,7 +5,6 @@ import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import destroyApp from '../../helpers/destroy-app';
import mockThemes from 'ghost-admin/mirage/config/themes';
import startApp from '../../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
import {expect} from 'chai';
@ -50,7 +49,7 @@ describe('Acceptance: Settings - Design', function () {
await visit('/settings/design');
expect(currentPath()).to.equal('settings.design.index');
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Save');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Save');
// fixtures contain two nav items, check for three rows as we
// should have one extra that's blank
@ -66,7 +65,7 @@ describe('Acceptance: Settings - Design', function () {
await fillIn('.gh-blognav-url:first input', '/test');
await triggerEvent('.gh-blognav-url:first input', 'blur');
await click(testSelector('save-button'));
await click('[data-test-save-button]');
let [navSetting] = server.db.settings.where({key: 'navigation'});
@ -83,7 +82,7 @@ describe('Acceptance: Settings - Design', function () {
it('validates new item correctly on save', async function () {
await visit('/settings/design');
await click(testSelector('save-button'));
await click('[data-test-save-button]');
expect(
find('.gh-blognav-item').length,
@ -94,7 +93,7 @@ describe('Acceptance: Settings - Design', function () {
await fillIn('.gh-blognav-url:last input', 'http://invalid domain/');
await triggerEvent('.gh-blognav-url:last input', 'blur');
await click(testSelector('save-button'));
await click('[data-test-save-button]');
expect(
find('.gh-blognav-item').length,
@ -215,31 +214,31 @@ describe('Acceptance: Settings - Design', function () {
// lists available themes (themes are specified in mirage/fixtures/settings)
expect(
find(testSelector('theme-id')).length,
find('[data-test-theme-id]').length,
'shows correct number of themes'
).to.equal(3);
expect(
find(`${testSelector('theme-active', 'true')} ${testSelector('theme-title')}`).text().trim(),
find('[data-test-theme-active="true"] [data-test-theme-title]').text().trim(),
'Blog theme marked as active'
).to.equal('Blog (default)');
// theme upload displays modal
await click(testSelector('upload-theme-button'));
await click('[data-test-upload-theme-button]');
expect(
find('.fullscreen-modal .modal-content:contains("Upload a theme")').length,
'theme upload modal displayed after button click'
).to.equal(1);
// cancelling theme upload closes modal
await click(`.fullscreen-modal ${testSelector('close-button')}`);
await click('.fullscreen-modal [data-test-close-button]');
expect(
find('.fullscreen-modal').length === 0,
'upload theme modal is closed when cancelling'
).to.be.true;
// theme upload validates mime type
await click(testSelector('upload-theme-button'));
await click('[data-test-upload-theme-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {type: 'text/csv'});
expect(
find('.fullscreen-modal .failed').text(),
@ -247,7 +246,7 @@ describe('Acceptance: Settings - Design', function () {
).to.match(/is not supported/);
// theme upload validates casper.zip
await click(testSelector('upload-try-again-button'));
await click('[data-test-upload-try-again-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'casper.zip', type: 'application/zip'});
expect(
find('.fullscreen-modal .failed').text(),
@ -262,7 +261,7 @@ describe('Acceptance: Settings - Design', function () {
}]
});
});
await click(testSelector('upload-try-again-button'));
await click('[data-test-upload-try-again-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'error.zip', type: 'application/zip'});
expect(
find('.fullscreen-modal .failed').text().trim(),
@ -310,7 +309,7 @@ describe('Acceptance: Settings - Design', function () {
});
});
await click(testSelector('upload-try-again-button'));
await click('[data-test-upload-try-again-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'bad-theme.zip', type: 'application/zip'});
expect(
@ -323,7 +322,7 @@ describe('Acceptance: Settings - Design', function () {
'top-level errors are displayed'
).to.match(/Templates must contain valid Handlebars/);
await click(testSelector('toggle-details'));
await click('[data-test-toggle-details]');
expect(
find('.theme-validation-details').text(),
@ -338,7 +337,7 @@ describe('Acceptance: Settings - Design', function () {
// reset to default mirage handlers
mockThemes(server);
await click(`.fullscreen-modal ${testSelector('try-again-button')}`);
await click('.fullscreen-modal [data-test-try-again-button]');
expect(
find('.theme-validation-errors').length,
'"Try Again" resets form after theme validation error'
@ -399,7 +398,7 @@ describe('Acceptance: Settings - Design', function () {
'modal title after uploading theme with warnings'
).to.equal('Upload successful with warnings');
await click(testSelector('toggle-details'));
await click('[data-test-toggle-details]');
expect(
find('.theme-validation-details').text(),
@ -414,10 +413,10 @@ describe('Acceptance: Settings - Design', function () {
// reset to default mirage handlers
mockThemes(server);
await click(`.fullscreen-modal ${testSelector('close-button')}`);
await click('.fullscreen-modal [data-test-close-button]');
// theme upload handles success then close
await click(testSelector('upload-theme-button'));
await click('[data-test-upload-theme-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'theme-1.zip', type: 'application/zip'});
expect(
@ -431,42 +430,42 @@ describe('Acceptance: Settings - Design', function () {
).to.match(/"Test 1 - 0\.1" uploaded successfully/);
expect(
find(testSelector('theme-id')).length,
find('[data-test-theme-id]').length,
'number of themes in list grows after upload'
).to.equal(5);
expect(
find(`${testSelector('theme-active', 'true')} ${testSelector('theme-title')}`).text().trim(),
find('[data-test-theme-active="true"] [data-test-theme-title]').text().trim(),
'newly uploaded theme is not active'
).to.equal('Blog (default)');
await click(`.fullscreen-modal ${testSelector('close-button')}`);
await click('.fullscreen-modal [data-test-close-button]');
// theme upload handles success then activate
await click(testSelector('upload-theme-button'));
await click('[data-test-upload-theme-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'theme-2.zip', type: 'application/zip'});
await click(`.fullscreen-modal ${testSelector('activate-now-button')}`);
await click('.fullscreen-modal [data-test-activate-now-button]');
expect(
find(testSelector('theme-id')).length,
find('[data-test-theme-id]').length,
'number of themes in list grows after upload and activate'
).to.equal(6);
expect(
find(`${testSelector('theme-active', 'true')} ${testSelector('theme-title')}`).text().trim(),
find('[data-test-theme-active="true"] [data-test-theme-title]').text().trim(),
'newly uploaded+activated theme is active'
).to.equal('Test 2');
// theme activation switches active theme
await click(`${testSelector('theme-id', 'casper')} ${testSelector('theme-activate-button')}`);
await click('[data-test-theme-id="casper"] [data-test-theme-activate-button]');
expect(
find(`${testSelector('theme-id', 'test-2')} .apps-card-app`).hasClass('theme-list-item--active'),
find('[data-test-theme-id="test-2"] .apps-card-app').hasClass('theme-list-item--active'),
'previously active theme is not active'
).to.be.false;
expect(
find(`${testSelector('theme-id', 'casper')} .apps-card-app`).hasClass('theme-list-item--active'),
find('[data-test-theme-id="casper"] .apps-card-app').hasClass('theme-list-item--active'),
'activated theme is active'
).to.be.true;
@ -508,21 +507,21 @@ describe('Acceptance: Settings - Design', function () {
});
});
await click(`${testSelector('theme-id', 'test-2')} ${testSelector('theme-activate-button')}`);
await click('[data-test-theme-id="test-2"] [data-test-theme-activate-button]');
expect(find(testSelector('theme-warnings-modal'))).to.exist;
expect(find('[data-test-theme-warnings-modal]')).to.exist;
expect(
find(testSelector('theme-warnings-title')).text().trim(),
find('[data-test-theme-warnings-title]').text().trim(),
'modal title after activating invalid theme'
).to.equal('Activation failed');
expect(
find(testSelector('theme-warnings')).text(),
find('[data-test-theme-warnings]').text(),
'top-level errors are displayed in activation errors'
).to.match(/Templates must contain valid Handlebars/);
await click(testSelector('toggle-details'));
await click('[data-test-toggle-details]');
expect(
find('.theme-validation-details').text(),
@ -537,8 +536,8 @@ describe('Acceptance: Settings - Design', function () {
// restore default mirage handlers
mockThemes(server);
await click(testSelector('modal-close-button'));
expect(find(testSelector('theme-warnings-modal'))).to.not.exist;
await click('[data-test-modal-close-button]');
expect(find('[data-test-theme-warnings-modal]')).to.not.exist;
// theme activation shows warnings
server.put('themes/:theme/activate', function ({themes}, {params}) {
@ -569,16 +568,16 @@ describe('Acceptance: Settings - Design', function () {
return {themes: [theme]};
});
await click(`${testSelector('theme-id', 'test-2')} ${testSelector('theme-activate-button')}`);
await click('[data-test-theme-id="test-2"] [data-test-theme-activate-button]');
expect(find(testSelector('theme-warnings-modal'))).to.exist;
expect(find('[data-test-theme-warnings-modal]')).to.exist;
expect(
find(testSelector('theme-warnings-title')).text().trim(),
find('[data-test-theme-warnings-title]').text().trim(),
'modal title after activating theme with warnings'
).to.equal('Activation successful with warnings');
await click(testSelector('toggle-details'));
await click('[data-test-toggle-details]');
expect(
find('.theme-validation-details').text(),
@ -593,39 +592,39 @@ describe('Acceptance: Settings - Design', function () {
// restore default mirage handlers
mockThemes(server);
await click(testSelector('modal-close-button'));
await click('[data-test-modal-close-button]');
// reactivate casper to continue tests
await click(`${testSelector('theme-id', 'casper')} ${testSelector('theme-activate-button')}`);
await click('[data-test-theme-id="casper"] [data-test-theme-activate-button]');
// theme deletion displays modal
await click(`${testSelector('theme-id', 'test-1')} ${testSelector('theme-delete-button')}`);
await click('[data-test-theme-id="test-1"] [data-test-theme-delete-button]');
expect(
find(testSelector('delete-theme-modal')).length,
find('[data-test-delete-theme-modal]').length,
'theme deletion modal displayed after button click'
).to.equal(1);
// cancelling theme deletion closes modal
await click(`.fullscreen-modal ${testSelector('cancel-button')}`);
await click('.fullscreen-modal [data-test-cancel-button]');
expect(
find('.fullscreen-modal').length === 0,
'delete theme modal is closed when cancelling'
).to.be.true;
// confirming theme deletion closes modal and refreshes list
await click(`${testSelector('theme-id', 'test-1')} ${testSelector('theme-delete-button')}`);
await click(`.fullscreen-modal ${testSelector('delete-button')}`);
await click('[data-test-theme-id="test-1"] [data-test-theme-delete-button]');
await click('.fullscreen-modal [data-test-delete-button]');
expect(
find('.fullscreen-modal').length === 0,
'delete theme modal closes after deletion'
).to.be.true;
expect(
find(testSelector('theme-id')).length,
find('[data-test-theme-id]').length,
'number of themes in list shrinks after delete'
).to.equal(5);
expect(
find(testSelector('theme-title')).text(),
find('[data-test-theme-title]').text(),
'correct theme is removed from theme list after deletion'
).to.not.match(/Test 1/);
@ -638,8 +637,8 @@ describe('Acceptance: Settings - Design', function () {
});
});
await click(`${testSelector('theme-id', 'test-2')} ${testSelector('theme-delete-button')}`);
await click(`.fullscreen-modal ${testSelector('delete-button')}`);
await click('[data-test-theme-id="test-2"] [data-test-theme-delete-button]');
await click('.fullscreen-modal [data-test-delete-button]');
expect(
find('.fullscreen-modal').length === 0,
@ -677,13 +676,13 @@ describe('Acceptance: Settings - Design', function () {
});
await visit('/settings/design');
await click(`${testSelector('theme-id', 'foo')} ${testSelector('theme-delete-button')}`);
await click(`.fullscreen-modal ${testSelector('delete-button')}`);
await click('[data-test-theme-id="foo"] [data-test-theme-delete-button]');
await click('.fullscreen-modal [data-test-delete-button]');
await click(testSelector('upload-theme-button'));
await click('[data-test-upload-theme-button]');
await fileUpload('.fullscreen-modal input[type="file"]', ['test'], {name: 'foo.zip', type: 'application/zip'});
// this will fail if upload failed because there won't be an activate now button
await click(`.fullscreen-modal ${testSelector('activate-now-button')}`);
await click('.fullscreen-modal [data-test-activate-now-button]');
});
});
});

View File

@ -5,7 +5,6 @@ import destroyApp from '../../helpers/destroy-app';
import mockUploads from '../../../mirage/config/uploads';
import run from 'ember-runloop';
import startApp from '../../helpers/start-app';
import testSelector from 'ember-test-selectors';
import wait from 'ember-test-helpers/wait';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
@ -71,18 +70,18 @@ describe('Acceptance: Settings - General', function () {
.to.be.true;
expect(
find(testSelector('save-button')).text().trim(),
find('[data-test-save-button]').text().trim(),
'save button text'
).to.equal('Save settings');
expect(
find(testSelector('dated-permalinks-checkbox')).prop('checked'),
find('[data-test-dated-permalinks-checkbox]').prop('checked'),
'date permalinks checkbox'
).to.be.false;
await click(testSelector('toggle-pub-info'));
await fillIn(testSelector('title-input'), 'New Blog Title');
await click(testSelector('save-button'));
await click('[data-test-toggle-pub-info]');
await fillIn('[data-test-title-input]', 'New Blog Title');
await click('[data-test-save-button]');
expect(document.title, 'page title').to.equal('Settings - General - New Blog Title');
// blog icon upload
@ -90,24 +89,24 @@ describe('Acceptance: Settings - General', function () {
// has fixture icon
expect(
find(testSelector('icon-img')).attr('src'),
find('[data-test-icon-img]').attr('src'),
'initial icon src'
).to.equal('/content/images/2014/Feb/favicon.ico');
// delete removes icon + shows button
await click(testSelector('delete-image', 'icon'));
await click('[data-test-delete-image="icon"]');
expect(
find(testSelector('icon-img')),
find('[data-test-icon-img]'),
'icon img after removal'
).to.not.exist;
expect(
find(testSelector('image-upload-btn', 'icon')),
find('[data-test-image-upload-btn="icon"]'),
'icon upload button after removal'
).to.exist;
// select file
fileUpload(
testSelector('file-input', 'icon'),
'[data-test-file-input="icon"]',
['test'],
{name: 'pub-icon.ico', type: 'image/x-icon'}
);
@ -115,7 +114,7 @@ describe('Acceptance: Settings - General', function () {
// check progress bar exists during upload
run.later(() => {
expect(
find(`${testSelector('setting', 'icon')} ${testSelector('progress-bar')}`),
find('[data-test-setting="icon"] [data-test-progress-bar]'),
'icon upload progress bar'
).to.exist;
}, 50);
@ -123,11 +122,11 @@ describe('Acceptance: Settings - General', function () {
// wait for upload to finish and check image is shown
await wait();
expect(
find(testSelector('icon-img')).attr('src'),
find('[data-test-icon-img]').attr('src'),
'icon img after upload'
).to.match(/pub-icon\.ico$/);
expect(
find(testSelector('image-upload-btn', 'icon')),
find('[data-test-image-upload-btn="icon"]'),
'icon upload button after upload'
).to.not.exist;
@ -140,14 +139,14 @@ describe('Acceptance: Settings - General', function () {
}]
};
}, 422);
await click(testSelector('delete-image', 'icon'));
await click('[data-test-delete-image="icon"]');
await fileUpload(
testSelector('file-input', 'icon'),
'[data-test-file-input="icon"]',
['test'],
{name: 'pub-icon.ico', type: 'image/x-icon'}
);
expect(
find(testSelector('error', 'icon')).text().trim(),
find('[data-test-error="icon"]').text().trim(),
'failed icon upload message'
).to.equal('Wrong icon size');
@ -159,24 +158,24 @@ describe('Acceptance: Settings - General', function () {
// has fixture icon
expect(
find(testSelector('logo-img')).attr('src'),
find('[data-test-logo-img]').attr('src'),
'initial logo src'
).to.equal('/content/images/2013/Nov/logo.png');
// delete removes logo + shows button
await click(testSelector('delete-image', 'logo'));
await click('[data-test-delete-image="logo"]');
expect(
find(testSelector('logo-img')),
find('[data-test-logo-img]'),
'logo img after removal'
).to.not.exist;
expect(
find(testSelector('image-upload-btn', 'logo')),
find('[data-test-image-upload-btn="logo"]'),
'logo upload button after removal'
).to.exist;
// select file
fileUpload(
testSelector('file-input', 'logo'),
'[data-test-file-input="logo"]',
['test'],
{name: 'pub-logo.png', type: 'image/png'}
);
@ -184,7 +183,7 @@ describe('Acceptance: Settings - General', function () {
// check progress bar exists during upload
run.later(() => {
expect(
find(`${testSelector('setting', 'logo')} ${testSelector('progress-bar')}`),
find('[data-test-setting="logo"] [data-test-progress-bar]'),
'logo upload progress bar'
).to.exist;
}, 50);
@ -192,11 +191,11 @@ describe('Acceptance: Settings - General', function () {
// wait for upload to finish and check image is shown
await wait();
expect(
find(testSelector('logo-img')).attr('src'),
find('[data-test-logo-img]').attr('src'),
'logo img after upload'
).to.match(/pub-logo\.png$/);
expect(
find(testSelector('image-upload-btn', 'logo')),
find('[data-test-image-upload-btn="logo"]'),
'logo upload button after upload'
).to.not.exist;
@ -209,14 +208,14 @@ describe('Acceptance: Settings - General', function () {
}]
};
}, 422);
await click(testSelector('delete-image', 'logo'));
await click('[data-test-delete-image="logo"]');
await fileUpload(
testSelector('file-input', 'logo'),
'[data-test-file-input="logo"]',
['test'],
{name: 'pub-logo.png', type: 'image/png'}
);
expect(
find(testSelector('error', 'logo')).text().trim(),
find('[data-test-error="logo"]').text().trim(),
'failed logo upload message'
).to.equal('Wrong logo size');
@ -228,24 +227,24 @@ describe('Acceptance: Settings - General', function () {
// has fixture icon
expect(
find(testSelector('cover-img')).attr('src'),
find('[data-test-cover-img]').attr('src'),
'initial coverImage src'
).to.equal('/content/images/2014/Feb/cover.jpg');
// delete removes coverImage + shows button
await click(testSelector('delete-image', 'coverImage'));
await click('[data-test-delete-image="coverImage"]');
expect(
find(testSelector('coverImage-img')),
find('[data-test-coverImage-img]'),
'coverImage img after removal'
).to.not.exist;
expect(
find(testSelector('image-upload-btn', 'coverImage')),
find('[data-test-image-upload-btn="coverImage"]'),
'coverImage upload button after removal'
).to.exist;
// select file
fileUpload(
testSelector('file-input', 'coverImage'),
'[data-test-file-input="coverImage"]',
['test'],
{name: 'pub-coverImage.png', type: 'image/png'}
);
@ -253,7 +252,7 @@ describe('Acceptance: Settings - General', function () {
// check progress bar exists during upload
run.later(() => {
expect(
find(`${testSelector('setting', 'coverImage')} ${testSelector('progress-bar')}`),
find('[data-test-setting="coverImage"] [data-test-progress-bar]'),
'coverImage upload progress bar'
).to.exist;
}, 50);
@ -261,11 +260,11 @@ describe('Acceptance: Settings - General', function () {
// wait for upload to finish and check image is shown
await wait();
expect(
find(testSelector('cover-img')).attr('src'),
find('[data-test-cover-img]').attr('src'),
'coverImage img after upload'
).to.match(/pub-coverImage\.png$/);
expect(
find(testSelector('image-upload-btn', 'coverImage')),
find('[data-test-image-upload-btn="coverImage"]'),
'coverImage upload button after upload'
).to.not.exist;
@ -278,14 +277,14 @@ describe('Acceptance: Settings - General', function () {
}]
};
}, 422);
await click(testSelector('delete-image', 'coverImage'));
await click('[data-test-delete-image="coverImage"]');
await fileUpload(
testSelector('file-input', 'coverImage'),
'[data-test-file-input="coverImage"]',
['test'],
{name: 'pub-coverImage.png', type: 'image/png'}
);
expect(
find(testSelector('error', 'coverImage')).text().trim(),
find('[data-test-error="coverImage"]').text().trim(),
'failed coverImage upload message'
).to.equal('Wrong coverImage size');
@ -294,7 +293,7 @@ describe('Acceptance: Settings - General', function () {
// CMD-S shortcut works
// -------------------------------------------------------------- //
await fillIn(testSelector('title-input'), 'CMD-S Test');
await fillIn('[data-test-title-input]', 'CMD-S Test');
await triggerEvent('.gh-app', 'keydown', {
keyCode: 83, // s
metaKey: ctrlOrCmd === 'command',
@ -309,7 +308,7 @@ describe('Acceptance: Settings - General', function () {
it('renders timezone selector correctly', async function () {
await visit('/settings/general');
await click(testSelector('toggle-timezone'));
await click('[data-test-toggle-timezone]');
expect(currentURL(), 'currentURL').to.equal('/settings/general');
@ -318,7 +317,7 @@ describe('Acceptance: Settings - General', function () {
find('#activeTimezone option[value="Africa/Cairo"]').prop('selected', true);
await triggerEvent('#activeTimezone', 'change');
await click(testSelector('save-button'));
await click('[data-test-save-button]');
expect(find('#activeTimezone option:selected').text().trim()).to.equal('(GMT +2:00) Cairo, Egypt');
});
@ -326,151 +325,151 @@ describe('Acceptance: Settings - General', function () {
await visit('/settings/general');
// handles private blog settings correctly
expect(find(testSelector('private-checkbox')).prop('checked'), 'isPrivate checkbox').to.be.false;
expect(find('[data-test-private-checkbox]').prop('checked'), 'isPrivate checkbox').to.be.false;
await click(testSelector('private-checkbox'));
await click('[data-test-private-checkbox]');
expect(find(testSelector('private-checkbox')).prop('checked'), 'isPrivate checkbox').to.be.true;
expect(find(testSelector('password-input')).length, 'password input').to.equal(1);
expect(find(testSelector('password-input')).val(), 'password default value').to.not.equal('');
expect(find('[data-test-private-checkbox]').prop('checked'), 'isPrivate checkbox').to.be.true;
expect(find('[data-test-password-input]').length, 'password input').to.equal(1);
expect(find('[data-test-password-input]').val(), 'password default value').to.not.equal('');
await fillIn(testSelector('password-input'), '');
await triggerEvent(testSelector('password-input'), 'blur');
await fillIn('[data-test-password-input]', '');
await triggerEvent('[data-test-password-input]', 'blur');
expect(find(testSelector('password-error')).text().trim(), 'empty password error')
expect(find('[data-test-password-error]').text().trim(), 'empty password error')
.to.equal('Password must be supplied');
await fillIn(testSelector('password-input'), 'asdfg');
await triggerEvent(testSelector('password-input'), 'blur');
await fillIn('[data-test-password-input]', 'asdfg');
await triggerEvent('[data-test-password-input]', 'blur');
expect(find(testSelector('password-error')).text().trim(), 'present password error')
expect(find('[data-test-password-error]').text().trim(), 'present password error')
.to.equal('');
});
it('handles social blog settings correctly', async function () {
await visit('/settings/general');
await click(testSelector('toggle-social'));
await click('[data-test-toggle-social]');
// validates a facebook url correctly
// loads fixtures and performs transform
expect(find(testSelector('facebook-input')).val(), 'initial facebook value')
expect(find('[data-test-facebook-input]').val(), 'initial facebook value')
.to.equal('https://www.facebook.com/test');
await triggerEvent(testSelector('facebook-input'), 'focus');
await triggerEvent(testSelector('facebook-input'), 'blur');
await triggerEvent('[data-test-facebook-input]', 'focus');
await triggerEvent('[data-test-facebook-input]', 'blur');
// regression test: we still have a value after the input is
// focused and then blurred without any changes
expect(find(testSelector('facebook-input')).val(), 'facebook value after blur with no change')
expect(find('[data-test-facebook-input]').val(), 'facebook value after blur with no change')
.to.equal('https://www.facebook.com/test');
await fillIn(testSelector('facebook-input'), 'facebook.com/username');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'facebook.com/username');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/username');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/username');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'facebook.com/pages/some-facebook-page/857469375913?ref=ts');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'facebook.com/pages/some-facebook-page/857469375913?ref=ts');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/pages/some-facebook-page/857469375913?ref=ts');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/pages/some-facebook-page/857469375913?ref=ts');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), '*(&*(%%))');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', '*(&*(%%))');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('The URL must be in a format like https://www.facebook.com/yourPage');
await fillIn(testSelector('facebook-input'), 'http://github.com/username');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'http://github.com/username');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/username');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/username');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'http://github.com/pages/username');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'http://github.com/pages/username');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/pages/username');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/pages/username');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'testuser');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'testuser');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/testuser');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/testuser');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'ab99');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'ab99');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/ab99');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/ab99');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'page/ab99');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'page/ab99');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/page/ab99');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/page/ab99');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('facebook-input'), 'page/*(&*(%%))');
await triggerEvent(testSelector('facebook-input'), 'blur');
await fillIn('[data-test-facebook-input]', 'page/*(&*(%%))');
await triggerEvent('[data-test-facebook-input]', 'blur');
expect(find(testSelector('facebook-input')).val()).to.be.equal('https://www.facebook.com/page/*(&*(%%))');
expect(find(testSelector('facebook-error')).text().trim(), 'inline validation response')
expect(find('[data-test-facebook-input]').val()).to.be.equal('https://www.facebook.com/page/*(&*(%%))');
expect(find('[data-test-facebook-error]').text().trim(), 'inline validation response')
.to.equal('');
// validates a twitter url correctly
// loads fixtures and performs transform
expect(find(testSelector('twitter-input')).val(), 'initial twitter value')
expect(find('[data-test-twitter-input]').val(), 'initial twitter value')
.to.equal('https://twitter.com/test');
await triggerEvent(testSelector('twitter-input'), 'focus');
await triggerEvent(testSelector('twitter-input'), 'blur');
await triggerEvent('[data-test-twitter-input]', 'focus');
await triggerEvent('[data-test-twitter-input]', 'blur');
// regression test: we still have a value after the input is
// focused and then blurred without any changes
expect(find(testSelector('twitter-input')).val(), 'twitter value after blur with no change')
expect(find('[data-test-twitter-input]').val(), 'twitter value after blur with no change')
.to.equal('https://twitter.com/test');
await fillIn(testSelector('twitter-input'), 'twitter.com/username');
await triggerEvent(testSelector('twitter-input'), 'blur');
await fillIn('[data-test-twitter-input]', 'twitter.com/username');
await triggerEvent('[data-test-twitter-input]', 'blur');
expect(find(testSelector('twitter-input')).val()).to.be.equal('https://twitter.com/username');
expect(find(testSelector('twitter-error')).text().trim(), 'inline validation response')
expect(find('[data-test-twitter-input]').val()).to.be.equal('https://twitter.com/username');
expect(find('[data-test-twitter-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('twitter-input'), '*(&*(%%))');
await triggerEvent(testSelector('twitter-input'), 'blur');
await fillIn('[data-test-twitter-input]', '*(&*(%%))');
await triggerEvent('[data-test-twitter-input]', 'blur');
expect(find(testSelector('twitter-error')).text().trim(), 'inline validation response')
expect(find('[data-test-twitter-error]').text().trim(), 'inline validation response')
.to.equal('The URL must be in a format like https://twitter.com/yourUsername');
await fillIn(testSelector('twitter-input'), 'http://github.com/username');
await triggerEvent(testSelector('twitter-input'), 'blur');
await fillIn('[data-test-twitter-input]', 'http://github.com/username');
await triggerEvent('[data-test-twitter-input]', 'blur');
expect(find(testSelector('twitter-input')).val()).to.be.equal('https://twitter.com/username');
expect(find(testSelector('twitter-error')).text().trim(), 'inline validation response')
expect(find('[data-test-twitter-input]').val()).to.be.equal('https://twitter.com/username');
expect(find('[data-test-twitter-error]').text().trim(), 'inline validation response')
.to.equal('');
await fillIn(testSelector('twitter-input'), 'thisusernamehasmorethan15characters');
await triggerEvent(testSelector('twitter-input'), 'blur');
await fillIn('[data-test-twitter-input]', 'thisusernamehasmorethan15characters');
await triggerEvent('[data-test-twitter-input]', 'blur');
expect(find(testSelector('twitter-error')).text().trim(), 'inline validation response')
expect(find('[data-test-twitter-error]').text().trim(), 'inline validation response')
.to.equal('Your Username is not a valid Twitter Username');
await fillIn(testSelector('twitter-input'), 'testuser');
await triggerEvent(testSelector('twitter-input'), 'blur');
await fillIn('[data-test-twitter-input]', 'testuser');
await triggerEvent('[data-test-twitter-input]', 'blur');
expect(find(testSelector('twitter-input')).val()).to.be.equal('https://twitter.com/testuser');
expect(find(testSelector('twitter-error')).text().trim(), 'inline validation response')
expect(find('[data-test-twitter-input]').val()).to.be.equal('https://twitter.com/testuser');
expect(find('[data-test-twitter-error]').text().trim(), 'inline validation response')
.to.equal('');
});
});

View File

@ -3,7 +3,6 @@ import Mirage from 'ember-cli-mirage';
import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import destroyApp from '../../helpers/destroy-app';
import startApp from '../../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
import {expect} from 'chai';
@ -61,13 +60,13 @@ describe('Acceptance: Settings - Apps - Slack', function () {
expect(currentURL(), 'currentURL').to.equal('/settings/apps/slack');
await fillIn('#slack-settings input[name="slack[url]"]', 'notacorrecturl');
await click(testSelector('save-button'));
await click('[data-test-save-button]');
expect(find('#slack-settings .error .response').text().trim(), 'inline validation response')
.to.equal('The URL must be in a format like https://hooks.slack.com/services/<your personal key>');
// CMD-S shortcut works
await fillIn(testSelector('slack-url-input'), 'https://hooks.slack.com/services/1275958430');
await fillIn('[data-test-slack-url-input]', 'https://hooks.slack.com/services/1275958430');
await triggerEvent('.gh-app', 'keydown', {
keyCode: 83, // s
metaKey: ctrlOrCmd === 'command',
@ -83,7 +82,7 @@ describe('Acceptance: Settings - Apps - Slack', function () {
.to.equal('');
await fillIn('#slack-settings input[name="slack[url]"]', 'https://hooks.slack.com/services/1275958430');
await click(testSelector('send-notification-button'));
await click('[data-test-send-notification-button]');
expect(find('.gh-notification').length, 'number of notifications').to.equal(1);
expect(find('#slack-settings .error .response').text().trim(), 'inline validation response')
@ -101,7 +100,7 @@ describe('Acceptance: Settings - Apps - Slack', function () {
});
await click('.gh-notification .gh-notification-close');
await click(testSelector('send-notification-button'));
await click('[data-test-send-notification-button]');
// we shouldn't try to send the test request if the save fails
let [lastRequest] = server.pretender.handledRequests.slice(-1);

View File

@ -2,7 +2,6 @@
import destroyApp from '../helpers/destroy-app';
import moment from 'moment';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {Response} from 'ember-cli-mirage';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from '../helpers/ember-simple-auth';
@ -99,7 +98,7 @@ describe('Acceptance: Setup', function () {
// email field is focused by default
// NOTE: $('x').is(':focus') doesn't work in phantomjs CLI runner
// https://github.com/ariya/phantomjs/issues/10427
expect(find(testSelector('blog-title-input')).get(0) === document.activeElement, 'blog title has focus')
expect(find('[data-test-blog-title-input]').get(0) === document.activeElement, 'blog title has focus')
.to.be.true;
await click('.gh-btn-green');
@ -117,10 +116,10 @@ describe('Acceptance: Setup', function () {
.to.equal(1);
// enter valid details and submit
await fillIn(testSelector('email-input'), 'test@example.com');
await fillIn(testSelector('name-input'), 'Test User');
await fillIn(testSelector('password-input'), 'password');
await fillIn(testSelector('blog-title-input'), 'Blog Title');
await fillIn('[data-test-email-input]', 'test@example.com');
await fillIn('[data-test-name-input]', 'Test User');
await fillIn('[data-test-password-input]', 'password');
await fillIn('[data-test-blog-title-input]', 'Blog Title');
await click('.gh-btn-green');
// it transitions to step 3
@ -184,10 +183,10 @@ describe('Acceptance: Setup', function () {
expect(find('.main-error').text().trim(), 'error text')
.to.not.be.blank;
await fillIn(testSelector('email-input'), 'test@example.com');
await fillIn(testSelector('name-input'), 'Test User');
await fillIn(testSelector('password-input'), 'password');
await fillIn(testSelector('blog-title-input'), 'Blog Title');
await fillIn('[data-test-email-input]', 'test@example.com');
await fillIn('[data-test-name-input]', 'Test User');
await fillIn('[data-test-password-input]', 'password');
await fillIn('[data-test-blog-title-input]', 'Blog Title');
// first post - simulated validation error
await click('.gh-btn-green');
@ -222,10 +221,10 @@ describe('Acceptance: Setup', function () {
server.loadFixtures('roles');
await visit('/setup/two');
await fillIn(testSelector('email-input'), 'test@example.com');
await fillIn(testSelector('name-input'), 'Test User');
await fillIn(testSelector('password-input'), 'password');
await fillIn(testSelector('blog-title-input'), 'Blog Title');
await fillIn('[data-test-email-input]', 'test@example.com');
await fillIn('[data-test-name-input]', 'Test User');
await fillIn('[data-test-password-input]', 'password');
await fillIn('[data-test-blog-title-input]', 'Blog Title');
await click('.gh-btn-green');
// button should not be spinning
@ -277,10 +276,10 @@ describe('Acceptance: Setup', function () {
// complete step 2 so we can access step 3
await visit('/setup/two');
await fillIn(testSelector('email-input'), 'test@example.com');
await fillIn(testSelector('name-input'), 'Test User');
await fillIn(testSelector('password-input'), 'password');
await fillIn(testSelector('blog-title-input'), 'Blog Title');
await fillIn('[data-test-email-input]', 'test@example.com');
await fillIn('[data-test-name-input]', 'Test User');
await fillIn('[data-test-password-input]', 'password');
await fillIn('[data-test-blog-title-input]', 'Blog Title');
await click('.gh-btn-green');
// default field/button state
@ -443,7 +442,7 @@ describe('Acceptance: Setup', function () {
).to.equal('Connected: oauthtest@example.com');
await fillIn('input[name="blog-title"]', 'Ghostbusters');
await click(testSelector('submit-button'));
await click('[data-test-submit-button]');
expect(
currentURL(),

View File

@ -1,7 +1,6 @@
/* jshint expr:true */
import destroyApp from '../helpers/destroy-app';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from 'ghost-admin/tests/helpers/ember-simple-auth';
import {expect} from 'chai';
@ -75,7 +74,7 @@ describe('Acceptance: Subscribers', function() {
.to.equal(30);
// it shows the total number of subscribers
expect(find(testSelector('total-subscribers')).text().trim(), 'displayed subscribers total')
expect(find('[data-test-total-subscribers]').text().trim(), 'displayed subscribers total')
.to.equal('(40)');
// it defaults to sorting by created_at desc
@ -146,7 +145,7 @@ describe('Acceptance: Subscribers', function() {
// .to.equal(0);
// the subscriber total is updated
expect(find(testSelector('total-subscribers')).text().trim(), 'subscribers total after addition')
expect(find('[data-test-total-subscribers]').text().trim(), 'subscribers total after addition')
.to.equal('(41)');
// saving a duplicate subscriber
@ -163,7 +162,7 @@ describe('Acceptance: Subscribers', function() {
.to.equal(1);
// the subscriber total is unchanged
expect(find(testSelector('total-subscribers')).text().trim(), 'subscribers total after failed add')
expect(find('[data-test-total-subscribers]').text().trim(), 'subscribers total after failed add')
.to.equal('(41)');
// deleting a subscriber
@ -193,7 +192,7 @@ describe('Acceptance: Subscribers', function() {
.to.not.equal('test@example.com');
// the subscriber total is updated
expect(find(testSelector('total-subscribers')).text().trim(), 'subscribers total after addition')
expect(find('[data-test-total-subscribers]').text().trim(), 'subscribers total after addition')
.to.equal('(40)');
// click the import subscribers button
@ -224,7 +223,7 @@ describe('Acceptance: Subscribers', function() {
.to.equal('Close');
// subscriber total is updated
expect(find(testSelector('total-subscribers')).text().trim(), 'subscribers total after import')
expect(find('[data-test-total-subscribers]').text().trim(), 'subscribers total after import')
.to.equal('(90)');
// table is reset

View File

@ -3,7 +3,6 @@ import ctrlOrCmd from 'ghost-admin/utils/ctrl-or-cmd';
import destroyApp from '../helpers/destroy-app';
import moment from 'moment';
import startApp from '../helpers/start-app';
import testSelector from 'ember-test-selectors';
import {Response} from 'ember-cli-mirage';
import {afterEach, beforeEach, describe, it} from 'mocha';
import {authenticateSession, invalidateSession} from '../helpers/ember-simple-auth';
@ -85,29 +84,29 @@ describe('Acceptance: Team', function () {
// it shows active users in active section
expect(
find(`${testSelector('active-users')} ${testSelector('user-id')}`).length,
find('[data-test-active-users] [data-test-user-id]').length,
'number of active users'
).to.equal(3);
expect(
find(`${testSelector('active-users')} ${testSelector('user-id', user1.id)}`)
find(`[data-test-active-users] [data-test-user-id="${user1.id}"]`)
).to.exist;
expect(
find(`${testSelector('active-users')} ${testSelector('user-id', user2.id)}`)
find(`[data-test-active-users] [data-test-user-id="${user2.id}"]`)
).to.exist;
expect(
find(`${testSelector('active-users')} ${testSelector('user-id', admin.id)}`)
find(`[data-test-active-users] [data-test-user-id="${admin.id}"]`)
).to.exist;
// it shows suspended users in suspended section
expect(
find(`${testSelector('suspended-users')} ${testSelector('user-id')}`).length,
find('[data-test-suspended-users] [data-test-user-id]').length,
'number of suspended users'
).to.equal(1);
expect(
find(`${testSelector('suspended-users')} ${testSelector('user-id', suspendedUser.id)}`)
find(`[data-test-suspended-users] [data-test-user-id="${suspendedUser.id}"]`)
).to.exist;
await click(testSelector('user-id', user2.id));
await click(`[data-test-user-id="${user2.id}"]`);
// url is correct
expect(currentURL(), 'url after clicking user').to.equal(`/team/${user2.slug}`);
@ -117,11 +116,11 @@ describe('Acceptance: Team', function () {
// view title should exist and be linkable and active
expect(
find(`${testSelector('screen-title')} a[href="/ghost/team"]`).hasClass('active'),
find('[data-test-screen-title] a[href="/ghost/team"]').hasClass('active'),
'has linkable url back to team main page'
).to.be.true;
await click(`${testSelector('screen-title')} a`);
await click('[data-test-screen-title] a');
// url should be /team again
expect(currentURL(), 'url after clicking back').to.equal('/team');
@ -138,31 +137,31 @@ describe('Acceptance: Team', function () {
// existing users are listed
expect(
find(testSelector('user-id')).length,
find('[data-test-user-id]').length,
'initial number of active users'
).to.equal(2);
expect(
find(testSelector('user-id', '1')).find(testSelector('role-name')).text().trim(),
find('[data-test-user-id="1"] [data-test-role-name]').text().trim(),
'active user\'s role label'
).to.equal('Administrator');
// existing invites are shown
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'initial number of invited users'
).to.equal(1);
expect(
find(testSelector('invite-id', '1')).find(testSelector('invite-description')).text(),
find('[data-test-invite-id="1"] [data-test-invite-description]').text(),
'expired invite description'
).to.match(/expired/);
// remove expired invite
await click(`${testSelector('invite-id', '1')} ${testSelector('revoke-button')}`);
await click('[data-test-invite-id="1"] [data-test-revoke-button]');
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'initial number of invited users'
).to.equal(0);
@ -216,28 +215,28 @@ describe('Acceptance: Team', function () {
// invite is displayed, has correct e-mail + role
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'number of invites after first invite'
).to.equal(1);
expect(
find(testSelector('invite-id', '2')).find(testSelector('email')).text().trim(),
find('[data-test-invite-id="2"] [data-test-email]').text().trim(),
'displayed email of first invite'
).to.equal('invite1@example.com');
expect(
find(testSelector('invite-id', '2')).find(testSelector('role-name')).text().trim(),
find('[data-test-invite-id="2"] [data-test-role-name]').text().trim(),
'displayed role of first invite'
).to.equal('Author');
expect(
find(testSelector('invite-id', '2')).find(testSelector('invite-description')).text(),
find('[data-test-invite-id="2"] [data-test-invite-description]').text(),
'new invite description'
).to.match(/expires/);
// number of users is unchanged
expect(
find(testSelector('user-id')).length,
find('[data-test-user-id]').length,
'number of active users after first invite'
).to.equal(2);
@ -249,18 +248,18 @@ describe('Acceptance: Team', function () {
// number of invites increases
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'number of invites after second invite'
).to.equal(2);
// invite has correct e-mail + role
expect(
find(testSelector('invite-id', '3')).find(testSelector('email')).text().trim(),
find('[data-test-invite-id="3"] [data-test-email]').text().trim(),
'displayed email of second invite'
).to.equal('invite2@example.com');
expect(
find(testSelector('invite-id', '3')).find(testSelector('role-name')).text().trim(),
find('[data-test-invite-id="3"] [data-test-role-name]').text().trim(),
'displayed role of second invite'
).to.equal('Editor');
@ -297,11 +296,11 @@ describe('Acceptance: Team', function () {
await click('.fullscreen-modal a.close');
// revoke latest invite
await click(`${testSelector('invite-id', '3')} ${testSelector('revoke-button')}`);
await click('[data-test-invite-id="3"] [data-test-revoke-button]');
// number of invites decreases
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'number of invites after revoke'
).to.equal(1);
@ -313,7 +312,7 @@ describe('Acceptance: Team', function () {
// correct invite is removed
expect(
find(testSelector('invite-id')).find(testSelector('email')).text().trim(),
find('[data-test-invite-id] [data-test-email]').text().trim(),
'displayed email of remaining invite'
).to.equal('invite1@example.com');
@ -324,12 +323,12 @@ describe('Acceptance: Team', function () {
// new invite should be last in the list
expect(
find(`${testSelector('invite-id')}:last`).find(testSelector('email')).text().trim(),
find('[data-test-invite-id]:last [data-test-email]').text().trim(),
'last invite email in list'
).to.equal('invite3@example.com');
// resend first invite
await click(`${testSelector('invite-id', '2')} ${testSelector('resend-button')}`);
await click('[data-test-invite-id="2"] [data-test-resend-button]');
// notification is displayed
expect(
@ -339,17 +338,17 @@ describe('Acceptance: Team', function () {
// first invite is still at the top
expect(
find(`${testSelector('invite-id')}:first-of-type`).find(testSelector('email')).text().trim(),
find('[data-test-invite-id]:first-of-type [data-test-email]').text().trim(),
'first invite email in list'
).to.equal('invite1@example.com');
// regression test: can revoke a resent invite
await click(`${testSelector('invite-id')}:first-of-type ${testSelector('resend-button')}`);
await click(`${testSelector('invite-id')}:first-of-type ${testSelector('revoke-button')}`);
await click('[data-test-invite-id]:first-of-type [data-test-resend-button]');
await click('[data-test-invite-id]:first-of-type [data-test-revoke-button]');
// number of invites decreases
expect(
find(testSelector('invite-id')).length,
find('[data-test-invite-id]').length,
'number of invites after resend/revoke'
).to.equal(1);
@ -362,40 +361,40 @@ describe('Acceptance: Team', function () {
it('can manage suspended users', async function () {
await visit('/team');
await click(testSelector('user-id', suspendedUser.id));
await click(`[data-test-user-id="${suspendedUser.id}"]`);
expect(testSelector('suspended-badge')).to.exist;
expect('[data-test-suspended-badge]').to.exist;
await click(testSelector('user-actions'));
await click(testSelector('unsuspend-button'));
await click(testSelector('modal-confirm'));
await click('[data-test-user-actions]');
await click('[data-test-unsuspend-button]');
await click('[data-test-modal-confirm]');
// NOTE: there seems to be a timing issue with this test - pausing
// here confirms that the badge is removed but the andThen is firing
// before the page is updated
// andThen(() => {
// expect(testSelector('suspended-badge')).to.not.exist;
// expect('[data-test-suspended-badge]').to.not.exist;
// });
await click(testSelector('team-link'));
await click('[data-test-team-link]');
// suspendedUser is now in active list
expect(
find(`${testSelector('active-users')} ${testSelector('user-id', suspendedUser.id)}`)
find(`[data-test-active-users] [data-test-user-id="${suspendedUser.id}"]`)
).to.exist;
// no suspended users
expect(
find(`${testSelector('suspended-users')} ${testSelector('user-id')}`).length
find('[data-test-suspended-users] [data-test-user-id]').length
).to.equal(0);
await click(testSelector('user-id', suspendedUser.id));
await click(`[data-test-user-id="${suspendedUser.id}"]`);
await click(testSelector('user-actions'));
await click(testSelector('suspend-button'));
await click(testSelector('modal-confirm'));
await click('[data-test-user-actions]');
await click('[data-test-suspend-button]');
await click('[data-test-modal-confirm]');
expect(testSelector('suspended-badge')).to.exist;
expect('[data-test-suspended-badge]').to.exist;
});
it('can delete users', async function () {
@ -406,7 +405,7 @@ describe('Acceptance: Team', function () {
user2.posts = [post];
await visit('/team');
await click(testSelector('user-id', user1.id));
await click(`[data-test-user-id="${user1.id}"]`);
// user deletion displays modal
await click('button.delete');
@ -430,7 +429,7 @@ describe('Acceptance: Team', function () {
// deleting a user with posts
await visit('/team');
await click(testSelector('user-id', user2.id));
await click(`[data-test-user-id="${user2.id}"]`);
await click('button.delete');
// user has posts so should warn about post deletion
@ -445,7 +444,7 @@ describe('Acceptance: Team', function () {
// deleted user is not in list
expect(
find(testSelector('user-id', user2.id)).length,
find(`[data-test-user-id="${user2.id}"]`).length,
'deleted user is not in user list after deletion'
).to.equal(0);
});
@ -469,7 +468,7 @@ describe('Acceptance: Team', function () {
expect(currentURL(), 'currentURL').to.equal('/team/test-1');
expect(find('.user-details-bottom .first-form-group input.user-name').val(), 'current user name').to.equal('Test User');
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Save');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Save');
// test empty user name
await fillIn('.user-details-bottom .first-form-group input.user-name', '');
@ -494,9 +493,9 @@ describe('Acceptance: Team', function () {
expect(find('.user-details-bottom input[name="user"]').val(), 'slug value is reset to original upon empty string').to.equal('test-1');
// Save changes
await click(testSelector('save-button'));
await click('[data-test-save-button]');
expect(find(testSelector('save-button')).text().trim(), 'save button text').to.equal('Saved');
expect(find('[data-test-save-button]').text().trim(), 'save button text').to.equal('Saved');
// CMD-S shortcut works
await fillIn('.user-details-bottom input[name="user"]', 'Test User');

View File

@ -5,7 +5,6 @@ import Service from 'ember-service';
import hbs from 'htmlbars-inline-precompile';
import run from 'ember-runloop';
import sinon from 'sinon';
import testSelector from 'ember-test-selectors';
import wait from 'ember-test-helpers/wait';
import {UnsupportedMediaTypeError} from 'ghost-admin/services/ajax';
import {createFile, fileUpload} from '../../helpers/file-upload';
@ -73,12 +72,12 @@ describe('Integration: Component: gh-image-uploader', function() {
it('renders form with supplied alt text', function () {
this.render(hbs`{{gh-image-uploader image=image altText="text test"}}`);
expect(this.$(testSelector('file-input-description')).text().trim()).to.equal('Upload image of "text test"');
expect(this.$('[data-test-file-input-description]').text().trim()).to.equal('Upload image of "text test"');
});
it('renders form with supplied text', function () {
this.render(hbs`{{gh-image-uploader image=image text="text test"}}`);
expect(this.$(testSelector('file-input-description')).text().trim()).to.equal('text test');
expect(this.$('[data-test-file-input-description]').text().trim()).to.equal('text test');
});
it('generates request to correct endpoint', function (done) {

View File

@ -3,7 +3,6 @@ import $ from 'jquery';
import hbs from 'htmlbars-inline-precompile';
import run from 'ember-runloop';
import sinon from 'sinon';
import testSelector from 'ember-test-selectors';
import {describe, it} from 'mocha';
import {expect} from 'chai';
import {setupComponentTest} from 'ember-mocha';
@ -29,10 +28,10 @@ describe('Integration: Component: gh-theme-table', function() {
deleteTheme=(action actionHandler)
}}`);
expect(this.$(testSelector('themes-list')).length, 'themes list is present').to.equal(1);
expect(this.$(testSelector('theme-id')).length, 'number of rows').to.equal(4);
expect(this.$('[data-test-themes-list]').length, 'themes list is present').to.equal(1);
expect(this.$('[data-test-theme-id]').length, 'number of rows').to.equal(4);
let packageNames = this.$(testSelector('theme-title')).map((i, name) => {
let packageNames = this.$('[data-test-theme-title]').map((i, name) => {
return $(name).text().trim();
}).toArray();
@ -47,37 +46,37 @@ describe('Integration: Component: gh-theme-table', function() {
]);
expect(
this.$(testSelector('theme-active', 'true')).find(testSelector('theme-title')).text().trim(),
this.$('[data-test-theme-active="true"]').find('[data-test-theme-title]').text().trim(),
'active theme is highlighted'
).to.equal('Daring');
expect(
this.$(testSelector('theme-activate-button')).length === 3,
this.$('[data-test-theme-activate-button]').length === 3,
'non-active themes have an activate link'
).to.be.true;
expect(
this.$(testSelector('theme-active', 'true')).find(testSelector('theme-activate-button')).length === 0,
this.$('[data-test-theme-active="true"]').find('[data-test-theme-activate-button]').length === 0,
'active theme doesn\'t have an activate link'
).to.be.true;
expect(
this.$(testSelector('theme-download-button')).length,
this.$('[data-test-theme-download-button]').length,
'all themes have a download link'
).to.equal(4);
expect(
this.$(testSelector('theme-id', 'foo')).find(testSelector('theme-delete-button')).length === 1,
this.$('[data-test-theme-id="foo"]').find('[data-test-theme-delete-button]').length === 1,
'non-active, non-casper theme has delete link'
).to.be.true;
expect(
this.$(testSelector('theme-id', 'casper')).find(testSelector('theme-delete-button')).length === 0,
this.$('[data-test-theme-id="casper"]').find('[data-test-theme-delete-button]').length === 0,
'casper doesn\'t have delete link'
).to.be.true;
expect(
this.$(testSelector('theme-active', 'true')).find(testSelector('theme-delete-button')).length === 0,
this.$('[data-test-theme-active="true"]').find('[data-test-theme-delete-button]').length === 0,
'active theme doesn\'t have delete link'
).to.be.true;
});
@ -101,7 +100,7 @@ describe('Integration: Component: gh-theme-table', function() {
}}`);
run(() => {
this.$(`${testSelector('theme-id', 'Bar')} ${testSelector('theme-delete-button')}`).click();
this.$('[data-test-theme-id="Bar"] [data-test-theme-delete-button]').click();
});
expect(deleteAction.calledOnce).to.be.true;
@ -127,7 +126,7 @@ describe('Integration: Component: gh-theme-table', function() {
}}`);
run(() => {
this.$(`${testSelector('theme-id', 'Foo')} ${testSelector('theme-download-button')}`).click();
this.$('[data-test-theme-id="Foo"] [data-test-theme-download-button]').click();
});
expect(downloadAction.calledOnce).to.be.true;
@ -153,7 +152,7 @@ describe('Integration: Component: gh-theme-table', function() {
}}`);
run(() => {
this.$(`${testSelector('theme-id', 'Bar')} ${testSelector('theme-activate-button')}`).click();
this.$('[data-test-theme-id="Bar"] [data-test-theme-activate-button]').click();
});
expect(activateAction.calledOnce).to.be.true;
@ -178,7 +177,7 @@ describe('Integration: Component: gh-theme-table', function() {
deleteTheme=(action actionHandler)
}}`);
let packageNames = this.$(testSelector('theme-title')).map((i, name) => {
let packageNames = this.$('[data-test-theme-title]').map((i, name) => {
return $(name).text().trim();
}).toArray();

View File

@ -2,7 +2,6 @@ import Pretender from 'pretender';
import hbs from 'htmlbars-inline-precompile';
import run from 'ember-runloop';
import sinon from 'sinon';
import testSelector from 'ember-test-selectors';
import wait from 'ember-test-helpers/wait';
import {click, find, findAll} from 'ember-native-dom-helpers';
import {createFile} from '../../helpers/file-upload';
@ -194,15 +193,15 @@ describe('Integration: Component: gh-uploader', function() {
this.set('files', [createFile(), createFile()]);
run.later(() => {
expect(find(testSelector('progress-bar'))).to.exist;
let progressWidth = parseInt(find(testSelector('progress-bar')).style.width);
expect(find('[data-test-progress-bar]')).to.exist;
let progressWidth = parseInt(find('[data-test-progress-bar]').style.width);
expect(progressWidth).to.be.above(0);
expect(progressWidth).to.be.below(100);
}, 100);
await wait();
let progressWidth = parseInt(find(testSelector('progress-bar')).style.width);
let progressWidth = parseInt(find('[data-test-progress-bar]').style.width);
expect(progressWidth).to.equal(100);
});

1655
yarn.lock

File diff suppressed because it is too large Load Diff