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]);
+        });
+    });
+});