You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by er...@apache.org on 2013/07/01 15:35:39 UTC
svn commit: r1498441 - in /rave/branches/require/rave-portal-resources: ./
src/test/javascript/ src/test/javascript/core/
Author: erinnp
Date: Mon Jul 1 13:35:39 2013
New Revision: 1498441
URL: http://svn.apache.org/r1498441
Log:
Adding Dan's test for rave_widget, rave_widget managet, rave_view_manager
Added:
rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_view_manager.spec
rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget.spec
rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget_manager.spec
Removed:
rave/branches/require/rave-portal-resources/src/test/javascript/rave_core_spec.js
rave/branches/require/rave-portal-resources/src/test/javascript/rave_widget_spec.js
Modified:
rave/branches/require/rave-portal-resources/pom.xml
Modified: rave/branches/require/rave-portal-resources/pom.xml
URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/pom.xml?rev=1498441&r1=1498440&r2=1498441&view=diff
==============================================================================
--- rave/branches/require/rave-portal-resources/pom.xml (original)
+++ rave/branches/require/rave-portal-resources/pom.xml Mon Jul 1 13:35:39 2013
@@ -122,6 +122,10 @@
<sourceIncludes>
<include>core/rave_api.js</include>
<include>core/rave_state_manager.js</include>
+ <include>core/rave_event_manager.js</include>
+ <include>core/rave_widget.js</include>
+ <include>core/rave_widget_manager.js</include>
+ <include>core/rave_view_manager.js</include>
<include>core/rave_ajax.js</include>
</sourceIncludes>
<preloadSources>
Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_view_manager.spec
URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_view_manager.spec?rev=1498441&view=auto
==============================================================================
--- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_view_manager.spec (added)
+++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_view_manager.spec Mon Jul 1 13:35:39 2013
@@ -0,0 +1,165 @@
+/* * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+describe('rave_view_manager', function () {
+ var viewName = 'modal',
+ viewObject,
+ testScope = {};
+
+ beforeEach(function(){
+ ViewManager = testr('core/rave_view_manager');
+
+ viewObject = {
+ render: function () {
+ },
+ getWidgetSite: function () {
+ },
+ destroy: function () {
+ }
+ }
+
+ _.each(viewObject, function (fn, key) {
+ spyOn(viewObject, key);
+ });
+
+ testScope.ViewConstructor = function () {
+ this.render = function () {
+ };
+ this.getWidgetSite = function () {
+ };
+ this.destroy = function () {
+ };
+
+ spyOn(this, 'render');
+ spyOn(this, 'getWidgetSite');
+ spyOn(this, 'destroy');
+ }
+ spyOn(testScope, 'ViewConstructor').andCallThrough();
+
+
+ })
+
+ afterEach(function () {
+ ViewManager.reset();
+ });
+
+ describe('registerView / getView', function () {
+ it('registers and retrieves views and is case insensitive', function () {
+ expect(ViewManager.getView(viewName)).toBeUndefined();
+ ViewManager.registerView(viewName, viewObject);
+ expect(ViewManager.getView(viewName)).toBe(viewObject);
+ expect(ViewManager.getView(viewName.toUpperCase())).toBe(viewObject);
+ });
+ });
+
+ describe('renderView', function () {
+ it('throws an error if you render an unregistered view', function () {
+ expect(function () {
+ ViewManager.renderView('asdf')
+ }).toThrow();
+ });
+
+ it('invokes render on a view object', function () {
+ ViewManager.registerView(viewName, viewObject);
+ ViewManager.renderView(viewName);
+
+ expect(viewObject.render).toHaveBeenCalled();
+ });
+
+ it('returns the view object', function () {
+ ViewManager.registerView(viewName, viewObject);
+ expect(ViewManager.renderView(viewName)).toBe(viewObject);
+ });
+
+ it('instantiates a view constructor and calls its render', function () {
+ ViewManager.registerView(viewName, testScope.ViewConstructor);
+ var viewInstance = ViewManager.renderView(viewName);
+
+ expect(testScope.ViewConstructor).toHaveBeenCalled();
+ expect(viewInstance.render).toHaveBeenCalled();
+ expect(viewInstance.destroy).not.toHaveBeenCalled();
+ });
+
+ it('passes through any arbitrary arguments to the render function', function () {
+ //with view object
+ ViewManager.registerView(viewName, viewObject);
+ ViewManager.renderView(viewName, 1, 'bird', {hello: 'world'});
+ expect(viewObject.render).toHaveBeenCalledWith(1, 'bird', {hello: 'world'});
+
+ //or view constructor
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance = ViewManager.renderView(viewName);
+ expect(viewInstance.render).toHaveBeenCalledWith(1, 'bird', {hello: 'world'});
+ });
+
+ it('assigns a uid to a rendered view', function () {
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance = ViewManager.renderView(viewName);
+
+ expect(viewInstance._uid).toBeDefined();
+ });
+ });
+
+ describe('getRenderedView', function () {
+ it('retrieves views that have been rendered', function () {
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance1 = ViewManager.renderView(viewName);
+ var viewInstance2 = ViewManager.renderView(viewName);
+
+ expect(ViewManager.getRenderedView(viewInstance1._uid)).toBe(viewInstance1);
+ expect(ViewManager.getRenderedView(viewInstance2._uid)).toBe(viewInstance2);
+ expect(ViewManager.getRenderedView('asdfasdf')).toBeUndefined();
+ });
+ });
+
+ describe('destroyView', function () {
+ it('invokes destroy on a view object', function () {
+ ViewManager.registerView(viewName, viewObject);
+ ViewManager.renderView(viewName);
+ ViewManager.destroyView(viewObject);
+
+ expect(viewObject.destroy).toHaveBeenCalled();
+ });
+
+ it('invokes destroy on a view instance', function () {
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance = ViewManager.renderView(viewName);
+ ViewManager.destroyView(viewInstance);
+
+ expect(viewInstance.destroy).toHaveBeenCalled();
+ });
+
+ it('invokes destroy on a view identified by uid', function () {
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance = ViewManager.renderView(viewName);
+ ViewManager.destroyView(viewInstance._uid);
+
+ expect(viewInstance.destroy).toHaveBeenCalled();
+ });
+
+ it('removes view from renderedViews registry', function () {
+ ViewManager.registerView(viewName, viewObject);
+ var viewInstance = ViewManager.renderView(viewName);
+ expect(ViewManager.getRenderedView(viewInstance._uid)).toBe(viewInstance);
+
+ ViewManager.destroyView(viewInstance._uid);
+ expect(ViewManager.getRenderedView(viewInstance._uid)).toBeUndefined();
+ });
+ });
+});
Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget.spec
URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget.spec?rev=1498441&view=auto
==============================================================================
--- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget.spec (added)
+++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget.spec Mon Jul 1 13:35:39 2013
@@ -0,0 +1,351 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+describe('rave_widget', function(){
+
+ beforeEach(function () {
+ /**************
+ Widget Examples
+ ****************/
+ validWidget = {
+ "type": "OpenSocial",
+ "regionWidgetId": "5",
+ "widgetUrl": "http://widgets.nytimes.com/packages/html/igoogle/topstories.xml",
+ "metadata": {
+ "userPrefs": {
+ },
+ "hasPrefsToEdit": true,
+ "views": {
+ "home": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "default": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "canvas": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0}
+ },
+ "modulePrefs": {
+ }
+ },
+ "userPrefs": { "headlineCount": "9", "summaryCount": "1"},
+ "collapsed": false,
+ "widgetId": "3"
+ };
+
+ invalidWidget = {
+ "type": "OpenSocial",
+ "regionWidgetId": "5",
+ "widgetUrl": "http://widgets.nytimes.com/packages/html/igoogle/topstories.xml",
+ "error": "error text"
+ };
+
+ /*************************
+ Mock Module Dependencies
+ ************************/
+ mockApi = {
+ rest: {
+ saveWidgetCollapsedState: function(){},
+ saveWidgetPreference: function(){},
+ saveWidgetPreferences: function(){}
+ },
+ rpc: {
+ removeWidget: function(){},
+ moveWidgetToPage: function(){},
+ moveWidgetToRegion: function(){}
+ }
+ }
+
+ mockViewManager = {
+ destroyView: function(){},
+ renderView: function(){},
+ }
+
+ /****************
+ Mock View Obj
+ ****************/
+ viewObject = {
+ render: function () {
+ },
+ getWidgetSite: function () {
+ return document.createElement('div');
+ },
+ destroy: function () {
+ }
+ }
+
+ /****************
+ Mock Provider
+ ****************/
+ provider = {
+ init: function () {
+ },
+ initWidget: function () {
+ },
+ renderWidget: function () {
+ },
+ closeWidget: function () {
+ },
+ setDefaultGadgetSize: function () {
+ },
+ setDefaultGadgetView: function () {
+ }
+ }
+
+ /**************
+ Spies
+ ****************/
+ _.each(mockApi.rest, function (fn, key) {
+ spyOn(mockApi.rest, key);
+ });
+ _.each(mockApi.rpc, function (fn, key) {
+ spyOn(mockApi.rpc, key);
+ });
+ spyOn(mockViewManager, 'destroyView');
+ spyOn(mockViewManager, 'renderView').andReturn(viewObject);
+ _.each(provider, function (fn, key) {
+ spyOn(provider, key);
+ });
+
+ _.each(viewObject, function (fn, key) {
+ spyOn(viewObject, key).andCallThrough();
+ });
+
+ RegionWidget = testr('core/rave_widget', {
+ './rave_api': mockApi,
+ './rave_view_manager': mockViewManager,
+ './rave_providers': {
+ opensocial: provider
+ }
+ })
+ });
+
+ describe('constructor', function () {
+ it('returns a new object with all the properties of the definition', function () {
+ var regionWidget = new RegionWidget(validWidget);
+ _.each(validWidget, function (value, key) {
+ expect(regionWidget[key]).toEqual(value);
+ });
+ });
+
+ it('throws an error if the expected provider is not registered', function () {
+ RegionWidgetNoProvider = testr('core/rave_widget', {
+ './rave_api': mockApi,
+ './rave_view_manager': mockViewManager,
+ './rave_providers': {
+ opensocial: undefined
+ }
+ })
+
+ expect(function () {
+ new RegionWidgetNoProvider(validWidget);
+ }).toThrow();
+ });
+
+ it('invokes the initWidget method of the provider', function () {
+ expect(provider.initWidget).not.toHaveBeenCalled();
+ var regionWidget = new RegionWidget(validWidget);
+ expect(provider.initWidget).toHaveBeenCalled();
+ });
+ });
+
+ describe('extend', function () {
+ it('allows you to extend the RegionWidget prototype', function () {
+ var mixin = {
+ fn: function () {
+ },
+ prop: 7
+ }
+
+ spyOn(mixin, 'fn');
+
+ var regionWidget1 = new RegionWidget(validWidget);
+ expect(regionWidget1.fn).toBeUndefined();
+ RegionWidget.extend(mixin);
+ var regionWidget2 = new RegionWidget(validWidget);
+ expect(regionWidget1.prop).toEqual(7);
+ expect(regionWidget2.prop).toEqual(7);
+
+ regionWidget1.fn();
+ regionWidget2.fn();
+ expect(mixin.fn.calls.length).toEqual(2);
+ });
+ });
+
+ describe('prototype', function () {
+ var regionWidget,
+ errorRegionWidget;
+
+ beforeEach(function () {
+ regionWidget = new RegionWidget(validWidget);
+ errorRegionWidget = new RegionWidget(invalidWidget);
+ })
+
+ describe('render', function () {
+ it('throws an error if you do not provide a valid el to render into', function(){
+ function doRenderWithNoArgs(){
+ regionWidget.render();
+ }
+ function doRenderWithOptsOnly(){
+ regionWidget.render({view: 'myView'});
+ }
+ function doRenderWithNonDomObject(){
+ regionWidget.render({}, {view: 'myView'});
+ }
+
+ expect(doRenderWithNoArgs).toThrow();
+ expect(doRenderWithOptsOnly).toThrow();
+ expect(doRenderWithNonDomObject).toThrow();
+ });
+
+ it('retrieves a registered view if el is a string', function () {
+ regionWidget.render('asdf');
+
+ expect(mockViewManager.renderView).toHaveBeenCalledWith('asdf', regionWidget);
+ expect(viewObject.getWidgetSite).toHaveBeenCalled();
+ expect(regionWidget._view).toBe(viewObject);
+ });
+
+ it("invokes the provider's renderWidget function", function () {
+ var el = document.createElement('div');
+ var opts = {opts: true}
+ regionWidget.render(el, opts);
+
+ expect(provider.renderWidget).toHaveBeenCalledWith(regionWidget, el, opts);
+ });
+
+ it("defaults to the widget's current el if the widget has been rendered already", function(){
+ var el = document.createElement('div');
+ var opts = {opts: true}
+
+ expect(function(){
+ regionWidget.render();
+ }).toThrow();
+
+ regionWidget.render(el, opts);
+ expect(provider.renderWidget).toHaveBeenCalledWith(regionWidget, el, opts);
+ regionWidget.render(opts);
+ expect(provider.renderWidget).toHaveBeenCalledWith(regionWidget, el, opts);
+ });
+ });
+
+ describe('hide', function () {
+ it('calls the rave api and updates the widget state', function () {
+ regionWidget.collapsed = 'asdf';
+
+ expect(regionWidget.collapsed).toEqual('asdf');
+ regionWidget.hide();
+ expect(regionWidget.collapsed).toEqual(true);
+ expect(mockApi.rest.saveWidgetCollapsedState).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId,
+ collapsed: true
+ });
+ });
+ });
+
+ describe('show', function () {
+ it('calls the rave api and updates the widget state', function () {
+ regionWidget.collapsed = 'asdf';
+
+ expect(regionWidget.collapsed).toEqual('asdf');
+ regionWidget.show();
+ expect(regionWidget.collapsed).toEqual(false);
+ expect(mockApi.rest.saveWidgetCollapsedState).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId,
+ collapsed: false
+ });
+ });
+ });
+
+ describe('close', function () {
+ it('invokes closeWidget on provider and calls the rave api', function () {
+ var opts = {opts: true}
+ regionWidget.close(opts);
+
+ expect(mockViewManager.destroyView).not.toHaveBeenCalled();
+ expect(provider.closeWidget).toHaveBeenCalledWith(regionWidget, opts);
+ expect(mockApi.rpc.removeWidget).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId
+ });
+ });
+
+ it('destroys the associated view', function () {
+ regionWidget.render('asdf');
+
+ expect(regionWidget._view).toBe(viewObject);
+
+ regionWidget.close();
+ expect(mockViewManager.destroyView).toHaveBeenCalledWith(viewObject);
+ });
+ });
+
+ describe('moveToPage', function () {
+ it('calls the rave api', function () {
+ var cb = function () {
+ }
+ regionWidget.moveToPage(1, cb);
+
+ expect(mockApi.rpc.moveWidgetToPage).toHaveBeenCalledWith({
+ toPageId: 1,
+ regionWidgetId: regionWidget.regionWidgetId,
+ successCallback: cb
+ });
+ })
+ });
+
+ describe('moveToRegion', function () {
+ it('calls the rave api', function () {
+ regionWidget.moveToRegion(1, 2, 3);
+
+ expect(mockApi.rpc.moveWidgetToRegion).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId,
+ fromRegionId: 1,
+ toRegionId: 2,
+ toIndex: 3
+ });
+ });
+ });
+
+ describe('savePreference', function () {
+ it('calls the rave api updates the widget state', function () {
+ var name = 'color';
+ var pref = 'blue';
+ var prefs = {color: 'blue'}
+ regionWidget.savePreference(name, pref);
+
+ expect(mockApi.rest.saveWidgetPreference).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId,
+ prefName: name,
+ prefValue: pref
+ });
+ });
+ });
+
+ describe('savePreferences', function () {
+ it('calls the rave api updates the widget state', function () {
+ var prefs = {color: 'blue', number: 7}
+ regionWidget.savePreferences(prefs);
+
+ expect(regionWidget.userPrefs).toBe(prefs);
+ expect(mockApi.rest.saveWidgetPreferences).toHaveBeenCalledWith({
+ regionWidgetId: regionWidget.regionWidgetId,
+ userPrefs: prefs
+ });
+ });
+ });
+ });
+})
Added: rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget_manager.spec
URL: http://svn.apache.org/viewvc/rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget_manager.spec?rev=1498441&view=auto
==============================================================================
--- rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget_manager.spec (added)
+++ rave/branches/require/rave-portal-resources/src/test/javascript/core/rave_widget_manager.spec Mon Jul 1 13:35:39 2013
@@ -0,0 +1,201 @@
+/* * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+
+describe('rave_widget_manager', function () {
+ beforeEach(function () {
+ /**************
+ Widget Examples
+ ****************/
+ widget1 = {
+ "type": "OpenSocial",
+ "regionWidgetId": "1",
+ "widgetUrl": "http://widgets.nytimes.com/packages/html/igoogle/topstories.xml",
+ "metadata": {
+ "userPrefs": {
+ },
+ "hasPrefsToEdit": true,
+ "views": {
+ "home": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "default": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "canvas": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0}},
+ "modulePrefs": {
+ }
+ },
+ "userPrefs": { "headlineCount": "9", "summaryCount": "1"},
+ "collapsed": false,
+ "widgetId": "3",
+ "regionId": "1"
+ };
+
+ widget2 = {
+ "type": "OpenSocial",
+ "regionWidgetId": "2",
+ "widgetUrl": "http://widgets.nytimes.com/packages/html/igoogle/topstories.xml",
+ "metadata": {
+ "userPrefs": {
+ },
+ "hasPrefsToEdit": true,
+ "views": {
+ "home": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "default": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0},
+ "canvas": {
+ "preferredHeight": 0, "quirks": true, "preferredWidth": 0}},
+ "modulePrefs": {
+ }
+ },
+ "userPrefs": { "headlineCount": "9", "summaryCount": "1"},
+ "collapsed": false,
+ "widgetId": "3",
+ "regionId": "2"
+ };
+
+ /*************************
+ Mock Module Dependencies
+ ************************/
+ mockApi = {
+ rest: {
+ saveWidgetCollapsedState: function(){},
+ saveWidgetPreference: function(){},
+ saveWidgetPreferences: function(){}
+ },
+ rpc: {
+ removeWidget: function(){},
+ moveWidgetToPage: function(){},
+ moveWidgetToRegion: function(){}
+ }
+ }
+
+ mockViewManager = {
+ destroyView: function(){},
+ renderView: function(){},
+ reset: function(){
+ registeredViews = {};
+ }
+ }
+
+ /****************
+ Mock Provider
+ ****************/
+ provider = {
+ init: function () {
+ },
+ initWidget: function () {
+ },
+ renderWidget: function () {
+ },
+ closeWidget: function () {
+ },
+ setDefaultGadgetSize: function () {
+ },
+ setDefaultGadgetView: function () {
+ }
+ }
+
+ mockRegionWidget = {}
+
+ mockRegionWidget.RegionWidget = testr('core/rave_widget', {
+ './rave_api': mockApi,
+ './rave_view_manager': mockViewManager,
+ './rave_providers': {
+ opensocial: provider
+ }
+ })
+
+ spyOn(mockRegionWidget, 'RegionWidget').andCallFake(function(def){return def})
+
+ WidgetManager = testr('core/rave_widget_manager', {
+ './rave_widget': mockRegionWidget.RegionWidget
+ })
+
+ eventManager = testr('core/rave_event_manager')
+ });
+
+ describe('registerWidget', function () {
+
+ it('accepts one or two arguments', function(){
+ var registeredWidget1 = WidgetManager.registerWidget(widget1);
+ var registeredWidget2 = WidgetManager.registerWidget(2, widget2);
+
+ expect(registeredWidget1).toEqual(widget1);
+ expect(registeredWidget2).toEqual(widget2);
+ });
+ /*
+ it('does not call RegionWidget constructor until rave.init is called', function () {
+ WidgetManager.registerWidget(widget1);
+ expect(mockRegionWidget.RegionWidget).not.toHaveBeenCalled();
+ eventManager.init();
+ expect(mockRegionWidget.RegionWidget).toHaveBeenCalled();
+ });
+
+ it('instatiates a new RegionWidget immediately if rave.init was already called', function () {
+ expect(rave.RegionWidget).not.toHaveBeenCalled();
+ rave.init();
+ rave.registerWidget(widget1);
+ expect(rave.RegionWidget).toHaveBeenCalled();
+ });*/
+
+ });
+
+ describe('unregisterWidget', function () {
+ it('unregisters a widget by regionWidgetId', function () {
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBeUndefined();
+ WidgetManager.registerWidget(widget1);
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBe(widget1);
+ WidgetManager.unregisterWidget(widget1.regionWidgetId);
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBeUndefined();
+ });
+
+ it('unregisters a widget by object', function () {
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBeUndefined();
+ WidgetManager.registerWidget(widget1);
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBe(widget1);
+ WidgetManager.unregisterWidget(widget1);
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBeUndefined();
+ });
+ });
+
+ describe('getWidget', function () {
+ it('can retrieve a registered widget by regionWidgetId', function () {
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBeUndefined();
+ WidgetManager.registerWidget(widget1);
+ expect(WidgetManager.getWidget(widget1.regionWidgetId)).toBe(widget1);
+ });
+ });
+
+ describe('getWidgets', function () {
+ it('returns the set of all registered widgets', function () {
+ expect(WidgetManager.getWidgets()).toEqual([]);
+ WidgetManager.registerWidget(widget1);
+ expect(WidgetManager.getWidgets()).toEqual([widget1]);
+ });
+
+ it('filters widgets', function(){
+ WidgetManager.registerWidget(widget1);
+ WidgetManager.registerWidget(widget2);
+
+ expect(WidgetManager.getWidgets({regionId: "1"})).toEqual([widget1]);
+ expect(WidgetManager.getWidgets({widgetId: "3"})).toEqual([widget1, widget2]);
+ });
+ });
+});