This is an automated email from the ASF dual-hosted git repository. atkach pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new 9e22cc9 AMBARI-25128 Cover widget mixin with unit tests 9e22cc9 is described below commit 9e22cc9087c91f9cc8f6968c68c2744d8a8bc4d6 Author: Andrii Tkach <atk...@apache.org> AuthorDate: Fri Jan 25 14:18:10 2019 +0200 AMBARI-25128 Cover widget mixin with unit tests --- .../app/mixins/common/widgets/widget_section.js | 265 ++++--- .../mixins/common/widgets/widget_section_test.js | 854 ++++++++++++++++++++- .../modal_popups/select_groups_popup_test.js | 8 +- 3 files changed, 1003 insertions(+), 124 deletions(-) diff --git a/ambari-web/app/mixins/common/widgets/widget_section.js b/ambari-web/app/mixins/common/widgets/widget_section.js index 173ee2c..70639a8 100644 --- a/ambari-web/app/mixins/common/widgets/widget_section.js +++ b/ambari-web/app/mixins/common/widgets/widget_section.js @@ -19,6 +19,16 @@ var App = require('app'); App.WidgetSectionMixin = Ember.Mixin.create({ + + /** + * @Type {App.WidgetLayout} + */ + activeWidgetLayout: {}, + + activeNSWidgetLayouts: [], + + selectedNSWidgetLayout: {}, + /** * UI default layout name */ @@ -74,7 +84,7 @@ App.WidgetSectionMixin = Ember.Mixin.create({ var isServiceWithWidgetdescriptor; var serviceName = this.get('content.serviceName'); if (serviceName) { - isServiceWithWidgetdescriptor = App.StackService.find().findProperty('serviceName', serviceName).get('isServiceWithWidgets'); + isServiceWithWidgetdescriptor = App.StackService.find(serviceName).get('isServiceWithWidgets'); } else if (this.get('sectionName') === 'SYSTEM_HEATMAPS') { isServiceWithWidgetdescriptor = true; } @@ -86,11 +96,6 @@ App.WidgetSectionMixin = Ember.Mixin.create({ }.property('content.serviceName', 'sectionNameSuffix', 'App.hasNameNodeFederation'), /** - * @Type {App.WidgetLayout} - */ - activeWidgetLayout: {}, - - /** * @type {Em.A} */ widgets: function () { @@ -100,10 +105,6 @@ App.WidgetSectionMixin = Ember.Mixin.create({ return []; }.property('isWidgetsLoaded', 'activeWidgetLayout.widgets'), - activeNSWidgetLayouts: [], - - selectedNSWidgetLayout: {}, - isAmbariMetricsInstalled: function () { return App.Service.find().someProperty('serviceName', 'AMBARI_METRICS'); }.property('App.router.mainServiceController.content.length'), @@ -144,44 +145,54 @@ App.WidgetSectionMixin = Ember.Mixin.create({ * @param {object|null} data */ getActiveWidgetLayoutSuccessCallback: function (data) { - var self = this; if (this.get('isHDFSFederatedSummary')) { - this.getNameNodeWidgets().done(function (widgets) { + this.getNameNodeWidgets().done((widgets) => { widgets = widgets.items; var widgetsNamespaces = widgets.mapProperty('WidgetInfo.tag').uniq().without(null); - var namespaces = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name'); + var namespaces = App.HDFSService.find('HDFS').get('masterComponentGroups').mapProperty('name'); var defaultNNWidgets = widgets.filterProperty('WidgetInfo.tag', null); var widgetsToCreateCount; if (namespaces.length > widgetsNamespaces.length) { widgetsToCreateCount = (namespaces.length - widgetsNamespaces.length) * defaultNNWidgets.length; - namespaces.forEach(function (namespace) { + namespaces.forEach((namespace) => { if (!widgetsNamespaces.contains(namespace)) { - defaultNNWidgets.forEach(function (widget) { - if (widget.href) { - delete widget.href; - delete widget.WidgetInfo.id; - delete widget.WidgetInfo.cluster_name; - delete widget.WidgetInfo.author; - widget.WidgetInfo.metrics = JSON.parse(widget.WidgetInfo.metrics); - widget.WidgetInfo.values = JSON.parse(widget.WidgetInfo.values); - } - widget.WidgetInfo.tag = namespace; - self.postWidget(widget).done(function () { - if (!--widgetsToCreateCount) { - self.createLayouts(data); - } - }); + defaultNNWidgets.forEach((widget) => { + this.postNNWidgets(widget, widgetsToCreateCount, data, namespace); }); } }); } else { - self.createLayouts(data); + this.createLayouts(data); } }) } else { this.createLayouts(data); } }, + + /** + * + * @param widget + * @param widgetsToCreateCount + * @param data + * @param namespace + */ + postNNWidgets: function(widget, widgetsToCreateCount, data, namespace) { + if (widget.href) { + delete widget.href; + delete widget.WidgetInfo.id; + delete widget.WidgetInfo.cluster_name; + delete widget.WidgetInfo.author; + widget.WidgetInfo.metrics = JSON.parse(widget.WidgetInfo.metrics); + widget.WidgetInfo.values = JSON.parse(widget.WidgetInfo.values); + } + widget.WidgetInfo.tag = namespace; + this.postWidget(widget).done(() => { + if (!--widgetsToCreateCount) { + this.createLayouts(data); + } + }); + }, getNameNodeWidgets: function () { return App.ajax.send({ @@ -206,39 +217,48 @@ App.WidgetSectionMixin = Ember.Mixin.create({ createLayouts: function (data) { var self = this; if (data.items[0]) { - var hdfs = App.HDFSService.find().objectAt(0); - if (hdfs && this.get('isHDFSFederatedSummary') && hdfs.get('masterComponentGroups').length + 2 !== data.items.length) { + var hdfs = App.HDFSService.find('HDFS'); + if (hdfs.get('isLoaded') && this.get('isHDFSFederatedSummary') && hdfs.get('masterComponentGroups').length + 2 !== data.items.length) { this.createFederationWidgetLayouts(data); } else { - self.getWidgetLayoutSuccessCallback(data); + this.getWidgetLayoutSuccessCallback(data); } } else { - self.getAllActiveWidgetLayouts().done(function (activeWidgetLayoutsData) { + this.getAllActiveWidgetLayouts().done(function (activeWidgetLayoutsData) { self.getDefaultWidgetLayoutByName(self.get('defaultLayoutName')).done(function (defaultWidgetLayoutData) { defaultWidgetLayoutData = defaultWidgetLayoutData.items[0].WidgetLayoutInfo; defaultWidgetLayoutData.layout_name = self.get('userLayoutName'); self.createUserWidgetLayout(defaultWidgetLayoutData).done(function (userLayoutIdData) { - var activeWidgetLayouts; - var widgetLayouts = []; - if (!!activeWidgetLayoutsData.items.length) { - widgetLayouts = activeWidgetLayoutsData.items.map(function (item) { - return { - "id": item.WidgetLayoutInfo.id - } - }); - } - widgetLayouts.push({id: userLayoutIdData.resources[0].WidgetLayoutInfo.id}); - activeWidgetLayouts = { - "WidgetLayouts": widgetLayouts - }; - self.saveActiveWidgetLayouts(activeWidgetLayouts).done(function () { - self.getActiveWidgetLayout(); - }); + self.createUserWidgetLayoutCallback(userLayoutIdData, activeWidgetLayoutsData); }); }); }); } }, + + /** + * + * @param userLayoutIdData + * @param activeWidgetLayoutsData + */ + createUserWidgetLayoutCallback: function(userLayoutIdData, activeWidgetLayoutsData) { + var activeWidgetLayouts; + var widgetLayouts = []; + if (!!activeWidgetLayoutsData.items.length) { + widgetLayouts = activeWidgetLayoutsData.items.map(function (item) { + return { + "id": item.WidgetLayoutInfo.id + } + }); + } + widgetLayouts.push({id: userLayoutIdData.resources[0].WidgetLayoutInfo.id}); + activeWidgetLayouts = { + "WidgetLayouts": widgetLayouts + }; + this.saveActiveWidgetLayouts(activeWidgetLayouts).done(() => { + this.getActiveWidgetLayout(); + }); + }, getAllActiveWidgetLayouts: function () { return App.ajax.send({ @@ -385,20 +405,14 @@ App.WidgetSectionMixin = Ember.Mixin.create({ }, createFederationWidgetLayouts: function (data) { - var self = this; var currentLayouts = data.items; - self.getDefaultWidgetLayoutByName(self.get('defaultLayoutName')).done(function (defaultWidgetLayoutData) { - self.getNameNodeWidgets().done(function (widgets) { - var newNameServices = []; - var newWidgets = []; - var currentLayoutsNames = []; + + this.getDefaultWidgetLayoutByName(this.get('defaultLayoutName')).done((defaultWidgetLayoutData) => { + this.getNameNodeWidgets().done((widgets) => { var newLayout = defaultWidgetLayoutData.items[0].WidgetLayoutInfo; - var newLayoutsIds = []; var nameServiceToWidgetMap = {all: []}; - var namespaces = App.HDFSService.find().objectAt(0).get('masterComponentGroups').mapProperty('name'); var nonNameServiceSpecific = newLayout.widgets.slice(); - var userLayoutName = self.get('userLayoutName'); - widgets.items.forEach(function (widget) { + widgets.items.forEach((widget) => { var tag = widget.WidgetInfo.tag; nonNameServiceSpecific = nonNameServiceSpecific.without(nonNameServiceSpecific.findProperty('WidgetInfo.id', widget.WidgetInfo.id)); if (tag) { @@ -410,61 +424,90 @@ App.WidgetSectionMixin = Ember.Mixin.create({ } }); if (currentLayouts.length === 1) { - self.removeWidgetLayout(currentLayouts[0].WidgetLayoutInfo.id).done(function () { - newLayout.layout_name = userLayoutName; - newLayout.widgets = nonNameServiceSpecific; - self.createUserWidgetLayout(newLayout).done(function (data) { - newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); - Em.keys(nameServiceToWidgetMap).forEach(function (nameService) { - newLayout.layout_name = userLayoutName + '_nameservice_' + nameService; - newLayout.display_name = nameService === 'all' ? 'All' : nameService; - newLayout.widgets = nameServiceToWidgetMap[nameService]; - self.createUserWidgetLayout(newLayout).done(function (data) { - newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); - if (newLayoutsIds.length >= Em.keys(nameServiceToWidgetMap).length + 1) { - self.saveActiveWidgetLayouts({ - "WidgetLayouts": newLayoutsIds.map(function (layout) { - return {id: layout}; - }) - }).done(function () { - self.getActiveWidgetLayout(); - }); - } - }); - }) - }); - }); + this.createSingleLayout(currentLayouts, newLayout, nonNameServiceSpecific, nameServiceToWidgetMap); } else { - currentLayoutsNames = currentLayouts.map(function (l) { - return l.WidgetLayoutInfo.layout_name.split('_nameservice_')[1]; - }).without(undefined).without('all'); - namespaces.forEach(function (n) { - if (!currentLayoutsNames.contains(n)) { - newNameServices.push(n); + this.createMultipleLayouts(currentLayouts, newLayout, nameServiceToWidgetMap); + } + }); + }); + }, + + /** + * + * @param currentLayouts + * @param newLayout + * @param nonNameServiceSpecific + * @param nameServiceToWidgetMap + */ + createSingleLayout: function(currentLayouts, newLayout, nonNameServiceSpecific, nameServiceToWidgetMap) { + const userLayoutName = this.get('userLayoutName'); + const newLayoutsIds = []; + + this.removeWidgetLayout(currentLayouts[0].WidgetLayoutInfo.id).done(() => { + newLayout.layout_name = userLayoutName; + newLayout.widgets = nonNameServiceSpecific; + this.createUserWidgetLayout(newLayout).done((data) => { + newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); + Em.keys(nameServiceToWidgetMap).forEach((nameService) => { + newLayout.layout_name = userLayoutName + '_nameservice_' + nameService; + newLayout.display_name = nameService === 'all' ? 'All' : nameService; + newLayout.widgets = nameServiceToWidgetMap[nameService]; + this.createUserWidgetLayout(newLayout).done((data) => { + newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); + if (newLayoutsIds.length >= Em.keys(nameServiceToWidgetMap).length + 1) { + this.saveActiveWidgetLayouts({ + "WidgetLayouts": newLayoutsIds.map(function (layout) { + return {id: layout}; + }) + }).done(() => { + this.getActiveWidgetLayout(); + }); } }); - newNameServices.forEach(function (nameService) { - newLayout.layout_name = userLayoutName + '_nameservice_' + nameService; - newLayout.display_name = nameService; - newLayout.widgets = nameServiceToWidgetMap[nameService]; - newWidgets = newWidgets.concat(nameServiceToWidgetMap[nameService]); - self.createUserWidgetLayout(newLayout).done(function (data) { - newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); - if (newLayoutsIds.length >= newNameServices.length) { - self.saveActiveWidgetLayouts({ - "WidgetLayouts": newLayoutsIds.concat(currentLayouts.mapProperty('WidgetLayoutInfo.id')).map(function (layout) { - return {id: layout}; - }) - }).done(function () { - var allNSLayout = currentLayouts.findProperty('WidgetLayoutInfo.display_name', 'All').WidgetLayoutInfo; - allNSLayout.widgets = allNSLayout.widgets.concat(newWidgets); - self.updateUserWidgetLayout(allNSLayout).done(function() { - self.getActiveWidgetLayout(); - }); - }); - } + }) + }); + }); + }, + + /** + * + * @param currentLayouts + * @param newLayout + * @param nameServiceToWidgetMap + */ + createMultipleLayouts: function(currentLayouts, newLayout, nameServiceToWidgetMap) { + const newNameServices = []; + const newLayoutsIds = []; + let newWidgets = []; + const userLayoutName = this.get('userLayoutName'); + const namespaces = App.HDFSService.find('HDFS').get('masterComponentGroups').mapProperty('name'); + const currentLayoutsNames = currentLayouts.map((l) => { + return l.WidgetLayoutInfo.layout_name.split('_nameservice_')[1]; + }).without(undefined).without('all'); + namespaces.forEach(function (n) { + if (!currentLayoutsNames.contains(n)) { + newNameServices.push(n); + } + }); + newNameServices.forEach((nameService) => { + newLayout.layout_name = userLayoutName + '_nameservice_' + nameService; + newLayout.display_name = nameService; + newLayout.widgets = nameServiceToWidgetMap[nameService]; + newWidgets = newWidgets.concat(nameServiceToWidgetMap[nameService]); + this.createUserWidgetLayout(newLayout).done((data) => { + newLayoutsIds.push(data.resources[0].WidgetLayoutInfo.id); + if (newLayoutsIds.length >= newNameServices.length) { + this.saveActiveWidgetLayouts({ + "WidgetLayouts": newLayoutsIds.concat(currentLayouts.mapProperty('WidgetLayoutInfo.id')).map(function (layout) { + return {id: layout}; + }) + }).done(() => { + var allNSLayout = currentLayouts.findProperty('WidgetLayoutInfo.display_name', 'All').WidgetLayoutInfo; + allNSLayout.widgets = allNSLayout.widgets.concat(newWidgets); + this.updateUserWidgetLayout(allNSLayout).done(() => { + this.getActiveWidgetLayout(); }); - }) + }); } }); }); diff --git a/ambari-web/test/mixins/common/widgets/widget_section_test.js b/ambari-web/test/mixins/common/widgets/widget_section_test.js index e6b8bf4..e7c110e 100644 --- a/ambari-web/test/mixins/common/widgets/widget_section_test.js +++ b/ambari-web/test/mixins/common/widgets/widget_section_test.js @@ -19,29 +19,34 @@ var App = require('app'); require('mixins/common/widgets/widget_section'); +var testHelpers = require('test/helpers'); describe('App.WidgetSectionMixin', function () { - var obj; + var mixin; beforeEach(function () { - obj = Em.Object.create(App.WidgetSectionMixin); + mixin = Em.Object.create(App.WidgetSectionMixin, { + layoutNameSuffix: '_suffix', + sectionNameSuffix: '_section_suffix', + content: Em.Object.create() + }); }); describe('#isAmbariMetricsInstalled', function () { var cases = [ { - services: [], + services: Em.A([]), isAmbariMetricsInstalled: false, title: 'Ambari Metrics not installed' }, { - services: [ + services: Em.A([ { serviceName: 'AMBARI_METRICS' } - ], + ]), isAmbariMetricsInstalled: true, title: 'Ambari Metrics installed' } @@ -58,10 +63,841 @@ describe('App.WidgetSectionMixin', function () { cases.forEach(function (item) { it(item.title, function () { this.stub.returns(item.services); - expect(obj.get('isAmbariMetricsInstalled')).to.equal(item.isAmbariMetricsInstalled); + expect(mixin.get('isAmbariMetricsInstalled')).to.equal(item.isAmbariMetricsInstalled); }); }); - }); - -}); \ No newline at end of file + + describe('#defaultLayoutName', function() { + + it('should return service layout name', function() { + mixin.set('content.serviceName', 'S1'); + mixin.propertyDidChange('defaultLayoutName'); + expect(mixin.get('defaultLayoutName')).to.be.equal("default_s1_suffix"); + }); + + it('should return system layout name', function() { + mixin.set('content.serviceName', null); + mixin.propertyDidChange('defaultLayoutName'); + expect(mixin.get('defaultLayoutName')).to.be.equal("default_system_suffix"); + }); + }); + + describe('#userLayoutName', function() { + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('should return service layout name', function() { + mixin.set('content.serviceName', 'S1'); + mixin.propertyDidChange('userLayoutName'); + expect(mixin.get('userLayoutName')).to.be.equal("admin_s1_suffix"); + }); + + it('should return system layout name', function() { + mixin.set('content.serviceName', null); + mixin.propertyDidChange('userLayoutName'); + expect(mixin.get('userLayoutName')).to.be.equal("admin_system_suffix"); + }); + }); + + describe('#sectionName', function() { + + it('should return service layout name', function() { + mixin.set('content.serviceName', 'S1'); + mixin.propertyDidChange('sectionName'); + expect(mixin.get('sectionName')).to.be.equal("S1_section_suffix"); + }); + + it('should return system layout name', function() { + mixin.set('content.serviceName', null); + mixin.propertyDidChange('sectionName'); + expect(mixin.get('sectionName')).to.be.equal("SYSTEM_section_suffix"); + }); + }); + + describe('#isServiceWithEnhancedWidgets', function() { + beforeEach(function() { + sinon.stub(App.StackService, 'find').returns(Em.Object.create({ + isServiceWithWidgets: false + })); + }); + afterEach(function() { + App.StackService.find.restore(); + }); + + it('should return false', function() { + mixin.set('content.serviceName', 'S1'); + mixin.propertyDidChange('isServiceWithEnhancedWidgets'); + expect(mixin.get('isServiceWithEnhancedWidgets')).to.be.false; + }); + + it('should return true', function() { + mixin.reopen({ + sectionName: 'SYSTEM_HEATMAPS' + }); + mixin.propertyDidChange('isServiceWithEnhancedWidgets'); + expect(mixin.get('isServiceWithEnhancedWidgets')).to.be.true; + }); + }); + + describe('#isHDFSFederatedSummary', function() { + beforeEach(function() { + sinon.stub(App, 'get').returns(true); + }); + afterEach(function() { + App.get.restore(); + }); + + it('should be true', function() { + mixin.set('content.serviceName', 'HDFS'); + mixin.set('sectionNameSuffix', '_SUMMARY'); + mixin.propertyDidChange('isHDFSFederatedSummary'); + expect(mixin.get('isHDFSFederatedSummary')).to.be.true; + }); + }); + + describe('#widgets', function() { + + it('should return no widgets when not loaded', function() { + mixin.set('isWidgetsLoaded', false); + mixin.propertyDidChange('widgets'); + expect(mixin.get('widgets')).to.be.empty; + }); + + it('should return widgets', function() { + mixin.set('isWidgetsLoaded', true); + mixin.set('activeWidgetLayout', { + widgets: [{}] + }); + mixin.propertyDidChange('widgets'); + expect(mixin.get('widgets')).to.be.eql([{}]); + }); + }); + + describe('#switchNameServiceLayout', function() { + + it('should set selectedNSWidgetLayout', function() { + mixin.switchNameServiceLayout({context: {}}); + expect(mixin.get('selectedNSWidgetLayout')).to.be.eql({}); + }); + }); + + describe('#getActiveWidgetLayout', function() { + + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('activeWidgetLayout should be empty', function() { + mixin.getActiveWidgetLayout(); + expect(mixin.get('activeWidgetLayout')).to.be.empty; + }); + + it('activeNSWidgetLayouts should be empty', function() { + mixin.getActiveWidgetLayout(); + expect(mixin.get('activeNSWidgetLayouts')).to.be.empty; + }); + + it('isWidgetsLoaded should be empty', function() { + mixin.reopen({ + isServiceWithEnhancedWidgets: false + }); + mixin.getActiveWidgetLayout(); + expect(mixin.get('isWidgetsLoaded')).to.be.true; + }); + + it('App.ajax.send should be called', function() { + mixin.reopen({ + isServiceWithEnhancedWidgets: true, + sectionName: 'section1' + }); + mixin.getActiveWidgetLayout(); + expect(testHelpers.findAjaxRequest('name', 'widgets.layouts.active.get')[0].data).to.be.eql({ + userName: 'admin', + sectionName: 'section1', + urlParams: 'WidgetLayoutInfo/section_name=section1' + }); + }); + }); + + describe('#getActiveWidgetLayoutSuccessCallback', function() { + beforeEach(function() { + sinon.stub(mixin, 'createLayouts'); + sinon.stub(mixin, 'getNameNodeWidgets').returns({ + done: function(callback) { + callback({ + items: [ + { + WidgetInfo: { + tag: 'space1' + } + }, + { + WidgetInfo: { + tag: null + } + } + ] + }); + } + }); + sinon.stub(App.HDFSService, 'find').returns(Em.Object.create({ + masterComponentGroups: [ + { + name: 'space1' + }, + { + name: 'space2' + } + ] + })); + sinon.stub(mixin, 'postNNWidgets'); + }); + afterEach(function() { + mixin.createLayouts.restore(); + mixin.getNameNodeWidgets.restore(); + App.HDFSService.find.restore(); + mixin.postNNWidgets.restore(); + }); + + it('createLayouts should be called when isHDFSFederatedSummary=false', function() { + mixin.reopen({ + isHDFSFederatedSummary: false + }); + mixin.getActiveWidgetLayoutSuccessCallback({items: []}); + expect(mixin.createLayouts.calledWith({items: []})).to.be.true; + }); + + it('postNNWidgets should be called when isHDFSFederatedSummary=true', function() { + mixin.reopen({ + isHDFSFederatedSummary: true + }); + mixin.getActiveWidgetLayoutSuccessCallback({items: []}); + expect(mixin.postNNWidgets.calledWith({ + WidgetInfo: { + tag: null + } + }, 1, {items: []})).to.be.true; + }); + }); + + describe('#postNNWidgets', function() { + beforeEach(function() { + sinon.stub(mixin, 'postWidget').returns({ + done: Em.clb + }); + sinon.stub(mixin, 'createLayouts'); + }); + afterEach(function() { + mixin.postWidget.restore(); + mixin.createLayouts.restore(); + }); + + it('createLayouts should be called', function() { + mixin.postNNWidgets({ + href: '', + WidgetInfo: { + id: 1, + cluster_name: 'cl1', + author: 'me', + metrics: JSON.stringify({metrics: []}), + values: JSON.stringify({values: []}) + } + }, 1, {}); + expect(mixin.createLayouts.calledWith({})).to.be.true; + }); + }); + + describe('#getNameNodeWidgets', function() { + + it('App.ajax.send should be called', function() { + mixin.getNameNodeWidgets(); + expect(testHelpers.findAjaxRequest('name', 'widgets.get')[0].data).to.be.eql({ + urlParams: 'WidgetInfo/widget_type.in(GRAPH,NUMBER,GAUGE)&WidgetInfo/scope=CLUSTER&WidgetInfo/metrics.matches(.*\"component_name\":\"NAMENODE\".*)&fields=*' + }); + }); + }); + + describe('#postWidget', function() { + + it('App.ajax.send should be called', function() { + mixin.postWidget({data: []}); + expect(testHelpers.findAjaxRequest('name', 'widgets.wizard.add')[0].data).to.be.eql({ + data: {data: []} + }); + }); + }); + + describe('#getAllActiveWidgetLayouts', function() { + + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('App.ajax.send should be called', function() { + mixin.getAllActiveWidgetLayouts(); + expect(testHelpers.findAjaxRequest('name', 'widgets.layouts.all.active.get')[0].data).to.be.eql({ + userName: 'admin' + }); + }); + }); + + describe('#createLayouts', function() { + beforeEach(function() { + sinon.stub(App.HDFSService, 'find').returns(Em.Object.create({ + isLoaded: true, + masterComponentGroups: [{}, {}] + })); + sinon.stub(mixin, 'createFederationWidgetLayouts'); + sinon.stub(mixin, 'getWidgetLayoutSuccessCallback'); + sinon.stub(mixin, 'createUserWidgetLayoutCallback'); + sinon.stub(mixin, 'getAllActiveWidgetLayouts').returns({ + done: Em.clb + }); + sinon.stub(mixin, 'getDefaultWidgetLayoutByName').returns({ + done: function(callback) { + callback({ + items: [ + { + WidgetLayoutInfo: {} + } + ] + }); + } + }); + sinon.stub(mixin, 'createUserWidgetLayout').returns({ + done: Em.clb + }); + }); + afterEach(function() { + App.HDFSService.find.restore(); + mixin.createFederationWidgetLayouts.restore(); + mixin.getWidgetLayoutSuccessCallback.restore(); + mixin.createUserWidgetLayoutCallback.restore(); + mixin.getAllActiveWidgetLayouts.restore(); + mixin.createUserWidgetLayout.restore(); + }); + + it('createFederationWidgetLayouts should be called', function() { + mixin.reopen({ + isHDFSFederatedSummary: true + }); + mixin.createLayouts({items: [{}]}); + expect(mixin.createFederationWidgetLayouts.calledWith({items: [{}]})).to.be.true; + }); + + it('getWidgetLayoutSuccessCallback should be called', function() { + mixin.reopen({ + isHDFSFederatedSummary: false + }); + mixin.createLayouts({items: [{}]}); + expect(mixin.getWidgetLayoutSuccessCallback.calledWith({items: [{}]})).to.be.true; + }); + + it('createUserWidgetLayoutCallback should be called', function() { + mixin.createLayouts({items: []}); + expect(mixin.createUserWidgetLayoutCallback.calledOnce).to.be.true; + }); + }); + + describe('#createUserWidgetLayoutCallback', function() { + beforeEach(function() { + sinon.stub(mixin, 'saveActiveWidgetLayouts').returns({ + done: Em.clb + }); + sinon.stub(mixin, 'getActiveWidgetLayout'); + }); + afterEach(function() { + mixin.saveActiveWidgetLayouts.restore(); + mixin.getActiveWidgetLayout.restore(); + }); + + it('saveActiveWidgetLayouts should be called', function() { + mixin.createUserWidgetLayoutCallback( + {resources: [{WidgetLayoutInfo: {id: 1}}]}, + {items: [{WidgetLayoutInfo: {id: 2}}]}); + expect(mixin.saveActiveWidgetLayouts.calledWith( + { + "WidgetLayouts": [ + {id: 2}, + {id: 1} + ] + } + )).to.be.true; + }); + + it('getActiveWidgetLayout should be called', function() { + mixin.createUserWidgetLayoutCallback( + {resources: [{WidgetLayoutInfo: {id: 1}}]}, + {items: [{WidgetLayoutInfo: {id: 2}}]}); + expect(mixin.getActiveWidgetLayout.calledOnce).to.be.true; + }); + }); + + describe('#getWidgetLayoutSuccessCallback', function() { + beforeEach(function() { + sinon.stub(App.widgetMapper, 'map'); + sinon.stub(App.widgetLayoutMapper, 'map'); + sinon.stub(App.WidgetLayout, 'find').returns([ + { + layoutName: 'layout1', + sectionName: 'section1' + }, + { + layoutName: 'layout2', + sectionName: 'section1' + } + ]); + mixin.reopen({ + isHDFSFederatedSummary: true, + userLayoutName: 'layout1', + sectionName: 'section1' + }); + mixin.getWidgetLayoutSuccessCallback({items: [{WidgetLayoutInfo: {id: 1}}]}); + }); + afterEach(function() { + App.widgetMapper.map.restore(); + App.widgetLayoutMapper.map.restore(); + App.WidgetLayout.find.restore(); + }); + + it('App.widgetMapper.map should be called', function() { + expect(App.widgetMapper.map.calledWith({id: 1})).to.be.true; + }); + + it('App.widgetLayoutMapper.map should be called', function() { + expect(App.widgetLayoutMapper.map.calledWith({items: [{WidgetLayoutInfo: {id: 1}}]})).to.be.true; + }); + + it('activeWidgetLayout should be set', function() { + expect(mixin.get('activeWidgetLayout')).to.be.eql({ + layoutName: 'layout1', + sectionName: 'section1' + }); + }); + + it('activeNSWidgetLayouts should be set', function() { + expect(mixin.get('activeNSWidgetLayouts')).to.be.eql([{ + layoutName: 'layout2', + sectionName: 'section1' + }]); + }); + + it('selectedNSWidgetLayout should be set', function() { + expect(mixin.get('selectedNSWidgetLayout')).to.be.eql({ + layoutName: 'layout2', + sectionName: 'section1' + }); + }); + + it('isWidgetsLoaded should be true', function() { + expect(mixin.get('isWidgetsLoaded')).to.be.true; + }); + }); + + describe('#getDefaultWidgetLayoutByName', function() { + + it('App.ajax.send should be called', function() { + mixin.getDefaultWidgetLayoutByName('layout1'); + expect(testHelpers.findAjaxRequest('name', 'widget.layout.get')[0].data).to.be.eql({ + urlParams: 'WidgetLayoutInfo/layout_name=layout1' + }); + }); + }); + + describe('#createUserWidgetLayout', function() { + + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('App.ajax.send should be called', function() { + mixin.createUserWidgetLayout({ + display_name: 'l1', + layout_name: 'L1', + section_name: 's1', + widgets: [{ + WidgetInfo: { + id: 1 + } + }] + }); + expect(testHelpers.findAjaxRequest('name', 'widget.layout.create')[0].data).to.be.eql({ + data: { + "WidgetLayoutInfo": { + "display_name": 'l1', + "layout_name": 'L1', + "scope": "USER", + "section_name": 's1', + "user_name": 'admin', + "widgets": [{ + id: 1 + }] + } + } + }); + }); + }); + + describe('#updateUserWidgetLayout', function() { + + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + it('App.ajax.send should be called', function() { + mixin.updateUserWidgetLayout({ + display_name: 'l1', + layout_name: 'L1', + section_name: 's1', + id: 1, + widgets: [{ + WidgetInfo: { + id: 1 + } + }] + }); + expect(testHelpers.findAjaxRequest('name', 'widget.layout.edit')[0].data).to.be.eql({ + data: { + "WidgetLayoutInfo": { + "display_name": 'l1', + "layout_name": 'L1', + "id": 1, + "scope": "USER", + "section_name": 's1', + "user_name": 'admin', + "widgets": [{ + id: 1 + }] + } + }, + layoutId: 1 + }); + }); + }); + + describe('#saveActiveWidgetLayouts', function() { + + beforeEach(function() { + sinon.stub(App.router, 'get').returns('admin'); + }); + afterEach(function() { + App.router.get.restore(); + }); + + + it('App.ajax.send should be called', function() { + mixin.saveActiveWidgetLayouts([]); + expect(testHelpers.findAjaxRequest('name', 'widget.activelayouts.edit')[0].data).to.be.eql({ + data: [], + userName: 'admin' + }); + }); + }); + + describe('#removeWidgetLayout', function() { + + it('App.ajax.send should be called', function() { + mixin.removeWidgetLayout(1); + expect(testHelpers.findAjaxRequest('name', 'widget.layout.delete')[0].data).to.be.eql({ + layoutId: 1 + }); + }); + }); + + describe('#saveWidgetLayout', function() { + + it('App.ajax.send should be called', function() { + mixin.saveWidgetLayout( + [Em.Object.create({id: 1})], + Em.Object.create({ + displayName: 'l1', + layoutName: 'L1', + sectionName: 's1', + scope: 'USER', + id: 1 + }) + ); + expect(testHelpers.findAjaxRequest('name', 'widget.layout.edit')[0].data).to.be.eql({ + data: { + "WidgetLayoutInfo": { + "display_name": 'l1', + "layout_name": 'L1', + "id": 1, + "scope": "USER", + "section_name": 's1', + "widgets": [{ + id: 1 + }] + } + }, + layoutId: 1 + }); + }); + }); + + describe('#clearActiveWidgetLayout', function() { + + it('activeWidgetLayout should be empty', function() { + mixin.clearActiveWidgetLayout(); + expect(mixin.get('activeWidgetLayout')).to.be.empty; + }); + + it('activeNSWidgetLayouts should be empty', function() { + mixin.clearActiveWidgetLayout(); + expect(mixin.get('activeNSWidgetLayouts')).to.be.empty; + }); + }); + + describe('#createFederationWidgetLayouts', function() { + var newLayout = { + widgets: [ + { + WidgetInfo: { + id: 1 + } + }, + { + WidgetInfo: { + id: 2 + } + } + ] + }; + beforeEach(function() { + sinon.stub(mixin, 'getDefaultWidgetLayoutByName').returns({ + done: function(callback) { + callback({ + items: [{ + WidgetLayoutInfo: newLayout + }] + }); + } + }); + sinon.stub(mixin, 'getNameNodeWidgets').returns({ + done: function(callback) { + callback({ + items: [ + { + WidgetInfo: { + tag: 'tag1', + id: 2 + } + } + ] + }); + } + }); + sinon.stub(mixin, 'createSingleLayout'); + sinon.stub(mixin, 'createMultipleLayouts'); + }); + afterEach(function() { + mixin.getDefaultWidgetLayoutByName.restore(); + mixin.getNameNodeWidgets.restore(); + mixin.createSingleLayout.restore(); + mixin.createMultipleLayouts.restore(); + }); + + it('createSingleLayout should be called', function() { + mixin.createFederationWidgetLayouts({items: [{}]}); + expect(mixin.createSingleLayout.calledWith( + [{}], + newLayout, + [{ + WidgetInfo: { + id: 1 + } + }], + { + all: [{ + WidgetInfo: { + tag: 'tag1', + id: 2 + } + }], + tag1: [ + { + WidgetInfo: { + tag: 'tag1', + id: 2 + } + } + ] + } + )).to.be.true; + }); + + it('createMultipleLayouts should be called', function() { + mixin.createFederationWidgetLayouts({items: [{}, {}]}); + expect(mixin.createMultipleLayouts.calledWith( + [{}, {}], + newLayout, + { + all: [{ + WidgetInfo: { + tag: 'tag1', + id: 2 + } + }], + tag1: [ + { + WidgetInfo: { + tag: 'tag1', + id: 2 + } + } + ] + } + )).to.be.true; + }); + }); + + describe('#createSingleLayout', function() { + beforeEach(function() { + sinon.stub(mixin, 'removeWidgetLayout').returns({done: Em.clb}); + sinon.stub(mixin, 'createUserWidgetLayout').returns({done: function(callback) { + return callback({ + resources: [ + { + WidgetLayoutInfo: { + id: 1 + } + } + ] + }); + } + }); + sinon.stub(mixin, 'saveActiveWidgetLayouts').returns({done: Em.clb}); + sinon.stub(mixin, 'getActiveWidgetLayout'); + mixin.createSingleLayout( + [{ + WidgetLayoutInfo: { + id: 1 + } + }], + {}, + [], + {space1: []} + ); + }); + afterEach(function() { + mixin.removeWidgetLayout.restore(); + mixin.createUserWidgetLayout.restore(); + mixin.saveActiveWidgetLayouts.restore(); + mixin.getActiveWidgetLayout.restore(); + }); + + it('removeWidgetLayout should be called', function() { + expect(mixin.removeWidgetLayout.calledWith(1)).to.be.true; + }); + + it('createUserWidgetLayout should be called', function() { + expect(mixin.createUserWidgetLayout.calledTwice).to.be.true; + }); + + it('saveActiveWidgetLayouts should be called', function() { + expect(mixin.saveActiveWidgetLayouts.calledWith({ + "WidgetLayouts": [{id: 1}, {id: 1}] + })).to.be.true; + }); + + it('getActiveWidgetLayout should be called', function() { + expect(mixin.getActiveWidgetLayout.calledOnce).to.be.true; + }); + }); + + describe('#createMultipleLayouts', function() { + beforeEach(function() { + sinon.stub(App.HDFSService, 'find').returns(Em.Object.create({ + masterComponentGroups: [{name: 'C1'}, {name: 'C2'}] + })); + sinon.stub(mixin, 'createUserWidgetLayout').returns({ + done: function(callback) { + callback({ + resources: [{ + WidgetLayoutInfo: { + id: 1 + } + }] + }); + } + }); + sinon.stub(mixin, 'saveActiveWidgetLayouts').returns({ + done: Em.clb + }); + sinon.stub(mixin, 'updateUserWidgetLayout').returns({ + done: Em.clb + }); + sinon.stub(mixin, 'getActiveWidgetLayout'); + mixin.reopen({ + userLayoutName: 'layout1' + }); + mixin.createMultipleLayouts( + [ + { + WidgetLayoutInfo: { + layout_name: 'prefix_nameservice_C2', + id: 2 + } + }, + { + WidgetLayoutInfo: { + layout_name: 'prefix_nameservice_all', + display_name: 'All', + widgets: [], + id: 3 + } + } + ], + {}, + {C2: []} + ); + }); + afterEach(function() { + App.HDFSService.find.restore(); + mixin.createUserWidgetLayout.restore(); + mixin.saveActiveWidgetLayouts.restore(); + mixin.updateUserWidgetLayout.restore(); + mixin.getActiveWidgetLayout.restore(); + }); + + it('createUserWidgetLayout should be called', function() { + expect(mixin.createUserWidgetLayout.calledOnce).to.be.true; + }); + + it('saveActiveWidgetLayouts should be called', function() { + expect(mixin.saveActiveWidgetLayouts.calledWith({ + "WidgetLayouts": [ + {id: 1}, + {id: 2}, + {id: 3} + ] + })).to.be.true; + }); + + it('updateUserWidgetLayout should be called', function() { + expect(mixin.updateUserWidgetLayout.calledOnce).to.be.true; + }); + + it('getActiveWidgetLayout should be called', function() { + expect(mixin.getActiveWidgetLayout.calledOnce).to.be.true; + }); + }); + +}); diff --git a/ambari-web/test/views/common/modal_popups/select_groups_popup_test.js b/ambari-web/test/views/common/modal_popups/select_groups_popup_test.js index 78be0b8..9d84c20 100644 --- a/ambari-web/test/views/common/modal_popups/select_groups_popup_test.js +++ b/ambari-web/test/views/common/modal_popups/select_groups_popup_test.js @@ -133,7 +133,7 @@ describe('App.showSelectGroupsPopup', function () { }); it('App.config.createOverride should be called when no overrides', function () { - view = App.showSelectGroupsPopup('', {}, dependentStepConfigs, configs); + view = App.showSelectGroupsPopup('', Em.Object.create(), dependentStepConfigs, configs); view.applyOverridesToConfigGroups('S1', {}, 'g2', 'g1'); expect(App.config.createOverride.calledWith( Em.Object.create({ @@ -157,7 +157,7 @@ describe('App.showSelectGroupsPopup', function () { recommendedValue: 'val1' }); dependentStepConfigs[0].get('configs')[0].set('overrides', [override]); - view = App.showSelectGroupsPopup('', {}, dependentStepConfigs, configs); + view = App.showSelectGroupsPopup('', Em.Object.create(), dependentStepConfigs, configs); view.applyOverridesToConfigGroups('S1', {}, 'g2', 'g1'); expect(override.get('value')).to.be.equal('val1'); }); @@ -171,7 +171,7 @@ describe('App.showSelectGroupsPopup', function () { recommendedValue: 'val1' }); dependentStepConfigs[0].get('configs')[0].set('overrides', [override]); - view = App.showSelectGroupsPopup('', {}, dependentStepConfigs, configs); + view = App.showSelectGroupsPopup('', Em.Object.create(), dependentStepConfigs, configs); view.applyOverridesToConfigGroups('S1', Em.Object.create({name: 'g1'}), 'g2', 'g1'); expect(App.config.createOverride.calledWith( Em.Object.create({ @@ -196,7 +196,7 @@ describe('App.showSelectGroupsPopup', function () { recommendedValue: 'val1' }); dependentStepConfigs[0].get('configs')[0].set('overrides', [override]); - view = App.showSelectGroupsPopup('', {}, dependentStepConfigs, configs); + view = App.showSelectGroupsPopup('', Em.Object.create(), dependentStepConfigs, configs); view.applyOverridesToConfigGroups('S1', Em.Object.create({name: 'g2'}), 'g2', 'g1'); expect(override.get('value')).to.be.equal('val1'); });