mirror of https://github.com/TryGhost/Ghost.git
735 lines
31 KiB
JavaScript
735 lines
31 KiB
JavaScript
// # Editor Test
|
|
// Test the editor screen works as expected
|
|
|
|
/*globals CasperTest, casper, testPost, $ */
|
|
CasperTest.begin('Ghost editor functions correctly', 16, function suite(test) {
|
|
test.assertHTMLEquals = function (equals, message) {
|
|
test.assertEvalEquals(function () {
|
|
return document.querySelector('.entry-preview .rendered-markdown').innerHTML
|
|
.replace(/<script.*?><\/script>/g, '');
|
|
}, equals, message);
|
|
};
|
|
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
test.assertExists('.entry-markdown', 'Ghost editor is present');
|
|
test.assertExists('.entry-preview', 'Ghost preview is present');
|
|
});
|
|
|
|
// Part 1: Test saving with no data - title should default
|
|
casper.waitForSelector('#entry-title', function then() {
|
|
test.assertEvalEquals(function () {
|
|
return document.getElementById('entry-title').value;
|
|
}, '', 'Title is empty');
|
|
});
|
|
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function onSuccess() {
|
|
test.assert(true, 'Can save with no title.');
|
|
test.assertEvalEquals(function () {
|
|
return document.getElementById('entry-title').value;
|
|
}, '(Untitled)', 'Title is "(Untitled)"');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Failed to save without a title.');
|
|
});
|
|
|
|
casper.thenClick('.gh-notification-close');
|
|
|
|
// Part 2: Test saving with data
|
|
casper.then(function createTestPost() {
|
|
casper.sendKeys('#entry-title', testPost.title, {reset: true});
|
|
casper.writeContentToEditor(testPost.html);
|
|
|
|
// TODO: Expand markdown tests to cover more markdown, and keyboard shortcuts
|
|
casper.waitForSelectorTextChange('.entry-preview .rendered-markdown', function onSuccess() {
|
|
test.assertSelectorHasText(
|
|
'.entry-preview .rendered-markdown',
|
|
'I am a test post. \n\nI have some small content\n',
|
|
'Editor HTML preview has correct text.'
|
|
);
|
|
test.assertHTMLEquals(
|
|
'<p>I am a test post. </p>\n\n<h1 id=\"ihavesomesmallcontent\">I have some small content</h1>\n',
|
|
'generated HTML is correct'
|
|
);
|
|
}, casper.failOnTimeout(test, 'markdown did not re-render'));
|
|
});
|
|
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function onSuccess() {
|
|
test.assertUrlMatch(/ghost\/editor\/\d+\/$/, 'got an id on our URL');
|
|
test.assertEvalEquals(function () {
|
|
return document.querySelector('#entry-title').value;
|
|
}, testPost.title, 'Title is correct');
|
|
}, casper.failOnTimeout(test, 'Post was not successfully created'));
|
|
|
|
// Part 3: Test title trimming
|
|
var untrimmedTitle = ' test title ',
|
|
trimmedTitle = 'test title';
|
|
|
|
casper.then(function populateTitle() {
|
|
// Clear element
|
|
casper.evaluate(function () {
|
|
$('#entry-title').val('');
|
|
});
|
|
casper.sendKeys('#entry-title', untrimmedTitle);
|
|
casper.click('#entry-markdown-content');
|
|
|
|
test.assertEvalEquals(function () {
|
|
return $('#entry-title').val();
|
|
}, trimmedTitle, 'Entry title should match expected value.');
|
|
});
|
|
|
|
// Reset the editor
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testWordCount() {
|
|
// Part 4: Word count and plurality
|
|
casper.then(function checkZeroPlural() {
|
|
test.assertSelectorHasText('.entry-word-count', '0 words', 'count of 0 produces plural "words".');
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.writeContentToEditor('test');
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-word-count', function onSuccess() {
|
|
test.assertSelectorHasText('.entry-word-count', '1 word', 'count of 1 produces singular "word".');
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.writeContentToEditor('test');
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-word-count', function onSuccess() {
|
|
test.assertSelectorHasText('.entry-word-count', '2 words', 'count of 2 produces plural "words".');
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.writeContentToEditor('even **more** words'); // append another word, assumes newline
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-word-count', function onSuccess() {
|
|
test.assertSelectorHasText('.entry-word-count', '5 words', 'count of 5 produces plural "words".');
|
|
});
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Image Uploads', 23, function suite(test) {
|
|
test.assertHTMLEquals = function (equals, message) {
|
|
test.assertEvalEquals(function () {
|
|
return document.querySelector('.entry-preview .rendered-markdown').innerHTML
|
|
.replace(/<script.*?><\/script>/g, '');
|
|
}, equals, message);
|
|
};
|
|
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
//
|
|
// Test standard image upload modal
|
|
casper.then(function testImage() {
|
|
casper.writeContentToEditor('![some text]()');
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-preview .rendered-markdown', function onSuccess() {
|
|
test.assertEvalEquals(function () {
|
|
return document.querySelector('.entry-markdown-content textarea').value;
|
|
}, '![some text]()\n', 'Editor value is correct');
|
|
|
|
test.assertHTMLEquals('<section class=\"js-drop-zone image-uploader\" data-uploaderui=\"true\"><span class=\"media\"><span class=\"hidden\">Image Upload</span></span><img class=\"js-upload-target\" style=\"display: none; \" src=\"\"><div class=\"description\">Add image of <strong>some text</strong></div><input class=\"js-fileupload main fileupload\" type=\"file\" name=\"uploadimage\"><div class=\"js-fail failed\" style=\"display: none\">Something went wrong :(</div><button class=\"js-fail btn btn-green\" style=\"display: none\">Try Again</button><a class=\"image-url\" title=\"Add image from URL\"><i class=\"icon-link\"><span class=\"hidden\">URL</span></i></a></section>\n', 'HTML is correct');
|
|
|
|
test.assertSelectorHasText(
|
|
'.entry-preview .rendered-markdown', 'Add image of some text', 'Alt value is correct'
|
|
);
|
|
}, function onTimeout() {
|
|
test.assert('false', 'markdown did not re-render');
|
|
});
|
|
|
|
function assertEmptyImageUploaderDisplaysCorrectly() {
|
|
test.assertExists('.entry-preview .js-upload-target', 'Upload target exists');
|
|
test.assertExists('.entry-preview .js-fileupload', 'File upload target exists');
|
|
test.assertExists('.entry-preview .icon-link', 'Image URL button exists');
|
|
}
|
|
|
|
casper.then(function waitForUploader() {
|
|
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', assertEmptyImageUploaderDisplaysCorrectly);
|
|
});
|
|
|
|
// Test image URL upload modal
|
|
casper.thenClick('.entry-preview .image-uploader a.image-url');
|
|
|
|
casper.then(function checkUploader() {
|
|
casper.waitForSelector('.image-uploader-url', function onSuccess() {
|
|
test.assertExists('.image-uploader-url .url.js-upload-url', 'Image URL uploader exists');
|
|
test.assertExists('.image-uploader-url .btn-blue.js-button-accept', 'Image URL accept button exists');
|
|
test.assertExists('.image-uploader-url .image-upload', 'Back to normal image upload style button exists');
|
|
});
|
|
});
|
|
|
|
// Test image source location
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
var testFileLocation = '/test/file/location',
|
|
imageURL = 'http://www.random.url';
|
|
|
|
casper.then(function () {
|
|
var markdownImageString = '![](' + testFileLocation + ')';
|
|
casper.writeContentToEditor(markdownImageString);
|
|
});
|
|
|
|
casper.waitForSelector('img.js-upload-target', function () {
|
|
var imageJQuerySelector = '.entry-preview img.js-upload-target[src="' + testFileLocation + '"]';
|
|
test.assertExists(imageJQuerySelector, 'Uploaded image tag properly links to source location');
|
|
});
|
|
|
|
// Test cancel image button
|
|
casper.thenClick('.pre-image-uploader a.image-cancel.js-cancel');
|
|
|
|
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', assertEmptyImageUploaderDisplaysCorrectly);
|
|
|
|
// Test image url source location
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.writeContentToEditor('![]()');
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', function onSuccess() {
|
|
casper.thenClick('.entry-preview .image-uploader .image-url');
|
|
});
|
|
});
|
|
|
|
casper.then(function () {
|
|
casper.waitForSelector('.image-uploader-url', function onSuccess() {
|
|
casper.sendKeys('.image-uploader-url input.url.js-upload-url', imageURL);
|
|
casper.thenClick('.js-button-accept.btn-blue');
|
|
});
|
|
});
|
|
|
|
casper.waitForSelector('img.js-upload-target', function onSuccess() {
|
|
var imageJQuerySelector = '.entry-preview img.js-upload-target[src="' + imageURL + '"]';
|
|
test.assertExists(imageJQuerySelector, 'Uploaded image tag properly links to inputted image URL');
|
|
});
|
|
|
|
// Save the post with the image
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function onSuccess() {
|
|
test.assertUrlMatch(/ghost\/editor\/\d+\/$/, 'got an id on our URL');
|
|
}, casper.failOnTimeout(test, 'Post was not successfully created'));
|
|
|
|
casper.thenTransitionAndWaitForScreenLoad('content', function canTransition() {
|
|
test.assert(true, 'Can transition to content screen');
|
|
test.assertUrlMatch(/ghost\/\d+\/$/, 'content transitions to correct url');
|
|
});
|
|
|
|
// TODO fix this test
|
|
// Edit the draft post we just created
|
|
// casper.thenClick('a.post-edit');
|
|
//
|
|
// casper.waitForScreenLoad('editor.editing', function () {
|
|
// casper.writeContentToEditor('abcdefghijklmnopqrstuvwxyz');
|
|
// casper.waitForSelectorTextChange('.entry-preview .rendered-markdown', function onSuccess() {
|
|
// test.assertSelectorHasText(
|
|
// '.entry-preview .rendered-markdown',//
|
|
// 'abcdefghijklmnopqrstuvwxyz',
|
|
// 'Editor HTML preview has correct text after editing.'
|
|
// );
|
|
// }, casper.failOnTimeout(test, 'markdown did not re-render'));
|
|
//
|
|
// }, casper.failOnTimeout(test, 'Editor did not load'));
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - new post', 10, function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// ... check default option status, label, class
|
|
casper.then(function () {
|
|
test.assertExists('.js-publish-splitbutton', '.js-publish-splitbutton exists');
|
|
test.assertExists('.js-publish-button', '.js-publish-button exists');
|
|
test.assertExists('.js-publish-button.btn-blue', '.js-publish-button.btn-blue exists');
|
|
test.assertSelectorHasText('.js-publish-button', 'Save Draft', '.js-publish-button says Save Draft');
|
|
});
|
|
|
|
// Fill headline and content
|
|
casper.then(function fillContent() {
|
|
casper.sendKeys('#entry-title', 'Headline');
|
|
casper.writeContentToEditor('Just a bit of test text');
|
|
});
|
|
|
|
casper.then(function switchMenuToPublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:first-child a');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-red', 'Publish button should have .btn-red');
|
|
test.assertSelectorHasText('.js-publish-button', 'Publish Now', '.js-publish-button says Publish Now');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
// Do publish
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-blue', 'Update button should have .btn-blue');
|
|
test.assertSelectorHasText('.js-publish-button', 'Update Post', '.js-publish-button says Update Post');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - new page', 10, function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// ... check default option status, label, class
|
|
casper.then(function () {
|
|
test.assertExists('.js-publish-splitbutton', '.js-publish-splitbutton exists');
|
|
test.assertExists('.js-publish-button', '.js-publish-button exists');
|
|
test.assertExists('.js-publish-button.btn-blue', '.js-publish-button.btn-blue exists');
|
|
test.assertSelectorHasText('.js-publish-button', 'Save Draft', '.js-publish-button says Save Draft');
|
|
});
|
|
|
|
// Fill headline and content
|
|
casper.then(function fillContent() {
|
|
casper.sendKeys('#entry-title', 'Page Headline');
|
|
casper.writeContentToEditor('There once was a page, this was it');
|
|
});
|
|
|
|
// Open post settings menu
|
|
casper.thenClick('.post-settings');
|
|
|
|
// Check the checkbox is checked
|
|
casper.thenClick('label[for=static-page]');
|
|
|
|
casper.then(function switchMenuToPublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:first-child a');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-red', 'Publish button should have .btn-red');
|
|
test.assertSelectorHasText('.js-publish-button', 'Publish Now', '.js-publish-button says Publish Now');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
// Do publish
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-blue', 'Update button should have .btn-blue');
|
|
test.assertSelectorHasText('.js-publish-button', 'Update Page', '.js-publish-button says Update Page');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - existing post', 23, function suite(test) {
|
|
// Create a post, save it and test refreshed editor
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu', function onSuccess() {
|
|
test.assert(true, 'popup menu should be visible after clicking post-settings icon');
|
|
test.assertNotVisible(
|
|
'.js-publish-splitbutton .delete', 'delete post button shouldn\'t be visible on unsaved drafts'
|
|
);
|
|
});
|
|
|
|
casper.then(function createTestPost() {
|
|
casper.sendKeys('#entry-title', testPost.title);
|
|
casper.writeContentToEditor(testPost.html);
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-preview .rendered-markdown', function onSuccess() {
|
|
test.assertSelectorHasText('.entry-preview .rendered-markdown', 'test', 'Editor value is correct');
|
|
});
|
|
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
// Create a post in draft status
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function checkPostWasCreated() {
|
|
test.assertUrlMatch(/ghost\/editor\/\d+\/$/, 'got an id on our URL');
|
|
});
|
|
|
|
// ... check option status, label, class now that we're *saved* as 'draft'
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function () {
|
|
test.assertExists('.js-publish-splitbutton', '.js-publish-splitbutton exists');
|
|
test.assertExists('.js-publish-button', '.js-publish-button exists');
|
|
test.assertExists('.js-publish-button.btn-blue', '.js-publish-button.btn-blue exists');
|
|
test.assertSelectorHasText('.js-publish-button', 'Save Draft', '.js-publish-button says Save Draft');
|
|
});
|
|
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu', function onSuccess() {
|
|
test.assert(true, 'delete post button should be visible for saved drafts');
|
|
test.assertVisible(
|
|
'.js-publish-splitbutton .delete', 'delete post button should be visible on saved drafts'
|
|
);
|
|
});
|
|
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.then(function switchMenuToPublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:first-child a');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-red', 'Publish button should have .btn-red');
|
|
test.assertSelectorHasText('.js-publish-button', 'Publish Now', '.js-publish-button says Publish Now');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
// Do publish
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function checkPostWasCreated() {
|
|
test.assertUrlMatch(/ghost\/editor\/\d+\/$/, 'got an id on our URL');
|
|
});
|
|
|
|
// ... check option status, label, class for saved as 'published'
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function () {
|
|
test.assertExists('.js-publish-splitbutton', '.js-publish-splitbutton exists');
|
|
test.assertExists('.js-publish-button', '.js-publish-button exists');
|
|
test.assertExists('.js-publish-button.btn-blue', '.js-publish-button.btn-blue exists');
|
|
test.assertSelectorHasText('.js-publish-button', 'Update Post', '.js-publish-button says Update Post');
|
|
});
|
|
|
|
casper.then(function switchMenuToUnpublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:nth-child(2) a');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-red', 'Publish button should have .btn-red');
|
|
test.assertSelectorHasText('.js-publish-button', 'Unpublish', '.js-publish-button says Unpublish');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
// Do unpublish
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification', function checkPostWasCreated() {
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-blue', 'Publish button should have .btn-blue');
|
|
test.assertSelectorHasText('.js-publish-button', 'Save Draft', '.js-publish-button says Save Draft');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - delete post', 6, function testDeleteModal(test) {
|
|
// Create a post that can be deleted
|
|
CasperTest.Routines.createTestPost.run(false);
|
|
|
|
// Begin test
|
|
casper.thenOpenAndWaitForPageLoad('content', function testTitleAndUrl() {
|
|
test.assertTitle('Content - Test Blog', 'Title is "Content - Test Blog"');
|
|
test.assertUrlMatch(/ghost\/\d+\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// Transition to the editor
|
|
casper.thenClick('.post-edit');
|
|
casper.waitForSelector('#entry-title');
|
|
|
|
// Open post settings menu
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
casper.thenClick('.js-publish-splitbutton li:nth-child(4) a');
|
|
|
|
casper.waitUntilVisible('.modal-container', function onSuccess() {
|
|
test.assertSelectorHasText(
|
|
'.modal-content .modal-header',
|
|
'Are you sure you want to delete this post?',
|
|
'delete modal has correct text');
|
|
});
|
|
|
|
casper.thenClick('.js-button-reject');
|
|
|
|
casper.waitWhileVisible('.modal-container', function onSuccess() {
|
|
test.assert(true, 'clicking cancel should close the delete post modal');
|
|
});
|
|
|
|
// Test delete
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
casper.thenClick('.js-publish-splitbutton li:nth-child(4) a');
|
|
|
|
casper.waitForSelector('.modal-container .modal-content', function onSuccess() {
|
|
test.assertExists('.modal-content .js-button-accept', 'delete button exists');
|
|
|
|
// Delete the post
|
|
this.click('.modal-content .js-button-accept');
|
|
|
|
casper.waitWhileVisible('.modal-container', function onSuccess() {
|
|
test.assert(true, 'clicking delete button should close the delete post modal');
|
|
});
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - new post status is correct after failed save', 2, function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// Fill title and content
|
|
casper.then(function writePost() {
|
|
casper.sendKeys('#entry-title', new Array(160).join('x'));
|
|
});
|
|
|
|
casper.then(function switchMenuToPublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:first-child a');
|
|
});
|
|
|
|
// attempt to save
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
// Click on "Content" in the main nav
|
|
casper.thenClick('.gh-nav-main-content');
|
|
|
|
// The "Are you sure?" modal appears
|
|
casper.waitUntilVisible('.modal-content', function onSuccess() {
|
|
casper.thenClick('.btn-red');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Are you sure you want to leave modal did not appear.');
|
|
});
|
|
});
|
|
|
|
CasperTest.begin('Publish menu - existing post status is correct after failed save', 6, function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// Fill title and content
|
|
casper.then(function writePost() {
|
|
casper.sendKeys('#entry-title', 'a valid title');
|
|
casper.writeContentToEditor('body content');
|
|
});
|
|
|
|
// save
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification');
|
|
|
|
casper.then(function updateTitle() {
|
|
casper.sendKeys('#entry-title', new Array(160).join('y'));
|
|
});
|
|
|
|
casper.then(function switchMenuToPublish() {
|
|
// Open the publish options menu;
|
|
casper.thenClick('.js-publish-splitbutton .dropdown-toggle');
|
|
|
|
casper.waitForOpaque('.js-publish-splitbutton .dropdown-menu');
|
|
|
|
// Select the publish post button
|
|
casper.thenClick('.js-publish-splitbutton li:first-child a');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.js-publish-splitbutton .js-publish-button:not([disabled])', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-red', 'Publish button should have .btn-red');
|
|
test.assertSelectorHasText('.js-publish-button', 'Publish Now', '.js-publish-button says Publish Now');
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Publish split button works');
|
|
});
|
|
});
|
|
|
|
// attempt to save
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
// ... check status, label, class
|
|
casper.waitForSelector('.gh-alert-red', function onSuccess() {
|
|
test.assertExists('.js-publish-button.btn-blue', 'Update button should have .btn-blue');
|
|
// wait for button to settle
|
|
casper.wait(1100);
|
|
casper.then(function () {
|
|
test.assertSelectorHasText('.js-publish-button', 'Save Draft', '.js-publish-button says Save Draft');
|
|
});
|
|
}, function onTimeout() {
|
|
test.assert(false, 'Saving post with invalid title should trigger an error');
|
|
});
|
|
});
|
|
|
|
// test the markdown help modal
|
|
CasperTest.begin('Markdown help modal', 5, function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// open markdown help modal
|
|
casper.thenClick('a.markdown-help');
|
|
|
|
casper.waitUntilVisible('.modal-container', function onSuccess() {
|
|
test.assertSelectorHasText(
|
|
'.modal-content .modal-header',
|
|
'Markdown Help',
|
|
'delete modal has correct text');
|
|
|
|
test.assertExists('.modal-content .close', '.modal-content .close exists');
|
|
});
|
|
|
|
casper.thenClick('.modal-content .close');
|
|
|
|
casper.waitWhileVisible('.modal-container', function onSuccess() {
|
|
test.assert(true, 'clicking close should remove the markdown help modal');
|
|
});
|
|
});
|
|
|
|
// test editor title input is correct after changing a post attribute in the post-settings-menu
|
|
CasperTest.begin('Title input is set correctly after using the Post-Settings-Menu', function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// add a new post
|
|
casper.then(function fillContent() {
|
|
casper.sendKeys('#entry-title', 'post title', {reset: true});
|
|
casper.writeContentToEditor('Just a bit of test text');
|
|
});
|
|
|
|
// save draft
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification');
|
|
|
|
// change the title
|
|
casper.then(function updateTitle() {
|
|
casper.sendKeys('#entry-title', 'changed post title', {reset: true});
|
|
casper.click('#entry-markdown-content');
|
|
});
|
|
|
|
// change a post attribute via the post-settings-menu
|
|
|
|
casper.thenClick('.post-settings');
|
|
|
|
casper.then(function () {
|
|
this.fillSelectors('.settings-menu form', {
|
|
'#url': 'changed-slug'
|
|
}, false);
|
|
|
|
this.click('.post-settings');
|
|
});
|
|
|
|
casper.waitForResource(/\/posts\/\d+\/\?include=tags/, function testGoodResponse(resource) {
|
|
test.assert(resource.status < 400);
|
|
});
|
|
|
|
casper.then(function checkTitleInput() {
|
|
test.assertEvalEquals(function () {
|
|
return $('#entry-title').val();
|
|
}, 'changed post title', 'Title input should match expected value.');
|
|
});
|
|
});
|
|
|
|
// test editor content input is correct after changing a post attribute in the post-settings-menu
|
|
CasperTest.begin('Editor content is set correctly after using the Post-Settings-Menu', function suite(test) {
|
|
casper.thenOpenAndWaitForPageLoad('editor', function testTitleAndUrl() {
|
|
test.assertTitle('Editor - Test Blog', 'Ghost admin has incorrect title');
|
|
test.assertUrlMatch(/ghost\/editor\/$/, 'Landed on the correct URL');
|
|
});
|
|
|
|
// add a new post
|
|
casper.then(function fillContent() {
|
|
casper.sendKeys('#entry-title', 'post title');
|
|
casper.writeContentToEditor('Just a bit of test text');
|
|
});
|
|
|
|
// save draft
|
|
casper.thenClick('.js-publish-button');
|
|
|
|
casper.waitForSelector('.gh-notification');
|
|
|
|
// change the content
|
|
casper.then(function updateContent() {
|
|
casper.writeContentToEditor('updated content');
|
|
casper.click('#entry-title');
|
|
});
|
|
|
|
// change a post attribute via the post-settings-menu
|
|
|
|
casper.thenClick('.post-settings');
|
|
|
|
casper.then(function () {
|
|
this.fillSelectors('.settings-menu form', {
|
|
'#url': 'changed-slug-after-update'
|
|
}, false);
|
|
|
|
this.click('.post-settings');
|
|
});
|
|
|
|
casper.waitForResource(/\/posts\/\d+\/\?include=tags/, function testGoodResponse(resource) {
|
|
test.assert(resource.status < 400);
|
|
});
|
|
|
|
casper.waitForSelectorTextChange('.entry-preview .rendered-markdown', function onSuccess() {
|
|
test.assertSelectorHasText(
|
|
'.entry-preview .rendered-markdown',
|
|
'updated content',
|
|
'Editor has correct content.'
|
|
);
|
|
}, casper.failOnTimeout(test, 'markdown was not available'));
|
|
});
|