Ghost/ghost/admin/tests/acceptance/settings/labs-test.js

342 lines
13 KiB
JavaScript
Raw Normal View History

import {authenticateSession, invalidateSession} from 'ember-simple-auth/test-support';
import {beforeEach, describe, it} from 'mocha';
import {click, currentURL, fillIn, find, findAll} from '@ember/test-helpers';
import {expect} from 'chai';
import {fileUpload} from '../../helpers/file-upload';
import {setupApplicationTest} from 'ember-mocha';
import {setupMirage} from 'ember-cli-mirage/test-support';
import {visit} from '../../helpers/visit';
// import wait from 'ember-test-helpers/wait';
// import {timeout} from 'ember-concurrency';
describe('Acceptance: Settings - Labs', function () {
let hooks = setupApplicationTest();
setupMirage(hooks);
it('redirects to signin when not authenticated', async function () {
await invalidateSession();
await visit('/settings/labs');
expect(currentURL(), 'currentURL').to.equal('/signin');
});
Refactored away CurrentUserSettings mixin (#2200) no issue Mixins are deprecated in Ember so we want to remove their usage. The `CurrentUserSettings` mixin was used in Route files to provide `transitionAuthor()` (that also transitions contributors) and `transitionEditor()` methods so the the consuming route could use them to prevent access to authors/editors. In practice the only reason this was used was to prevent access to admin-only routes. - added an `AdminRoute` class that inherits from our `AuthenticatedRoute` class - when any route inherits from this class it will only allow access to admins and owners, any other user will be redirected to the home screen (dashboard or site depending on permissions) - updated all of our admin-only routes to use the new `AdminRoute` - allowed for removal of `CurrentUserSettings` mixin usage - allowed for `beforeModel()` hooks to be removed from consuming routes in many cases - some admin-only routes were extending/inheriting directly from Ember's `Route` based on the assumption that the router hierarchy would have a parent route perform the redirect. Those have also been switched to `AdminRoute` for consistency and to prevent accidentally making them available if the router hierarchy changes - `/#/settings` does not use the `AdminRoute` so that it can redirect to the current user's setting page for non-admin users - removed `CurrentUserSettings` mixin file - cleaned up unnecessary computed property and function used for redirect-when-disabled in the Zapier route
2022-01-17 13:05:27 +03:00
it('redirects to home page when authenticated as contributor', async function () {
let role = this.server.create('role', {name: 'Contributor'});
this.server.create('user', {roles: [role], slug: 'test-user'});
await authenticateSession();
await visit('/settings/labs');
2022-02-02 12:57:34 +03:00
expect(currentURL(), 'currentURL').to.equal('/posts');
});
Refactored away CurrentUserSettings mixin (#2200) no issue Mixins are deprecated in Ember so we want to remove their usage. The `CurrentUserSettings` mixin was used in Route files to provide `transitionAuthor()` (that also transitions contributors) and `transitionEditor()` methods so the the consuming route could use them to prevent access to authors/editors. In practice the only reason this was used was to prevent access to admin-only routes. - added an `AdminRoute` class that inherits from our `AuthenticatedRoute` class - when any route inherits from this class it will only allow access to admins and owners, any other user will be redirected to the home screen (dashboard or site depending on permissions) - updated all of our admin-only routes to use the new `AdminRoute` - allowed for removal of `CurrentUserSettings` mixin usage - allowed for `beforeModel()` hooks to be removed from consuming routes in many cases - some admin-only routes were extending/inheriting directly from Ember's `Route` based on the assumption that the router hierarchy would have a parent route perform the redirect. Those have also been switched to `AdminRoute` for consistency and to prevent accidentally making them available if the router hierarchy changes - `/#/settings` does not use the `AdminRoute` so that it can redirect to the current user's setting page for non-admin users - removed `CurrentUserSettings` mixin file - cleaned up unnecessary computed property and function used for redirect-when-disabled in the Zapier route
2022-01-17 13:05:27 +03:00
it('redirects to home page when authenticated as author', async function () {
let role = this.server.create('role', {name: 'Author'});
this.server.create('user', {roles: [role], slug: 'test-user'});
await authenticateSession();
await visit('/settings/labs');
Refactored away CurrentUserSettings mixin (#2200) no issue Mixins are deprecated in Ember so we want to remove their usage. The `CurrentUserSettings` mixin was used in Route files to provide `transitionAuthor()` (that also transitions contributors) and `transitionEditor()` methods so the the consuming route could use them to prevent access to authors/editors. In practice the only reason this was used was to prevent access to admin-only routes. - added an `AdminRoute` class that inherits from our `AuthenticatedRoute` class - when any route inherits from this class it will only allow access to admins and owners, any other user will be redirected to the home screen (dashboard or site depending on permissions) - updated all of our admin-only routes to use the new `AdminRoute` - allowed for removal of `CurrentUserSettings` mixin usage - allowed for `beforeModel()` hooks to be removed from consuming routes in many cases - some admin-only routes were extending/inheriting directly from Ember's `Route` based on the assumption that the router hierarchy would have a parent route perform the redirect. Those have also been switched to `AdminRoute` for consistency and to prevent accidentally making them available if the router hierarchy changes - `/#/settings` does not use the `AdminRoute` so that it can redirect to the current user's setting page for non-admin users - removed `CurrentUserSettings` mixin file - cleaned up unnecessary computed property and function used for redirect-when-disabled in the Zapier route
2022-01-17 13:05:27 +03:00
expect(currentURL(), 'currentURL').to.equal('/site');
});
Refactored away CurrentUserSettings mixin (#2200) no issue Mixins are deprecated in Ember so we want to remove their usage. The `CurrentUserSettings` mixin was used in Route files to provide `transitionAuthor()` (that also transitions contributors) and `transitionEditor()` methods so the the consuming route could use them to prevent access to authors/editors. In practice the only reason this was used was to prevent access to admin-only routes. - added an `AdminRoute` class that inherits from our `AuthenticatedRoute` class - when any route inherits from this class it will only allow access to admins and owners, any other user will be redirected to the home screen (dashboard or site depending on permissions) - updated all of our admin-only routes to use the new `AdminRoute` - allowed for removal of `CurrentUserSettings` mixin usage - allowed for `beforeModel()` hooks to be removed from consuming routes in many cases - some admin-only routes were extending/inheriting directly from Ember's `Route` based on the assumption that the router hierarchy would have a parent route perform the redirect. Those have also been switched to `AdminRoute` for consistency and to prevent accidentally making them available if the router hierarchy changes - `/#/settings` does not use the `AdminRoute` so that it can redirect to the current user's setting page for non-admin users - removed `CurrentUserSettings` mixin file - cleaned up unnecessary computed property and function used for redirect-when-disabled in the Zapier route
2022-01-17 13:05:27 +03:00
it('redirects to home page when authenticated as editor', async function () {
let role = this.server.create('role', {name: 'Editor'});
this.server.create('user', {roles: [role], slug: 'test-user'});
await authenticateSession();
await visit('/settings/labs');
Refactored away CurrentUserSettings mixin (#2200) no issue Mixins are deprecated in Ember so we want to remove their usage. The `CurrentUserSettings` mixin was used in Route files to provide `transitionAuthor()` (that also transitions contributors) and `transitionEditor()` methods so the the consuming route could use them to prevent access to authors/editors. In practice the only reason this was used was to prevent access to admin-only routes. - added an `AdminRoute` class that inherits from our `AuthenticatedRoute` class - when any route inherits from this class it will only allow access to admins and owners, any other user will be redirected to the home screen (dashboard or site depending on permissions) - updated all of our admin-only routes to use the new `AdminRoute` - allowed for removal of `CurrentUserSettings` mixin usage - allowed for `beforeModel()` hooks to be removed from consuming routes in many cases - some admin-only routes were extending/inheriting directly from Ember's `Route` based on the assumption that the router hierarchy would have a parent route perform the redirect. Those have also been switched to `AdminRoute` for consistency and to prevent accidentally making them available if the router hierarchy changes - `/#/settings` does not use the `AdminRoute` so that it can redirect to the current user's setting page for non-admin users - removed `CurrentUserSettings` mixin file - cleaned up unnecessary computed property and function used for redirect-when-disabled in the Zapier route
2022-01-17 13:05:27 +03:00
expect(currentURL(), 'currentURL').to.equal('/site');
});
describe('when logged in', function () {
beforeEach(async function () {
let role = this.server.create('role', {name: 'Administrator'});
this.server.create('user', {roles: [role]});
return await authenticateSession();
});
it('it renders', async function () {
await visit('/settings/labs');
// has correct url
expect(currentURL(), 'currentURL').to.equal('/settings/labs');
// has correct page title
expect(document.title, 'page title').to.equal('Settings - Labs - Test Blog');
// highlights nav menu
expect(find('[data-test-nav="settings"]'), 'highlights nav menu item')
.to.have.class('active');
});
it('can delete all content', async function () {
await visit('/settings/labs');
await click('[data-test-button="delete-all"]');
const modal = '[data-test-modal="confirm-delete-all"]';
expect(find(modal)).to.exist;
await click(`${modal} [data-test-button="confirm"]`);
// API request is correct
const [lastRequest] = this.server.pretender.handledRequests.slice(-1);
expect(lastRequest.url).to.equal('/ghost/api/admin/db/');
expect(lastRequest.method).to.equal('DELETE');
expect(find(modal)).to.not.exist;
});
it('can upload/download redirects', async function () {
await visit('/settings/labs');
// successful upload
this.server.post('/redirects/upload/', {}, 200);
await fileUpload(
'[data-test-file-input="redirects"] input',
['test'],
{name: 'redirects.json', type: 'application/json'}
);
// TODO: tests for the temporary success/failure state have been
// disabled because they were randomly failing
// this should be half-way through button reset timeout
// await timeout(50);
//
// // shows success button
// let buttons = findAll('[data-test-button="upload-redirects"]');
// expect(buttons.length, 'no of success buttons').to.equal(1);
// expect(
// buttons[0],
// 'success button is green'
// ).to.have.class('gh-btn-green);
// expect(
// button.textContent,
// 'success button text'
// ).to.have.string('Uploaded');
//
// await wait();
// returned to normal button
let buttons = findAll('[data-test-button="upload-redirects"]');
expect(buttons.length, 'no of post-success buttons').to.equal(1);
expect(
buttons[0],
'post-success button doesn\'t have success class'
).to.not.have.class('gh-btn-green');
expect(
buttons[0].textContent,
'post-success button text'
).to.have.string('Upload redirects');
// failed upload
this.server.post('/redirects/upload/', {
errors: [{
type: 'BadRequestError',
message: 'Test failure message'
}]
}, 400);
await fileUpload(
'[data-test-file-input="redirects"] input',
['test'],
{name: 'redirects-bad.json', type: 'application/json'}
);
// TODO: tests for the temporary success/failure state have been
// disabled because they were randomly failing
// this should be half-way through button reset timeout
// await timeout(50);
//
// shows failure button
// buttons = findAll('[data-test-button="upload-redirects"]');
// expect(buttons.length, 'no of failure buttons').to.equal(1);
// expect(
// buttons[0],
// 'failure button is red'
// ).to.have.class('gh-btn-red);
// expect(
// buttons[0].textContent,
// 'failure button text'
// ).to.have.string('Upload Failed');
//
// await wait();
// shows error message
expect(
find('[data-test-error="redirects"]').textContent.trim(),
'upload error text'
).to.have.string('Test failure message');
// returned to normal button
buttons = findAll('[data-test-button="upload-redirects"]');
expect(buttons.length, 'no of post-failure buttons').to.equal(1);
expect(
buttons[0],
'post-failure button doesn\'t have failure class'
).to.not.have.class('gh-btn-red');
expect(
buttons[0].textContent,
'post-failure button text'
).to.have.string('Upload redirects');
// successful upload clears error
this.server.post('/redirects/upload/', {}, 200);
await fileUpload(
'[data-test-file-input="redirects"] input',
['test'],
{name: 'redirects-bad.json', type: 'application/json'}
);
expect(find('[data-test-error="redirects"]')).to.not.exist;
// can download redirects.json
await click('[data-test-link="download-redirects"]');
let iframe = document.querySelector('#iframeDownload');
expect(iframe.getAttribute('src')).to.have.string('/redirects/download/');
});
it('can upload/download routes.yaml', async function () {
await visit('/settings/labs');
// successful upload
this.server.post('/settings/routes/yaml/', {}, 200);
await fileUpload(
'[data-test-file-input="routes"] input',
['test'],
{name: 'routes.yaml', type: 'application/x-yaml'}
);
// TODO: tests for the temporary success/failure state have been
// disabled because they were randomly failing
// this should be half-way through button reset timeout
// await timeout(50);
//
// // shows success button
// let button = find('[data-test-button="upload-routes"]');
// expect(button.length, 'no of success buttons').to.equal(1);
// expect(
// button.hasClass('gh-btn-green'),
// 'success button is green'
// ).to.be.true;
// expect(
// button.text().trim(),
// 'success button text'
// ).to.have.string('Uploaded');
//
// await wait();
// returned to normal button
let buttons = findAll('[data-test-button="upload-routes"]');
expect(buttons.length, 'no of post-success buttons').to.equal(1);
expect(
buttons[0],
'routes post-success button doesn\'t have success class'
).to.not.have.class('gh-btn-green');
expect(
buttons[0].textContent,
'routes post-success button text'
).to.have.string('Upload routes YAML');
// failed upload
this.server.post('/settings/routes/yaml/', {
errors: [{
type: 'BadRequestError',
message: 'Test failure message'
}]
}, 400);
await fileUpload(
'[data-test-file-input="routes"] input',
['test'],
{name: 'routes-bad.yaml', type: 'application/x-yaml'}
);
// TODO: tests for the temporary success/failure state have been
// disabled because they were randomly failing
// this should be half-way through button reset timeout
// await timeout(50);
//
// shows failure button
// button = find('[data-test-button="upload-routes"]');
// expect(button.length, 'no of failure buttons').to.equal(1);
// expect(
// button.hasClass('gh-btn-red'),
// 'failure button is red'
// ).to.be.true;
// expect(
// button.text().trim(),
// 'failure button text'
// ).to.have.string('Upload Failed');
//
// await wait();
// shows error message
expect(
find('[data-test-error="routes"]').textContent,
'routes upload error text'
).to.have.string('Test failure message');
// returned to normal button
buttons = findAll('[data-test-button="upload-routes"]');
expect(buttons.length, 'no of post-failure buttons').to.equal(1);
expect(
buttons[0],
'routes post-failure button doesn\'t have failure class'
).to.not.have.class('gh-btn-red');
expect(
buttons[0].textContent,
'routes post-failure button text'
).to.have.string('Upload routes YAML');
// successful upload clears error
this.server.post('/settings/routes/yaml/', {}, 200);
await fileUpload(
'[data-test-file-input="routes"] input',
['test'],
{name: 'routes-good.yaml', type: 'application/x-yaml'}
);
expect(find('[data-test-error="routes"]')).to.not.exist;
// can download redirects.json
await click('[data-test-link="download-routes"]');
let iframe = document.querySelector('#iframeDownload');
expect(iframe.getAttribute('src')).to.have.string('/settings/routes/yaml/');
});
});
describe('When logged in as Owner', function () {
beforeEach(async function () {
let role = this.server.create('role', {name: 'Owner'});
this.server.create('user', {roles: [role]});
return await authenticateSession();
});
it.skip('sets the mailgunBaseUrl to the default', async function () {
2021-01-22 11:59:30 +03:00
await visit('/settings/members');
await fillIn('[data-test-mailgun-api-key-input]', 'i_am_an_api_key');
await fillIn('[data-test-mailgun-domain-input]', 'https://domain.tld');
await click('[data-test-button="save-members-settings"]');
let [lastRequest] = this.server.pretender.handledRequests.slice(-1);
let params = JSON.parse(lastRequest.requestBody);
expect(params.settings.findBy('key', 'mailgun_base_url').value).not.to.equal(null);
});
});
});