You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rave.apache.org by mf...@apache.org on 2011/07/12 18:26:26 UTC

svn commit: r1145661 - in /incubator/rave/trunk/rave-portal/src: main/java/org/apache/rave/portal/model/ main/java/org/apache/rave/portal/service/ main/java/org/apache/rave/portal/service/impl/ main/java/org/apache/rave/portal/web/api/rpc/ main/webapp/...

Author: mfranklin
Date: Tue Jul 12 16:26:25 2011
New Revision: 1145661

URL: http://svn.apache.org/viewvc?rev=1145661&view=rev
Log:
Updated delete rpc api to take only a regionWidgetId for delete operations (Supports RAVE-58)

Modified:
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/RegionWidget.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/PageService.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java
    incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java
    incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/home.jsp
    incubator/rave/trunk/rave-portal/src/main/webapp/script/rave.js
    incubator/rave/trunk/rave-portal/src/main/webapp/script/rave_api.js
    incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/repository/AbstractJpaRepositoryTest.java
    incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/service/PageServiceTest.java
    incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java
    incubator/rave/trunk/rave-portal/src/test/javascript/raveApiSpec.js

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/RegionWidget.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/RegionWidget.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/RegionWidget.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/model/RegionWidget.java Tue Jul 12 16:26:25 2011
@@ -49,6 +49,10 @@ public class RegionWidget implements Bas
     @Column(name = "collapsed")
     private boolean collapsed;
 
+    @Basic
+    @Column(name="region_id")
+    private long regionId;
+
     @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
     @JoinColumn(name = "region_widget_id", referencedColumnName = "id")
     private List<RegionWidgetPreference> preferences;
@@ -122,6 +126,18 @@ public class RegionWidget implements Bas
     }
 
     /**
+     * Gets the id of the associated region
+     * @return region's id
+     */
+    public long getRegionId() {
+        return regionId;
+    }
+
+    public void setRegionId(long regionId) {
+        this.regionId = regionId;
+    }
+
+    /**
      * Gets whether or not to render the gadget in collapsed mode
      *
      * @return true if render collapsed; false otherwise

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/PageService.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/PageService.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/PageService.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/PageService.java Tue Jul 12 16:26:25 2011
@@ -53,14 +53,15 @@ public interface PageService {
     RegionWidget addWidgetToPage(long page_id, long widget_id);
 
 	 /**
-	  * Deletes a specified widget from the specied page.
+	  * Deletes the specified widget from the page.
 	  *
       * @param regionWidgetId the id of the region widget to delete.\
-	  */
-	 void removeWidgetFromPage(long regionWidgetId);
+      * @return the region from which the widget was deleted
+      */
+	 Region removeWidgetFromPage(long regionWidgetId);
 
 	 /**
-	  * Registers a new page. 
+	  * Registers a new page.
 	  * @param page the page object to register with the data management system.
 	  */
 	 void registerNewPage(Page page);

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/service/impl/DefaultPageService.java Tue Jul 12 16:26:25 2011
@@ -66,13 +66,10 @@ public class DefaultPageService implemen
 
     @Override
     @Transactional
-    public void removeWidgetFromPage(long regionWidgetId) {
+    public Region removeWidgetFromPage(long regionWidgetId) {
         RegionWidget widget = getFromRepository(regionWidgetId, regionWidgetRepository);
-        if (widget != null) {
-            regionWidgetRepository.delete(widget);
-        } else {
-            throw new IllegalArgumentException("Region widget with id " + regionWidgetId + " was not found in the repository");
-        }
+        regionWidgetRepository.delete(widget);
+        return getFromRepository(widget.getRegionId(), regionRepository);
     }
 
     @Override

Modified: incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java (original)
+++ incubator/rave/trunk/rave-portal/src/main/java/org/apache/rave/portal/web/api/rpc/PageApi.java Tue Jul 12 16:26:25 2011
@@ -121,8 +121,7 @@ public class PageApi {
 		return new RpcOperation<Region>() {
 			@Override
 			public Region execute() {
-		        pageService.removeWidgetFromPage(regionWidgetId);
-                return null;
+		        return pageService.removeWidgetFromPage(regionWidgetId);
             }
 		}.getResult();
     }

Modified: incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/home.jsp
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/home.jsp?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/home.jsp (original)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/WEB-INF/views/home.jsp Tue Jul 12 16:26:25 2011
@@ -55,7 +55,7 @@
               </button>
               <button id="widget-${regionWidget.id}-remove"
                       class="widget-toolbar-btn"
-                      onclick="rave.toolbarDelete(this,{myRegionWidgetId:${regionWidget.id},myRegionId:${region.id},myPageId:${defaultPage.id}})">
+                      onclick="rave.toolbarDelete(this,{myRegionWidgetId:${regionWidget.id}})">
               </button>
             </div>
           </div>

Modified: incubator/rave/trunk/rave-portal/src/main/webapp/script/rave.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/script/rave.js?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/script/rave.js (original)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/script/rave.js Tue Jul 12 16:26:25 2011
@@ -113,20 +113,15 @@ var rave = rave || (function() {
 		  }
 		  function maximizeAction(button,args) {
 				alert("Maximize button not yet implemented");
-		  };
+		  }
 		  function deleteAction(button,args) {
 				rave.api.rpc.removeWidget({
-					 regionWidgetId: args.myRegionWidgetId, 
-					 pageId : args.myPageId,
-					 region: {
-						  id : rave.getGadgetRegion(args.myRegionWidgetId)
-					 },
-					 succCB: function() {
+					 regionWidgetId: args.myRegionWidgetId,
+					 successCallback: function() {
 						  $("#widget-wrapper-"+args.myRegionWidgetId).remove();
 					 }
 				});
-
-		  };
+		  }
 		  return {
 				maximizeAction : maximizeAction,
 				deleteAction : deleteAction

Modified: incubator/rave/trunk/rave-portal/src/main/webapp/script/rave_api.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/main/webapp/script/rave_api.js?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/main/webapp/script/rave_api.js (original)
+++ incubator/rave/trunk/rave-portal/src/main/webapp/script/rave_api.js Tue Jul 12 16:26:25 2011
@@ -1,4 +1,4 @@
- /*
+/*
  * 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
@@ -18,73 +18,69 @@
  */
 var rave = rave || {};
 /**
- * Namespace that provides client access to Rave server APIs. 
+ * Namespace that provides client access to Rave server APIs.
  * Note required jquery libraries must be imported by the containing page.
  */
 rave.api = rave.api || (function() {
     var rpcApi = (function() {
-      //Base path to RPC services
+        //Base path to RPC services
         var path = "api/rpc/";
 
-      //This method is implemented by PageApi.java.  
+        //This method is implemented by PageApi.java.
         function moveWidgetOnPage(args) {
             var widgetObjectId = rave.getObjectIdFromDomId(args.widget.id);
             var toRegionObjectId = rave.getObjectIdFromDomId(args.targetRegion.id);
             var fromRegionObjectId = rave.getObjectIdFromDomId(args.currentRegion.id);
             //Note context must be set outside this library.  See home.jsp for example.
             $.post(rave.getContext() + path + "page/regionWidget/" + widgetObjectId + "/move",
-                    {
-                        newPosition: args.targetIndex,
-                        toRegion: toRegionObjectId,
-                        fromRegion: fromRegionObjectId
-                    },
-                    function(result) {
-                        if (result.error) {
-                            handleRpcError(result);
-                        } else {
-                            rave.mapGadgetToRegion(widgetObjectId, toRegionObjectId);
-                        }
+                {
+                    newPosition: args.targetIndex,
+                    toRegion: toRegionObjectId,
+                    fromRegion: fromRegionObjectId
+                },
+                function(result) {
+                    if (result.error) {
+                        handleRpcError(result);
+                    } else {
+                        rave.mapGadgetToRegion(widgetObjectId, toRegionObjectId);
                     }
+                }
             ).error(handleError);
         }
 
         function addWidgetToPage(args) {
             $.post(rave.getContext() + path + "page/" + args.pageId + "/widget/add",
-                    {
-                        widgetId: args.widgetId
-                    },
-                    function(result) {
-                        if (result.error) {
-                            handleRpcError(result);
-                        } else {
-                            var widgetTitle = "The widget";
-                            var addedWidget = result.result != undefined ? result.result.widget : undefined;
-                            
-                            if (addedWidget != undefined && addedWidget.title != undefined && addedWidget.title.length > 0) {
-                                widgetTitle = addedWidget.title;
-                            }
-                            alert(widgetTitle + " has been added to your page");
+                {
+                    widgetId: args.widgetId
+                },
+                function(result) {
+                    if (result.error) {
+                        handleRpcError(result);
+                    } else {
+                        var widgetTitle = "The widget";
+                        var addedWidget = result.result != undefined ? result.result.widget : undefined;
+
+                        if (addedWidget != undefined && addedWidget.title != undefined && addedWidget.title.length > 0) {
+                            widgetTitle = addedWidget.title;
                         }
-                    }).error(handleError);
+                        alert(widgetTitle + " has been added to your page");
+                    }
+                }).error(handleError);
         }
 
-      function deleteWidgetOnPage(args) {
-        $.post(rave.getContext() + path + "page/" +args.pageId + "/widget/delete",
-             {
-                widgetId: args.regionWidgetId,
-                regionId: args.region.id            
-             },
-             function(result) {
-                if(result.error && result.error == true) {
-                  handleRpcError(result);
-                } else {
-                    rave.mapGadgetToRegion(args.regionWidgetId, null);
-                    if (args.succCB != null && typeof args.succCB == 'function') {
-                        args.succCB();
+        function deleteWidgetOnPage(args) {
+            $.post(rave.getContext() + path + "page/regionWidget/" + args.regionWidgetId + "/delete",
+                null,
+                function(result) {
+                    if (result.error) {
+                        handleRpcError(result);
+                    } else {
+                        if (typeof args.successCallback == 'function') {
+                            args.successCallback();
+                        }
                     }
-                }
-             }).error(handleError);
-      }
+                }).error(handleError);
+        }
 
         function handleError(jqXhr, status, error) {
             alert("Rave encountered an error while trying to contact the server.  Please reload the page and try again. error: " + error);
@@ -97,11 +93,11 @@ rave.api = rave.api || (function() {
                     break;
                 case "INVALID_PARAMS":
                     alert("Rave attempted to update the server with your recent changes, " +
-                            " but the changes were rejected by the server as invalid.");
+                        " but the changes were rejected by the server as invalid.");
                     break;
                 case "INTERNAL_ERROR":
                     alert("Rave attempted to update the server with your recent changes, " +
-                            " but the server encountered an internal error.");
+                        " but the server encountered an internal error.");
                     break;
             }
         }

Modified: incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/repository/AbstractJpaRepositoryTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/repository/AbstractJpaRepositoryTest.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/repository/AbstractJpaRepositoryTest.java (original)
+++ incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/repository/AbstractJpaRepositoryTest.java Tue Jul 12 16:26:25 2011
@@ -21,6 +21,7 @@ package org.apache.rave.portal.repositor
 
 import org.apache.rave.portal.model.BasicEntity;
 import org.apache.rave.portal.repository.impl.AbstractJpaRepository;
+import org.hamcrest.CoreMatchers;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -98,6 +99,17 @@ public class AbstractJpaRepositoryTest {
 
     }
 
+    @Test
+    @Rollback(true)
+    public void delete() {
+        for(AbstractJpaRepository repository : repositories) {
+            BasicEntity entity = repository.get(VALID_ENTITY_ID);
+            repository.delete(entity);
+            sharedManager.flush();
+            assertThat(repository.get(VALID_ENTITY_ID), is(nullValue()));
+        }
+    }
+
     private BasicEntity constructNewEntityForRepository(AbstractJpaRepository repository) {
         try {
             Field field = AbstractJpaRepository.class.getDeclaredField("type");

Modified: incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/service/PageServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/service/PageServiceTest.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/service/PageServiceTest.java (original)
+++ incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/service/PageServiceTest.java Tue Jul 12 16:26:25 2011
@@ -25,6 +25,7 @@ import org.apache.rave.portal.model.Regi
 import org.apache.rave.portal.model.Widget;
 import org.apache.rave.portal.repository.PageRepository;
 import org.apache.rave.portal.repository.RegionRepository;
+import org.apache.rave.portal.repository.RegionWidgetRepository;
 import org.apache.rave.portal.repository.WidgetRepository;
 import org.apache.rave.portal.service.impl.DefaultPageService;
 import org.hamcrest.CoreMatchers;
@@ -44,6 +45,7 @@ public class PageServiceTest {
     private PageRepository pageRepository;
     private RegionRepository regionRepository;
     private WidgetRepository widgetRepository;
+    private RegionWidgetRepository regionWidgetRepository;
 
     private static final long REGION_WIDGET_ID = 5L;
     private static final long TO_REGION_ID = 1L;
@@ -57,7 +59,8 @@ public class PageServiceTest {
         pageRepository = createNiceMock(PageRepository.class);
         regionRepository = createNiceMock(RegionRepository.class);
         widgetRepository = createNiceMock(WidgetRepository.class);
-        pageService = new DefaultPageService(pageRepository, regionRepository, widgetRepository, null);
+        regionWidgetRepository = createNiceMock(RegionWidgetRepository.class);
+        pageService = new DefaultPageService(pageRepository, regionRepository, widgetRepository, regionWidgetRepository);
 
         targetRegion = new Region();
         targetRegion.setRegionWidgets(new ArrayList<RegionWidget>());
@@ -229,6 +232,37 @@ public class PageServiceTest {
         pageService.addWidgetToPage(PAGE_ID, WIDGET_ID);
     }
 
+    @Test
+    public void removeWidgetFromPage_validWidget() {
+        long WIDGET_ID = 1L;
+        long REGION_ID = 2L;
+        RegionWidget widget = new RegionWidget(WIDGET_ID);
+        widget.setRegionId(REGION_ID);
+        Region region = new Region();
+
+        expect(regionWidgetRepository.get(WIDGET_ID)).andReturn(widget);
+        regionWidgetRepository.delete(widget);
+        expectLastCall();
+        replay(regionWidgetRepository);
+        expect(regionRepository.get(REGION_ID)).andReturn(region);
+        replay(regionRepository);
+
+        Region result = pageService.removeWidgetFromPage(WIDGET_ID);
+        verify(regionWidgetRepository);
+        verify(regionRepository);
+        assertThat(result, is(sameInstance(region)));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void removeWidgetFromPage_invalidWidget() {
+        long WIDGET_ID = -1L;
+        expect(regionWidgetRepository.get(WIDGET_ID)).andReturn(null);
+        replay(regionWidgetRepository);
+        replay(regionRepository);
+
+        pageService.removeWidgetFromPage(WIDGET_ID);
+    }
+
     private void verifyPositions(int newPosition, RegionWidget widget, boolean sameRegion) {
         assertThat(widget.getRenderOrder(), is(equalTo(newPosition)));
         if (!sameRegion) {

Modified: incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java (original)
+++ incubator/rave/trunk/rave-portal/src/test/java/org/apache/rave/portal/web/api/rpc/PageApiTest.java Tue Jul 12 16:26:25 2011
@@ -19,9 +19,11 @@
 
 package org.apache.rave.portal.web.api.rpc;
 
+import org.apache.rave.portal.model.Region;
 import org.apache.rave.portal.model.RegionWidget;
 import org.apache.rave.portal.service.PageService;
 import org.apache.rave.portal.web.api.rpc.model.RpcResult;
+import org.hamcrest.CoreMatchers;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -147,24 +149,24 @@ public class PageApiTest {
     @Test
     public void deleteWidget_validParams() {
         final long WIDGET_ID = 3;
-        pageService.removeWidgetFromPage(WIDGET_ID);
-        expectLastCall();
-        RpcResult result = pageApi.removeWidgetFromPage(WIDGET_ID);
+        expect(pageService.removeWidgetFromPage(WIDGET_ID)).andReturn(new Region());
+        replay(pageService);
+
+        RpcResult<Region> result = pageApi.removeWidgetFromPage(WIDGET_ID);
         verify(pageService);
         assertThat(result, is(notNullValue()));
-        assertThat(result.getResult(), is(nullValue()));
+        assertThat(result.getResult(), is(notNullValue()));
         assertThat(result.isError(), is(false));
 
     }
 
    @Test
     public void deleteWidget_invalidParams() {
-        final int PAGE_ID = 1;
         final long WIDGET_ID = 2;
 
-        expect(pageService.addWidgetToPage(PAGE_ID, WIDGET_ID)).andThrow(new IllegalArgumentException(PARAM_ERROR_MESSAGE));
+        expect(pageService.removeWidgetFromPage(WIDGET_ID)).andThrow(new IllegalArgumentException(PARAM_ERROR_MESSAGE));
         replay(pageService);
-        RpcResult result = pageApi.addWidgetToPage(PAGE_ID, WIDGET_ID);
+        RpcResult result = pageApi.removeWidgetFromPage(WIDGET_ID);
         verify(pageService);
         assertThat(result, is(notNullValue()));
         assertThat(result.getResult(), is(nullValue()));
@@ -175,12 +177,11 @@ public class PageApiTest {
 
     @Test
     public void deleteWidget_internalError() {
-        final int PAGE_ID = 1;
         final long WIDGET_ID = 2;
 
-        expect(pageService.addWidgetToPage(PAGE_ID, WIDGET_ID)).andThrow(new RuntimeException(INTERNAL_ERROR_MESSAGE));
+        expect(pageService.removeWidgetFromPage(WIDGET_ID)).andThrow(new RuntimeException(INTERNAL_ERROR_MESSAGE));
         replay(pageService);
-        RpcResult result = pageApi.addWidgetToPage(PAGE_ID, WIDGET_ID);
+        RpcResult result = pageApi.removeWidgetFromPage(WIDGET_ID);
         verify(pageService);
         assertThat(result, is(notNullValue()));
         assertThat(result.getResult(), is(nullValue()));

Modified: incubator/rave/trunk/rave-portal/src/test/javascript/raveApiSpec.js
URL: http://svn.apache.org/viewvc/incubator/rave/trunk/rave-portal/src/test/javascript/raveApiSpec.js?rev=1145661&r1=1145660&r2=1145661&view=diff
==============================================================================
--- incubator/rave/trunk/rave-portal/src/test/javascript/raveApiSpec.js (original)
+++ incubator/rave/trunk/rave-portal/src/test/javascript/raveApiSpec.js Tue Jul 12 16:26:25 2011
@@ -30,7 +30,8 @@ describe("Rave API", function() {
                     expect(data.widgetId).toEqual(2);
                     expect(typeof(callback)).toEqual("function");
                     return {
-                        error: function(a, b, c) {}
+                        error: function(a, b, c) {
+                        }
                     }
                 };
                 rave.api.rpc.addWidgetToPage({pageId: 1, widgetId: 2});
@@ -46,24 +47,46 @@ describe("Rave API", function() {
                     expect(data.newPosition).toEqual(3);
                     expect(typeof(callback)).toEqual("function");
                     return {
-                        error: function(a, b, c) {}
+                        error: function(a, b, c) {
+                        }
                     }
                 };
                 rave.api.rpc.moveWidget({targetRegion: {id:"region-1"}, currentRegion: {id:"region-2"}, targetIndex: 3, widget:{id:"widget-3-body"}});
             });
         });
+        describe("deleteWidget", function() {
+            it("posts correct values to the RPC service for deleting a widget from the page", function() {
+                var callbackCalled = false;
+                $.post = function(url, data, callback) {
+                    expect(url).toEqual("api/rpc/page/regionWidget/1/delete");
+                    expect(typeof(callback)).toEqual("function");
+                    callback({error:false});
+                    return {
+                        error: function(a, b, c) {
+                        }
+                    }
+                };
+                var callback = function() {
+                    callbackCalled = true
+                };
+                rave.api.rpc.removeWidget({regionWidgetId : 1, successCallback: callback});
+                expect(callbackCalled).toBeTruthy();
+            });
+
+        });
         describe("Error handling", function() {
             it("displays the appropriate alert when invalid parameters are passed", function() {
 
                 $.post = function(url, data, handler) {
                     handler({error: true, errorCode: "INVALID_PARAMS"});
                     return {
-                        error: function(a, b, c) {}
+                        error: function(a, b, c) {
+                        }
                     }
                 };
                 alert = function(str) {
                     expect(str).toEqual("Rave attempted to update the server with your recent changes, " +
-                            " but the changes were rejected by the server as invalid.");
+                        " but the changes were rejected by the server as invalid.");
                 };
                 rave.api.rpc.moveWidget({targetRegion: {id:"region-1"}, currentRegion: {id:"region-2"}, targetIndex: 3, widget:{id:"widget-3-body"}});
 
@@ -73,12 +96,13 @@ describe("Rave API", function() {
                 $.post = function(url, data, handler) {
                     handler({error: true, errorCode: "INTERNAL_ERROR"});
                     return {
-                        error: function(a, b, c) {}
+                        error: function(a, b, c) {
+                        }
                     }
                 };
                 alert = function(str) {
                     expect(str).toEqual("Rave attempted to update the server with your recent changes, " +
-                            " but the server encountered an internal error.");
+                        " but the server encountered an internal error.");
                 };
                 rave.api.rpc.moveWidget({targetRegion: {id:"region-1"}, currentRegion: {id:"region-2"}, targetIndex: 3, widget:{id:"widget-3-body"}});
             });