Fix image uploader and update tests

No Issue

- fixes removal of url link on image uploader
- fixes functional tests for editor and content
This commit is contained in:
cobbspur 2015-05-20 19:22:29 +01:00 committed by Hannah Wolfe
parent 5012657163
commit dd20790bd9
5 changed files with 74 additions and 88 deletions

View File

@ -70,7 +70,7 @@ UploadUi = function ($dropzone, settings) {
$dropzone.find('.js-url').remove();
$progress.find('.js-upload-progress-bar').removeClass('fail');
$dropzone.trigger('uploadstart', [$dropzone.attr('id')]);
$dropzone.find('span.media, div.description, a.icon-link, a.image-webcam')
$dropzone.find('span.media, div.description, a.image-url, a.image-webcam')
.animate({opacity: 0}, 250, function () {
$dropzone.find('div.description').hide().css({opacity: 100});
if (settings.progressbar) {
@ -139,7 +139,7 @@ UploadUi = function ($dropzone, settings) {
},
removeExtras: function () {
$dropzone.find('span.media, div.js-upload-progress, a.icon-link, a.image-upload, a.image-webcam, div.js-fail, button.js-fail, a.js-cancel').remove();
$dropzone.find('span.media, div.js-upload-progress, a.image-url, a.image-upload, a.image-webcam, div.js-fail, button.js-fail, a.js-cancel').remove();
},
initWithDropzone: function () {
@ -156,7 +156,7 @@ UploadUi = function ($dropzone, settings) {
self.initUrl();
return;
}
$dropzone.find('a.icon-link').on('click', function () {
$dropzone.find('a.image-url').on('click', function () {
self.initUrl();
});
},

View File

@ -75,6 +75,11 @@ screens = {
linkSelector: '.gh-nav-main-editor',
selector: '.gh-nav-main-editor.active'
},
'editor.editing': {
url: 'ghost/editor/',
linkSelector: 'a.post-edit',
selector: '.entry-markdown-content .markdown-editor'
},
settings: {
url: 'ghost/settings/',
linkSelector: '.gh-nav-settings-general',
@ -190,18 +195,21 @@ casper.thenOpenAndWaitForPageLoad = function (screen, then, timeout) {
timeout = timeout || casper.failOnTimeout(casper.test, 'Unable to load ' + screen);
return casper.thenOpen(url + screens[screen].url).then(function () {
// Some screens fade in
return casper.waitForOpaque(screens[screen].selector, then, timeout, 10000);
return casper.waitForScreenLoad(screen, then, timeout);
});
};
casper.waitForScreenLoad = function (screen, then, timeout) {
// Some screens fade in
return casper.waitForOpaque(screens[screen].selector, then, timeout, 10000);
};
casper.thenTransitionAndWaitForScreenLoad = function (screen, then, timeout) {
then = then || function () {};
timeout = timeout || casper.failOnTimeout(casper.test, 'Unable to load ' + screen);
return casper.thenClick(screens[screen].linkSelector).then(function () {
// Some screens fade in
return casper.waitForOpaque(screens[screen].selector, then, timeout, 10000);
return casper.waitForScreenLoad(screen, then, timeout);
});
};

View File

@ -16,9 +16,9 @@ CasperTest.begin('Content screen is correct', 17, function suite(test) {
casper.then(function testViews() {
test.assertExists('.content-view-container', 'Content main view is present');
test.assertExists('.content-list-content', 'Content list view is present');
test.assertExists('.content-list .floatingheader a.btn.btn-green', 'add new post button exists');
test.assertExists('.gh-nav-main-editor', 'add new post button exists');
test.assertEquals(
this.getElementAttribute('.content-list .floatingheader a.btn.btn-green', 'href'),
this.getElementAttribute('.gh-nav-main-editor', 'href'),
'/ghost/editor/', 'add new post href is correct'
);
test.assertExists('.content-list-content li .entry-title', 'Content list view has at least one item');

View File

@ -2,7 +2,7 @@
// Test the editor screen works as expected
/*globals CasperTest, casper, testPost, $ */
CasperTest.begin('Ghost editor functions correctly', 20, function suite(test) {
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
@ -35,26 +35,27 @@ CasperTest.begin('Ghost editor functions correctly', 20, function suite(test) {
test.assert(false, 'Failed to save without a title.');
});
this.thenClick('.js-bb-notification .close');
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.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');
@ -113,36 +114,9 @@ CasperTest.begin('Ghost editor functions correctly', 20, function suite(test) {
test.assertSelectorHasText('.entry-word-count', '5 words', 'count of 5 produces plural "words".');
});
});
// Part 5: Editor global shortcuts
casper.then(function tryZenShortcut() {
casper.sendKeys('.page-content', 'z', {modifiers: 'alt+shift'});
});
casper.waitForSelector('.editor.zen', function then() {
casper.waitForTransparent('.global-nav', function then() {
test.assert(true, 'header becomes transparent');
});
casper.waitForTransparent('#publish-bar', function then() {
test.assert(true, 'publish bar becomes transparent');
});
});
casper.then(function tryZenShortcut() {
casper.sendKeys('.page-content', 'z', {modifiers: 'alt+shift'});
});
casper.waitWhileSelector('.editor.zen', function then() {
casper.waitForOpaque('.global-nav', function then() {
test.assert(true, 'header becomes opaque');
});
casper.waitForOpaque('#publish-bar', function then() {
test.assert(true, 'publish bar becomes opaque');
});
});
});
CasperTest.begin('Image Uploads', 24, function suite(test) {
CasperTest.begin('Image Uploads', 23, function suite(test) {
test.assertHTMLEquals = function (equals, message) {
test.assertEvalEquals(function () {
return document.querySelector('.entry-preview .rendered-markdown').innerHTML
@ -154,7 +128,7 @@ CasperTest.begin('Image Uploads', 24, function suite(test) {
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]()');
@ -165,15 +139,7 @@ CasperTest.begin('Image Uploads', 24, function suite(test) {
return document.querySelector('.entry-markdown-content textarea').value;
}, '![some text]()\n', 'Editor value is correct');
test.assertHTMLEquals('<section class=\"js-drop-zone image-uploader\">' +
'<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=\"icon-link\" title=\"Add image from URL\"><span class=\"hidden\">URL</span></a>' +
'</section>\n', 'HTML is correct');
test.assertHTMLEquals('<section class=\"js-drop-zone image-uploader\"><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'
@ -188,15 +154,19 @@ CasperTest.begin('Image Uploads', 24, function suite(test) {
test.assertExists('.entry-preview .icon-link', 'Image URL button exists');
}
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', assertEmptyImageUploaderDisplaysCorrectly);
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.icon-link');
casper.thenClick('.entry-preview .image-uploader a.image-url');
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');
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
@ -233,13 +203,17 @@ CasperTest.begin('Image Uploads', 24, function suite(test) {
casper.writeContentToEditor('![]()');
});
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', function onSuccess() {
casper.thenClick('.entry-preview .image-uploader a.icon-link');
casper.then(function () {
casper.waitForSelector('.entry-preview .js-drop-zone.image-uploader', function onSuccess() {
casper.thenClick('.entry-preview .image-uploader .image-url');
});
});
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.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('.entry-preview .js-drop-zone.pre-image-uploader', function onSuccess() {
@ -254,25 +228,29 @@ CasperTest.begin('Image Uploads', 24, function suite(test) {
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');
});
// Edit the draft post we just created
casper.thenClick('.content-preview a.post-edit');
////// 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'));
casper.then(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'));
});
CasperTest.begin('Tag editor', 7, function suite(test) {
@ -577,7 +555,7 @@ CasperTest.begin('Publish menu - delete post', 7, function testDeleteModal(test)
casper.waitForSelector('.notification-success', function onSuccess() {
test.assert(true, 'Got success notification from delete post');
test.assertSelectorHasText('.notification-message', 'Your post has been deleted.');
test.assertSelectorHasText('.gh-notification-content', 'Your post has been deleted.');
}, function onTimeout() {
test.fail('No success notification from delete post');
});
@ -619,7 +597,7 @@ CasperTest.begin('Publish menu - new post status is correct after failed save',
});
// Click on "Content" in the main nav
casper.thenClick('.nav-content');
casper.thenClick('.gh-nav-main-content');
// The "Are you sure?" modal appears
casper.waitUntilVisible('.modal-content', function onSuccess() {

View File

@ -123,7 +123,7 @@ CasperTest.begin('General settings validation is correct', 6, function suite(tes
test.assertSelectorHasText('.notification-error', 'too long');
}, casper.failOnTimeout(test, 'Blog title length error did not appear'), 2000);
casper.thenClick('.js-bb-notification .close');
casper.thenClick('.gh-notification-close');
// Ensure general blog description field length validation
casper.fillAndSave('form#settings-general', {
@ -134,7 +134,7 @@ CasperTest.begin('General settings validation is correct', 6, function suite(tes
test.assertSelectorHasText('.notification-error', 'too long');
}, casper.failOnTimeout(test, 'Blog description length error did not appear'));
casper.thenClick('.js-bb-notification .close');
casper.thenClick('.gh-notification-close');
// Check postsPerPage autocorrect
casper.fillAndSave('form#settings-general', {