From a255f937dda5065a18275259b6a7b8af9bf7895f Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Tue, 23 Aug 2016 15:27:46 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20add=20final=20theme=20management=20?= =?UTF-8?q?acceptance=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Ghost-Admin/pull/210 - adds missing acceptance tests for theme deletion - adds theme deletion endpoint to mirage config - fixes mirage settings update endpoint (was previously removing config that the client didn't send and also losing the `type` key for all entries preventing the `GET` request from working properly) --- ghost/admin/app/mirage/config/settings.js | 12 ++-- ghost/admin/app/mirage/config/themes.js | 15 ++++ .../tests/acceptance/settings/general-test.js | 68 ++++++++++++++++++- 3 files changed, 87 insertions(+), 8 deletions(-) diff --git a/ghost/admin/app/mirage/config/settings.js b/ghost/admin/app/mirage/config/settings.js index 57ee159928..5659b6792a 100644 --- a/ghost/admin/app/mirage/config/settings.js +++ b/ghost/admin/app/mirage/config/settings.js @@ -18,18 +18,15 @@ export default function mockSettings(server) { }); server.put('/settings/', function (db, request) { - console.log('/settings/', request.requestBody); let newSettings = JSON.parse(request.requestBody).settings; - db.settings.remove(); - db.settings.insert(newSettings); + newSettings.forEach((newSetting) => { + db.settings.update({key: newSetting.key}, newSetting); + }); let [activeTheme] = db.settings.where({key: 'activeTheme'}); let [availableThemes] = db.settings.where({key: 'availableThemes'}); - console.log('activeTheme', activeTheme); - console.log('availableThemes', availableThemes); - availableThemes.value.forEach((theme) => { if (theme.name === activeTheme.value) { theme.active = true; @@ -38,7 +35,8 @@ export default function mockSettings(server) { } }); - db.settings.update(availableThemes.id, availableThemes); + db.settings.remove({key: 'availableThemes'}); + db.settings.insert(availableThemes); return { meta: {}, diff --git a/ghost/admin/app/mirage/config/themes.js b/ghost/admin/app/mirage/config/themes.js index 71352be1cd..abf80ef74f 100644 --- a/ghost/admin/app/mirage/config/themes.js +++ b/ghost/admin/app/mirage/config/themes.js @@ -1,3 +1,5 @@ +import Mirage from 'ember-cli-mirage'; + let themeCount = 1; export default function mockThemes(server) { @@ -24,4 +26,17 @@ export default function mockThemes(server) { themes: [theme] }; }); + + server.del('/themes/:theme/', function (db, request) { + let [availableThemes] = db.settings.where({key: 'availableThemes'}); + + availableThemes.value = availableThemes.value.filter((theme) => { + return theme.name !== request.params.theme; + }); + + db.settings.remove({key: 'availableThemes'}); + db.settings.insert(availableThemes); + + return new Mirage.Response(204, {}, null); + }); } diff --git a/ghost/admin/tests/acceptance/settings/general-test.js b/ghost/admin/tests/acceptance/settings/general-test.js index acc9e8bafb..aa2d812533 100644 --- a/ghost/admin/tests/acceptance/settings/general-test.js +++ b/ghost/admin/tests/acceptance/settings/general-test.js @@ -387,7 +387,7 @@ describe('Acceptance: Settings - General', function () { andThen(() => { expect( find('.fullscreen-modal').length === 0, - 'modal is closed when cancelling' + 'upload theme modal is closed when cancelling' ).to.be.true; }); @@ -490,10 +490,76 @@ describe('Acceptance: Settings - General', function () { }); // theme deletion displays modal + click('.theme-list-item:contains("Test 1") a:contains("Delete")'); + andThen(() => { + expect( + find('.fullscreen-modal .modal-content:contains("delete this theme")').length, + 'theme deletion modal displayed after button click' + ).to.equal(1); + }); // cancelling theme deletion closes modal + click('.fullscreen-modal button:contains("Cancel")'); + andThen(() => { + expect( + find('.fullscreen-modal').length === 0, + 'delete theme modal is closed when cancelling' + ).to.be.true; + }); // confirming theme deletion closes modal and refreshes list + click('.theme-list-item:contains("Test 1") a:contains("Delete")'); + click('.fullscreen-modal button:contains("Delete")'); + andThen(() => { + expect( + find('.fullscreen-modal').length === 0, + 'delete theme modal closes after deletion' + ).to.be.true; + }); + + andThen(() => { + expect( + find('.theme-list-item').length, + 'number of themes in list shrinks after delete' + ).to.equal(4); + + expect( + find('.theme-list-item .name').text(), + 'correct theme is removed from theme list after deletion' + ).to.not.match(/Test 1/); + }); + + // validation errors are handled when deleting a theme + andThen(() => { + server.del('/themes/:theme/', function () { + return new Mirage.Response(422, {}, { + errors: [{ + message: 'Can\'t delete theme' + }] + }); + }); + }); + click('.theme-list-item:contains("Test 2") a:contains("Delete")'); + click('.fullscreen-modal button:contains("Delete")'); + andThen(() => { + expect( + find('.fullscreen-modal').length === 0, + 'delete theme modal closes after failed deletion' + ).to.be.true; + + expect( + find('.gh-alert').length, + 'alert is shown when deletion fails' + ).to.equal(1); + + expect( + find('.gh-alert').text(), + 'failed deletion alert has correct text' + ).to.match(/Can't delete theme/); + + // restore default mirage handlers + mockThemes(server); + }); }); }); });