From 0cd0ee049e6593dd60152af1b33f634c385ce132 Mon Sep 17 00:00:00 2001 From: Ian Sim Date: Wed, 8 Jan 2020 08:44:34 -0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=20Allowed=20pages=20to=20accept=20?= =?UTF-8?q?HTML=20as=20a=20source=20(#11422)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs https://github.com/TryGhost/Ghost/issues/10471 - Allow page resource endpoints to accept HTML source. This behavior is the same as the post's resource introduced with e9ecf70ff7372f395b8917340805148bc764e2ef - The functionality was most likely missed when post split into posts & pages was happening. - Added symmetric changes to API v2. --- core/server/api/canary/pages.js | 10 +++- core/server/api/v2/pages.js | 10 +++- .../regression/api/canary/admin/pages_spec.js | 47 +++++++++++++++++++ .../regression/api/v2/admin/pages_spec.js | 47 +++++++++++++++++++ 4 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 core/test/regression/api/canary/admin/pages_spec.js create mode 100644 core/test/regression/api/v2/admin/pages_spec.js diff --git a/core/server/api/canary/pages.js b/core/server/api/canary/pages.js index bae973dd10..e98cacc019 100644 --- a/core/server/api/canary/pages.js +++ b/core/server/api/canary/pages.js @@ -85,12 +85,16 @@ module.exports = { statusCode: 201, headers: {}, options: [ - 'include' + 'include', + 'source' ], validation: { options: { include: { values: ALLOWED_INCLUDES + }, + source: { + values: ['html'] } } }, @@ -117,6 +121,7 @@ module.exports = { options: [ 'include', 'id', + 'source', // NOTE: only for internal context 'forUpdate', 'transacting' @@ -128,6 +133,9 @@ module.exports = { }, id: { required: true + }, + source: { + values: ['html'] } } }, diff --git a/core/server/api/v2/pages.js b/core/server/api/v2/pages.js index bae973dd10..e98cacc019 100644 --- a/core/server/api/v2/pages.js +++ b/core/server/api/v2/pages.js @@ -85,12 +85,16 @@ module.exports = { statusCode: 201, headers: {}, options: [ - 'include' + 'include', + 'source' ], validation: { options: { include: { values: ALLOWED_INCLUDES + }, + source: { + values: ['html'] } } }, @@ -117,6 +121,7 @@ module.exports = { options: [ 'include', 'id', + 'source', // NOTE: only for internal context 'forUpdate', 'transacting' @@ -128,6 +133,9 @@ module.exports = { }, id: { required: true + }, + source: { + values: ['html'] } } }, diff --git a/core/test/regression/api/canary/admin/pages_spec.js b/core/test/regression/api/canary/admin/pages_spec.js new file mode 100644 index 0000000000..d9d0fe175b --- /dev/null +++ b/core/test/regression/api/canary/admin/pages_spec.js @@ -0,0 +1,47 @@ +const should = require('should'); +const supertest = require('supertest'); +const testUtils = require('../../../../utils'); +const config = require('../../../../../server/config'); +const localUtils = require('./utils'); +const ghost = testUtils.startGhost; +let request; + +describe('Pages API', function () { + before(function () { + return ghost() + .then(function (_ghostServer) { + request = supertest.agent(config.get('url')); + }) + .then(function () { + return localUtils.doAuth(request, 'posts'); + }); + }); + + describe('Edit', function () { + it('accepts html source', function () { + return request + .get(localUtils.API.getApiQuery(`pages/${testUtils.DataGenerator.Content.posts[5].id}/`)) + .set('Origin', config.get('url')) + .expect(200) + .then((res) => { + res.body.pages[0].slug.should.equal('static-page-test'); + + return request + .put(localUtils.API.getApiQuery('pages/' + testUtils.DataGenerator.Content.posts[5].id + '/?source=html')) + .set('Origin', config.get('url')) + .send({ + pages: [{ + html: '

HTML Ipsum presents

', + updated_at: res.body.pages[0].updated_at + }] + }) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); + }) + .then((res) => { + res.body.pages[0].mobiledoc.should.equal('{"version":"0.3.1","atoms":[],"cards":[],"markups":[],"sections":[[1,"p",[[0,[],0,"HTML Ipsum presents"]]]]}'); + }); + }); + }); +}); diff --git a/core/test/regression/api/v2/admin/pages_spec.js b/core/test/regression/api/v2/admin/pages_spec.js new file mode 100644 index 0000000000..d9d0fe175b --- /dev/null +++ b/core/test/regression/api/v2/admin/pages_spec.js @@ -0,0 +1,47 @@ +const should = require('should'); +const supertest = require('supertest'); +const testUtils = require('../../../../utils'); +const config = require('../../../../../server/config'); +const localUtils = require('./utils'); +const ghost = testUtils.startGhost; +let request; + +describe('Pages API', function () { + before(function () { + return ghost() + .then(function (_ghostServer) { + request = supertest.agent(config.get('url')); + }) + .then(function () { + return localUtils.doAuth(request, 'posts'); + }); + }); + + describe('Edit', function () { + it('accepts html source', function () { + return request + .get(localUtils.API.getApiQuery(`pages/${testUtils.DataGenerator.Content.posts[5].id}/`)) + .set('Origin', config.get('url')) + .expect(200) + .then((res) => { + res.body.pages[0].slug.should.equal('static-page-test'); + + return request + .put(localUtils.API.getApiQuery('pages/' + testUtils.DataGenerator.Content.posts[5].id + '/?source=html')) + .set('Origin', config.get('url')) + .send({ + pages: [{ + html: '

HTML Ipsum presents

', + updated_at: res.body.pages[0].updated_at + }] + }) + .expect('Content-Type', /json/) + .expect('Cache-Control', testUtils.cacheRules.private) + .expect(200); + }) + .then((res) => { + res.body.pages[0].mobiledoc.should.equal('{"version":"0.3.1","atoms":[],"cards":[],"markups":[],"sections":[[1,"p",[[0,[],0,"HTML Ipsum presents"]]]]}'); + }); + }); + }); +});