From b7cfa549d5aec2b1a158164bd3f0ebd22c4463e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tautvidas=20Sipavi=C4=8Dius?= Date: Mon, 11 Jan 2016 18:27:30 +0200 Subject: [PATCH] Change newsletter and template saving to JSON encode body separately --- .../components/communication.js | 5 +- .../src/newsletter_editor/components/save.js | 30 +++++--- assets/js/src/newsletters/templates.jsx | 15 +++- lib/Router/NewsletterTemplates.php | 4 -- lib/Router/Newsletters.php | 4 -- .../newsletter_editor/components/save.spec.js | 68 ++++++++++++++----- 6 files changed, 89 insertions(+), 37 deletions(-) diff --git a/assets/js/src/newsletter_editor/components/communication.js b/assets/js/src/newsletter_editor/components/communication.js index b100a7b838..712c92e014 100644 --- a/assets/js/src/newsletter_editor/components/communication.js +++ b/assets/js/src/newsletter_editor/components/communication.js @@ -63,9 +63,10 @@ define([ }; Module.saveNewsletter = function(options) { - return Module._query({ + return MailPoet.Ajax.post({ + endpoint: 'newsletters', action: 'save', - options: options, + data: options || {}, }); }; diff --git a/assets/js/src/newsletter_editor/components/save.js b/assets/js/src/newsletter_editor/components/save.js index ec56962d97..9f5bc0b7a8 100644 --- a/assets/js/src/newsletter_editor/components/save.js +++ b/assets/js/src/newsletter_editor/components/save.js @@ -1,5 +1,6 @@ define([ 'newsletter_editor/App', + 'newsletter_editor/components/communication', 'mailpoet', 'notice', 'backbone', @@ -8,7 +9,18 @@ define([ 'blob', 'filesaver', 'html2canvas' - ], function(App, MailPoet, Notice, Backbone, Marionette, jQuery, Blob, FileSaver, html2canvas) { + ], function( + App, + CommunicationComponent, + MailPoet, + Notice, + Backbone, + Marionette, + jQuery, + Blob, + FileSaver, + html2canvas + ) { "use strict"; @@ -17,16 +29,18 @@ define([ // Save editor contents to server Module.save = function() { - App.getChannel().trigger('beforeEditorSave'); var json = App.toJSON(); + // Stringify to enable transmission of primitive non-string value types + if (!_.isUndefined(json.body)) { + json.body = JSON.stringify(json.body); + } + + App.getChannel().trigger('beforeEditorSave', json); + // save newsletter - MailPoet.Ajax.post({ - endpoint: 'newsletters', - action: 'save', - data: json, - }).done(function(response) { + CommunicationComponent.saveNewsletter(json).done(function(response) { if(response.success !== undefined && response.success === true) { // TODO: Handle translations //MailPoet.Notice.success(""); @@ -58,7 +72,7 @@ define([ promise.then(function(thumbnail) { var data = _.extend(options || {}, { thumbnail: thumbnail.toDataURL('image/jpeg'), - body: App.getBody(), + body: JSON.stringify(App.getBody()), }); return MailPoet.Ajax.post({ diff --git a/assets/js/src/newsletters/templates.jsx b/assets/js/src/newsletters/templates.jsx index fa0a8861a7..f9e26ec288 100644 --- a/assets/js/src/newsletters/templates.jsx +++ b/assets/js/src/newsletters/templates.jsx @@ -18,6 +18,12 @@ define( var ImportTemplate = React.createClass({ saveTemplate: function(template) { + + // Stringify to enable transmission of primitive non-string value types + if (!_.isUndefined(template.body)) { + template.body = JSON.stringify(template.body); + } + MailPoet.Ajax.post({ endpoint: 'newsletterTemplates', action: 'save', @@ -111,12 +117,19 @@ define( }.bind(this)); }, handleSelectTemplate: function(template) { + var body = template.body; + + // Stringify to enable transmission of primitive non-string value types + if (!_.isUndefined(body)) { + body = JSON.stringify(body); + } + MailPoet.Ajax.post({ endpoint: 'newsletters', action: 'save', data: { id: this.props.params.id, - body: template.body + body: body } }).done(function(response) { if(response.result === true) { diff --git a/lib/Router/NewsletterTemplates.php b/lib/Router/NewsletterTemplates.php index b0b478f767..c9a11ff7d8 100644 --- a/lib/Router/NewsletterTemplates.php +++ b/lib/Router/NewsletterTemplates.php @@ -30,10 +30,6 @@ class NewsletterTemplates { } function save($data = array()) { - if (isset($data['body'])) { - $data['body'] = json_encode($data['body']); - } - $result = NewsletterTemplate::createOrUpdate($data); if($result !== true) { wp_send_json($result); diff --git a/lib/Router/Newsletters.php b/lib/Router/Newsletters.php index f13f9f91db..b075fb0671 100644 --- a/lib/Router/Newsletters.php +++ b/lib/Router/Newsletters.php @@ -59,10 +59,6 @@ class Newsletters { unset($data['options']); } - if (isset($data['body'])) { - $data['body'] = json_encode($data['body']); - } - $errors = array(); $result = false; diff --git a/tests/javascript/newsletter_editor/components/save.spec.js b/tests/javascript/newsletter_editor/components/save.spec.js index 7772fa1b65..880c4ab0f1 100644 --- a/tests/javascript/newsletter_editor/components/save.spec.js +++ b/tests/javascript/newsletter_editor/components/save.spec.js @@ -1,21 +1,18 @@ define([ 'newsletter_editor/App', 'newsletter_editor/components/save', - 'amd-inject-loader!newsletter_editor/components/save' - ], function(EditorApplication, SaveComponent, SaveInjector) { + 'amd-inject-loader!newsletter_editor/components/save', + 'jquery' + ], function(EditorApplication, SaveComponent, SaveInjector, jQuery) { describe('Save', function() { describe('save method', function() { var module; before(function() { module = SaveInjector({ - 'mailpoet': { - Ajax: { - post: function() { - var deferred = jQuery.Deferred(); - deferred.resolve({}); - return deferred; - } + 'newsletter_editor/components/communication': { + saveNewsletter: function() { + return jQuery.Deferred(); } } }); @@ -26,29 +23,41 @@ define([ global.stubChannel(EditorApplication, { trigger: spy, }); - EditorApplication.toJSON = sinon.stub(); + EditorApplication.toJSON = sinon.stub().returns({ + body: { + type: 'container', + }, + }); module.save(); expect(spy.withArgs('beforeEditorSave').calledOnce).to.be.true; }); it('triggers afterEditorSave event', function() { - var stub = sinon.stub().callsArgWith(2, { success: true }), - spy = sinon.spy(); + var spy = sinon.spy(), + promise = jQuery.Deferred(); global.stubChannel(EditorApplication, { trigger: spy, }); - EditorApplication.toJSON = sinon.stub(); + EditorApplication.toJSON = sinon.stub().returns({ + body: { + type: 'container', + }, + }); + var module = SaveInjector({ + 'newsletter_editor/components/communication': { + saveNewsletter: sinon.stub().returns(promise), + } + }); + promise.resolve({ success: true }); module.save(); expect(spy.withArgs('afterEditorSave').calledOnce).to.be.true; }); it('sends newsletter json to server for saving', function() { - var mock = sinon.mock({ saveNewsletter: function() {} }).expects('saveNewsletter').once().returns(jQuery.Deferred()); + var mock = sinon.mock().once().returns(jQuery.Deferred()); var module = SaveInjector({ - 'mailpoet': { - Ajax: { - post: mock, - } + 'newsletter_editor/components/communication': { + saveNewsletter: mock, } }); global.stubChannel(EditorApplication); @@ -58,6 +67,29 @@ define([ mock.verify(); }); + + it('encodes newsletter body in JSON format', function() { + var body = {type: 'testType'}, + mock = sinon.mock() + .once() + .withArgs({ + body: JSON.stringify(body), + }) + .returns(jQuery.Deferred()); + global.stubChannel(EditorApplication); + + EditorApplication.toJSON = sinon.stub().returns({ + body: body, + }); + var module = SaveInjector({ + 'newsletter_editor/components/communication': { + saveNewsletter: mock, + } + }); + module.save(); + + mock.verify(); + }); }); describe('view', function() {