From a25a8f2560a2fea63c917f2f02cbe89173818b19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tautvidas=20Sipavi=C4=8Dius?= Date: Mon, 7 Sep 2015 18:55:05 +0300 Subject: [PATCH] Add tests for Wordpress component, fix ALC/Posts endpoint calls --- .../blocks/automatedLatestContent.js | 12 +- .../js/src/newsletter_editor/blocks/posts.js | 12 +- .../newsletter_editor/components/wordpress.js | 3 +- .../components/wordpress.spec.js | 175 ++++++++++++++++-- 4 files changed, 178 insertions(+), 24 deletions(-) diff --git a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js index 7b2bf29848..b67e5a75e6 100644 --- a/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js +++ b/assets/js/src/newsletter_editor/blocks/automatedLatestContent.js @@ -7,11 +7,11 @@ * block settings view. */ define([ - 'newsletter_editor/App', 'backbone', 'backbone.marionette', - 'mailpoet', - ], function(EditorApplication, Backbone, Marionette, MailPoet) { + 'newsletter_editor/App', + 'newsletter_editor/components/wordpress', + ], function(Backbone, Marionette, EditorApplication, WordpressComponent) { EditorApplication.module("blocks.automatedLatestContent", function(Module, App, Backbone, Marionette, $, _) { "use strict"; @@ -156,7 +156,7 @@ define([ var that = this; // Dynamically update available post types - App.module('components.wordpress').getPostTypes().done(_.bind(this._updateContentTypes, this)); + WordpressComponent.getPostTypes().done(_.bind(this._updateContentTypes, this)); this.$('.mailpoet_automated_latest_content_categories_and_tags').select2({ multiple: true, @@ -164,10 +164,10 @@ define([ query: function(options) { var taxonomies = []; // Delegate data loading to our own endpoints - EditorApplication.module('components.wordpress').getTaxonomies(that.model.get('contentType')).then(function(tax) { + WordpressComponent.getTaxonomies(that.model.get('contentType')).then(function(tax) { taxonomies = tax; // Fetch available terms based on the list of taxonomies already fetched - var promise = EditorApplication.module('components.wordpress').getTerms({ + var promise = WordpressComponent.getTerms({ search: options.term, taxonomies: _.keys(taxonomies) }).then(function(terms) { diff --git a/assets/js/src/newsletter_editor/blocks/posts.js b/assets/js/src/newsletter_editor/blocks/posts.js index 275f3b71bd..25b6948a89 100644 --- a/assets/js/src/newsletter_editor/blocks/posts.js +++ b/assets/js/src/newsletter_editor/blocks/posts.js @@ -11,13 +11,13 @@ * block settings view. */ define([ - 'newsletter_editor/App', 'backbone', 'backbone.marionette', 'backbone.radio', 'mailpoet', - 'ajax', - ], function(EditorApplication, Backbone, Marionette, Radio, MailPoet) { + 'newsletter_editor/App', + 'newsletter_editor/components/wordpress', + ], function(Backbone, Marionette, Radio, MailPoet, EditorApplication, WordpressComponent) { EditorApplication.module("blocks.posts", function(Module, App, Backbone, Marionette, $, _) { "use strict"; @@ -257,7 +257,7 @@ define([ var that = this; // Dynamically update available post types - App.module('components.wordpress').getPostTypes().done(_.bind(this._updateContentTypes, this)); + WordpressComponent.getPostTypes().done(_.bind(this._updateContentTypes, this)); this.$('.mailpoet_posts_categories_and_tags').select2({ multiple: true, @@ -265,10 +265,10 @@ define([ query: function(options) { var taxonomies = []; // Delegate data loading to our own endpoints - EditorApplication.module('components.wordpress').getTaxonomies(that.model.get('contentType')).then(function(tax) { + WordpressComponent.getTaxonomies(that.model.get('contentType')).then(function(tax) { taxonomies = tax; // Fetch available terms based on the list of taxonomies already fetched - var promise = EditorApplication.module('components.wordpress').getTerms({ + var promise = WordpressComponent.getTerms({ search: options.term, taxonomies: _.keys(taxonomies) }).then(function(terms) { diff --git a/assets/js/src/newsletter_editor/components/wordpress.js b/assets/js/src/newsletter_editor/components/wordpress.js index f5fef0c35a..2ac9c5eec9 100644 --- a/assets/js/src/newsletter_editor/components/wordpress.js +++ b/assets/js/src/newsletter_editor/components/wordpress.js @@ -1,6 +1,7 @@ define([ 'newsletter_editor/App', - 'mailpoet' + 'mailpoet', + 'ajax' ], function(EditorApplication, MailPoet) { var Module = {}; diff --git a/tests/javascript/newsletter_editor/components/wordpress.spec.js b/tests/javascript/newsletter_editor/components/wordpress.spec.js index 0206406e16..7eca15bd02 100644 --- a/tests/javascript/newsletter_editor/components/wordpress.spec.js +++ b/tests/javascript/newsletter_editor/components/wordpress.spec.js @@ -4,25 +4,178 @@ define([ ], function(EditorApplication, Wordpress) { describe('getPostTypes', function() { + var injector; + beforeEach(function() { + injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); + }); + it('fetches post types from the server', function() { - var injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); var module = injector({ + "mailpoet": { + Ajax: { + post: function() { + var deferred = jQuery.Deferred(); + deferred.resolve({ + 'post': 'val1', + 'page': 'val2', + }); + return deferred; + } + }, + }, + }); + module.getPostTypes().done(function(types) { + expect(types).to.eql(['val1', 'val2']); + }); + }); + + it('caches results', function() { + var deferred = jQuery.Deferred(), + mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), + module = injector({ + "mailpoet": { + Ajax: { + post: mock, + }, + }, + }); + deferred.resolve({ + 'post': 'val1', + 'page': 'val2', + }); + module.getPostTypes(); + module.getPostTypes(); + + mock.verify(); + }); + }); + + describe('getTaxonomies', function() { + var injector; + beforeEach(function() { + injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); + }); + + it('sends post type to endpoint', function() { + var spy, + post = function(params) { + var deferred = jQuery.Deferred(); + deferred.resolve({ + 'category': 'val1', + 'post_tag': 'val2', + }); + return deferred; + }, + module; + spy = sinon.spy(post); + module = injector({ "mailpoet": { Ajax: { - post: function() { - var deferred = jQuery.Deferred(); - deferred.resolve({ - 'post': 'val1', - 'page': 'val2', - }); - return deferred; - } + post: spy, }, }, }); - module.getPostTypes().done(function(types) { - expect(types).to.include.members(['val1', 'val2']); + + module.getTaxonomies('post'); + expect(spy.args[0][0].data.postType).to.equal('post'); + }); + + it('fetches post types from the server', function() { + var module = injector({ + "mailpoet": { + Ajax: { + post: function() { + var deferred = jQuery.Deferred(); + deferred.resolve({ 'category': 'val1' }); + return deferred; + } + }, + }, + }); + module.getTaxonomies('page').done(function(types) { + expect(types).to.eql({ 'category': 'val1' }); }); }); + + it('caches results', function() { + var deferred = jQuery.Deferred(), + mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), + module = injector({ + "mailpoet": { + Ajax: { + post: mock, + }, + }, + }); + deferred.resolve({ 'category': 'val1' }); + module.getTaxonomies('page'); + module.getTaxonomies('page'); + + mock.verify(); + }); + }); + + describe('getTerms', function() { + var injector; + beforeEach(function() { + injector = require('amd-inject-loader!newsletter_editor/components/wordpress'); + }); + + it('sends terms to endpoint', function() { + var spy, + post = function(params) { + var deferred = jQuery.Deferred(); + deferred.resolve({}); + return deferred; + }, + module; + spy = sinon.spy(post); + module = injector({ + "mailpoet": { + Ajax: { + post: spy, + }, + }, + }); + + module.getTerms({ + taxonomies: ['category', 'post_tag'], + }); + expect(spy.args[0][0].data.taxonomies).to.eql(['category', 'post_tag']); + }); + + it('fetches terms from the server', function() { + var module = injector({ + "mailpoet": { + Ajax: { + post: function() { + var deferred = jQuery.Deferred(); + deferred.resolve({ 'term1': 'term1val1', 'term2': 'term2val2' }); + return deferred; + } + }, + }, + }); + module.getTerms({ taxonomies: ['category'] }).done(function(types) { + expect(types).to.eql({ 'term1': 'term1val1', 'term2': 'term2val2' }); + }); + }); + + it('caches results', function() { + var deferred = jQuery.Deferred(), + mock = sinon.mock({ post: function() {} }).expects('post').once().returns(deferred), + module = injector({ + "mailpoet": { + Ajax: { + post: mock, + }, + }, + }); + deferred.resolve({ 'term1': 'term1val1', 'term2': 'term2val2' }); + module.getTerms({ taxonomies: ['category'] }); + module.getTerms({ taxonomies: ['category'] }); + + mock.verify(); + }); }); });