Ghost-Admin/tests/acceptance/settings/tags-test.js

284 lines
10 KiB
JavaScript

/* jshint expr:true */
/* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
import {
describe,
it,
beforeEach,
afterEach
} from 'mocha';
import { expect } from 'chai';
import Ember from 'ember';
import startApp from '../../helpers/start-app';
import destroyApp from '../../helpers/destroy-app';
import { invalidateSession, authenticateSession } from 'ghost/tests/helpers/ember-simple-auth';
const {run} = Ember;
// Grabbed from keymaster's testing code because Ember's `keyEvent` helper
// is for some reason not triggering the events in a way that keymaster detects:
// https://github.com/madrobby/keymaster/blob/master/test/keymaster.html#L31
const modifierMap = {
16: 'shiftKey',
18: 'altKey',
17: 'ctrlKey',
91: 'metaKey'
};
let keydown = function (code, modifiers, el) {
let event = document.createEvent('Event');
event.initEvent('keydown', true, true);
event.keyCode = code;
if (modifiers && modifiers.length > 0) {
for (let i in modifiers) {
event[modifierMap[modifiers[i]]] = true;
}
}
(el || document).dispatchEvent(event);
};
let keyup = function (code, el) {
let event = document.createEvent('Event');
event.initEvent('keyup', true, true);
event.keyCode = code;
(el || document).dispatchEvent(event);
};
describe('Acceptance: Settings - Tags', function () {
let application;
beforeEach(function () {
application = startApp();
});
afterEach(function () {
destroyApp(application);
});
it('redirects to signin when not authenticated', function () {
invalidateSession(application);
visit('/settings/tags');
andThen(() => {
expect(currentURL()).to.equal('/signin');
});
});
it('redirects to team page when authenticated as author', function () {
let role = server.create('role', {name: 'Author'});
let user = server.create('user', {roles: [role], slug: 'test-user'});
authenticateSession(application);
visit('/settings/navigation');
andThen(() => {
expect(currentURL(), 'currentURL').to.equal('/team/test-user');
});
});
describe('when logged in', function () {
beforeEach(function () {
let role = server.create('role', {name: 'Administrator'});
let user = server.create('user', {roles: [role]});
// load the settings fixtures
// TODO: this should always be run for acceptance tests
server.loadFixtures();
return authenticateSession(application);
});
it('it renders, can be navigated, can edit, create & delete tags', function () {
let tag1 = server.create('tag');
let tag2 = server.create('tag');
visit('/settings/tags');
andThen(() => {
// it redirects to first tag
expect(currentURL(), 'currentURL').to.equal(`/settings/tags/${tag1.slug}`);
// it has correct page title
expect(document.title, 'page title').to.equal('Settings - Tags - Test Blog');
// it highlights nav menu
expect($('.gh-nav-settings-tags').hasClass('active'), 'highlights nav menu item')
.to.be.true;
// it lists all tags
expect(find('.settings-tags .settings-tag').length, 'tag list count')
.to.equal(2);
expect(find('.settings-tags .settings-tag:first .tag-title').text(), 'tag list item title')
.to.equal(tag1.name);
// it highlights selected tag
expect(find(`a[href="/settings/tags/${tag1.slug}"]`).hasClass('active'), 'highlights selected tag')
.to.be.true;
// it shows selected tag form
expect(find('.tag-settings-pane h4').text(), 'settings pane title')
.to.equal('Tag Settings');
expect(find('.tag-settings-pane input[name="name"]').val(), 'loads correct tag into form')
.to.equal(tag1.name);
});
// click the second tag in the list
click('.tag-edit-button:last');
andThen(() => {
// it navigates to selected tag
expect(currentURL(), 'url after clicking tag').to.equal(`/settings/tags/${tag2.slug}`);
// it highlights selected tag
expect(find(`a[href="/settings/tags/${tag2.slug}"]`).hasClass('active'), 'highlights selected tag')
.to.be.true;
// it shows selected tag form
expect(find('.tag-settings-pane input[name="name"]').val(), 'loads correct tag into form')
.to.equal(tag2.name);
});
andThen(() => {
// simulate up arrow press
run(() => {
keydown(38);
keyup(38);
});
});
andThen(() => {
// it navigates to previous tag
expect(currentURL(), 'url after keyboard up arrow').to.equal(`/settings/tags/${tag1.slug}`);
// it highlights selected tag
expect(find(`a[href="/settings/tags/${tag1.slug}"]`).hasClass('active'), 'selects previous tag')
.to.be.true;
});
andThen(() => {
// simulate down arrow press
run(() => {
keydown(40);
keyup(40);
});
});
andThen(() => {
// it navigates to previous tag
expect(currentURL(), 'url after keyboard down arrow').to.equal(`/settings/tags/${tag2.slug}`);
// it highlights selected tag
expect(find(`a[href="/settings/tags/${tag2.slug}"]`).hasClass('active'), 'selects next tag')
.to.be.true;
});
// trigger save
fillIn('.tag-settings-pane input[name="name"]', 'New Name');
triggerEvent('.tag-settings-pane input[name="name"]', 'blur');
andThen(() => {
// check we update with the data returned from the server
expect(find('.settings-tags .settings-tag:last .tag-title').text(), 'tag list updates on save')
.to.equal('New Name');
expect(find('.tag-settings-pane input[name="name"]').val(), 'settings form updates on save')
.to.equal('New Name');
});
// start new tag
click('.view-actions .btn-green');
andThen(() => {
// it navigates to the new tag route
expect(currentURL(), 'new tag URL').to.equal('/settings/tags/new');
// it displays the new tag form
expect(find('.tag-settings-pane h4').text(), 'settings pane title')
.to.equal('New Tag');
// all fields start blank
find('.tag-settings-pane input, .tag-settings-pane textarea').each(function () {
expect($(this).val(), `input field for ${$(this).attr('name')}`)
.to.be.blank;
});
});
// save new tag
fillIn('.tag-settings-pane input[name="name"]', 'New Tag');
triggerEvent('.tag-settings-pane input[name="name"]', 'blur');
andThen(() => {
// it redirects to the new tag's URL
expect(currentURL(), 'URL after tag creation').to.equal('/settings/tags/new-tag');
// it adds the tag to the list and selects
expect(find('.settings-tags .settings-tag').length, 'tag list count after creation')
.to.equal(3);
expect(find('.settings-tags .settings-tag:last .tag-title').text(), 'new tag list item title')
.to.equal('New Tag');
expect(find('a[href="/settings/tags/new-tag"]').hasClass('active'), 'highlights new tag')
.to.be.true;
});
// delete tag
click('.tag-delete-button');
click('.modal-container .btn-red');
andThen(() => {
// it redirects to the first tag
expect(currentURL(), 'URL after tag deletion').to.equal(`/settings/tags/${tag1.slug}`);
// it removes the tag from the list
expect(find('.settings-tags .settings-tag').length, 'tag list count after deletion')
.to.equal(2);
});
});
it('loads tag via slug when accessed directly', function () {
server.createList('tag', 2);
visit('/settings/tags/tag-1');
andThen(() => {
expect(currentURL(), 'URL after direct load').to.equal('/settings/tags/tag-1');
// it loads all other tags
expect(find('.settings-tags .settings-tag').length, 'tag list count after direct load')
.to.equal(2);
// selects tag in list
expect(find('a[href="/settings/tags/tag-1"]').hasClass('active'), 'highlights requested tag')
.to.be.true;
// shows requested tag in settings pane
expect(find('.tag-settings-pane input[name="name"]').val(), 'loads correct tag into form')
.to.equal('Tag 1');
});
});
it('has infinite scroll pagination of tags list', function () {
server.createList('tag', 32);
visit('settings/tags/tag-0');
andThen(() => {
// it loads first page
expect(find('.settings-tags .settings-tag').length, 'tag list count on first load')
.to.equal(15);
find('.tag-list').scrollTop(find('.tag-list-content').height());
});
wait().then(() => {
// it loads the second page
expect(find('.settings-tags .settings-tag').length, 'tag list count on second load')
.to.equal(30);
find('.tag-list').scrollTop(find('.tag-list-content').height());
});
wait().then(() => {
// it loads the final page
expect(find('.settings-tags .settings-tag').length, 'tag list count on third load')
.to.equal(32);
});
});
});
});