diff --git a/platform/commonUI/browse/test/MenuArrowControllerSpec.js b/platform/commonUI/browse/test/MenuArrowControllerSpec.js index 7a78407d36..7b58b20a7c 100644 --- a/platform/commonUI/browse/test/MenuArrowControllerSpec.js +++ b/platform/commonUI/browse/test/MenuArrowControllerSpec.js @@ -25,217 +25,58 @@ * MenuArrowControllerSpec. Created by shale on 07/02/2015. */ define( - ["../src/BrowseController"], - function (BrowseController) { + ["../src/MenuArrowController"], + function (MenuArrowController) { "use strict"; + + //var JQLITE_FUNCTIONS = [ "on", "off", "find", "append", "remove" ], + // DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ]; - describe("The browse controller", function () { + + describe("The menu arrow controller", function () { var mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService, - mockRootObject, - mockUrlService, mockDomainObject, - mockNextObject, + mockEvent, + mockContextMenuAction, + mockActionContext, controller; - - function mockPromise(value) { - return { - then: function (callback) { - return mockPromise(callback(value)); - } - }; - } - + beforeEach(function () { mockScope = jasmine.createSpyObj( "$scope", [ "$on", "$watch" ] ); - mockRoute = { current: { params: {} } }; - mockLocation = jasmine.createSpyObj( - "$location", - [ "path" ] - ); - mockUrlService = jasmine.createSpyObj( - "urlService", - ["urlForLocation"] - ); - mockObjectService = jasmine.createSpyObj( - "objectService", - [ "getObjects" ] - ); - mockNavigationService = jasmine.createSpyObj( - "navigationService", - [ - "getNavigation", - "setNavigation", - "addListener", - "removeListener" - ] - ); - mockRootObject = jasmine.createSpyObj( - "domainObject", - [ "getId", "getCapability", "getModel", "useCapability" ] - ); mockDomainObject = jasmine.createSpyObj( "domainObject", - [ "getId", "getCapability", "getModel", "useCapability" ] + [ "getCapability" ] ); - mockNextObject = jasmine.createSpyObj( - "nextObject", - [ "getId", "getCapability", "getModel", "useCapability" ] + mockEvent = jasmine.createSpyObj( + "event", + [ "preventDefault" ] ); - - mockObjectService.getObjects.andReturn(mockPromise({ - ROOT: mockRootObject - })); - mockRootObject.useCapability.andReturn(mockPromise([ - mockDomainObject - ])); - mockDomainObject.useCapability.andReturn(mockPromise([ - mockNextObject - ])); - mockNextObject.useCapability.andReturn(undefined); - mockNextObject.getId.andReturn("next"); - mockDomainObject.getId.andReturn("mine"); - - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService, - mockUrlService + mockContextMenuAction = jasmine.createSpyObj( + "menu", + [ "perform", "destroy" ] ); - }); - - it("uses composition to set the navigated object, if there is none", function () { - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService, - mockUrlService - ); - expect(mockNavigationService.setNavigation) - .toHaveBeenCalledWith(mockDomainObject); - }); - - it("does not try to override navigation", function () { - mockNavigationService.getNavigation.andReturn(mockDomainObject); - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService, - mockUrlService - ); - expect(mockScope.navigatedObject).toBe(mockDomainObject); - }); - - it("updates scope when navigated object changes", function () { - // Should have registered a listener - call it - mockNavigationService.addListener.mostRecentCall.args[0]( - mockDomainObject - ); - expect(mockScope.navigatedObject).toEqual(mockDomainObject); - }); - - it("releases its navigation listener when its scope is destroyed", function () { - expect(mockScope.$on).toHaveBeenCalledWith( - "$destroy", - jasmine.any(Function) - ); - mockScope.$on.mostRecentCall.args[1](); - // Should remove the listener it added earlier - expect(mockNavigationService.removeListener).toHaveBeenCalledWith( - mockNavigationService.addListener.mostRecentCall.args[0] - ); - }); - - it("uses route parameters to choose initially-navigated object", function () { - mockRoute.current.params.ids = "mine/next"; - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService - ); - expect(mockScope.navigatedObject).toBe(mockNextObject); - expect(mockNavigationService.setNavigation) - .toHaveBeenCalledWith(mockNextObject); - }); - - it("handles invalid IDs by going as far as possible", function () { - // Idea here is that if we get a bad path of IDs, - // browse controller should traverse down it until - // it hits an invalid ID. - mockRoute.current.params.ids = "mine/junk"; - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService - ); - expect(mockScope.navigatedObject).toBe(mockDomainObject); - expect(mockNavigationService.setNavigation) - .toHaveBeenCalledWith(mockDomainObject); - }); - - it("handles compositionless objects by going as far as possible", function () { - // Idea here is that if we get a path which passes - // through an object without a composition, browse controller - // should stop at it since remaining IDs cannot be loaded. - mockRoute.current.params.ids = "mine/next/junk"; - controller = new BrowseController( - mockScope, - mockRoute, - mockLocation, - mockObjectService, - mockNavigationService - ); - expect(mockScope.navigatedObject).toBe(mockNextObject); - expect(mockNavigationService.setNavigation) - .toHaveBeenCalledWith(mockNextObject); - }); - - it("updates the displayed route to reflect current navigation", function () { - var mockContext = jasmine.createSpyObj('context', ['getPath']), - mockUnlisten = jasmine.createSpy('unlisten'), - mockMode = "browse"; - - mockContext.getPath.andReturn( - [mockRootObject, mockDomainObject, mockNextObject] - ); - mockNextObject.getCapability.andCallFake(function (c) { - return c === 'context' && mockContext; + mockActionContext = {key: 'menu', domainObject: mockDomainObject, event: mockEvent}; + + mockScope.domainObject = mockDomainObject; + mockDomainObject.getCapability.andReturn(function (c) { + //return c === 'action' ? mockContextMenuAction : undefined; + return mockContextMenuAction; }); - mockScope.$on.andReturn(mockUnlisten); - // Provide a navigation change - mockNavigationService.addListener.mostRecentCall.args[0]( - mockNextObject - ); - // Allows the path index to be checked - // prior to setting $route.current - mockLocation.path.andReturn("/browse/"); + controller = new MenuArrowController(mockScope); + }); + + it(" calls the context menu action when clicked", function () { + // Simulate a click on the menu arrow + controller.showMenu(mockEvent); - // Exercise the Angular workaround - mockScope.$on.mostRecentCall.args[1](); - expect(mockUnlisten).toHaveBeenCalled(); + //stop = $scope.domainObject.getCapability('action').perform(actionContext); - // location.path to be called with the urlService's - // urlFor function with the next domainObject and mode - expect(mockLocation.path).toHaveBeenCalledWith( - mockUrlService.urlForLocation(mockMode, mockNextObject) - ); + expect(mockDomainObject.getCapability).toHaveBeenCalled(); + //.toHaveBeenCalledWith('action'); }); }); diff --git a/platform/representation/test/actions/ContextMenuActionSpec.js b/platform/representation/test/actions/ContextMenuActionSpec.js index 2d65ff6414..5cfdab1e17 100644 --- a/platform/representation/test/actions/ContextMenuActionSpec.js +++ b/platform/representation/test/actions/ContextMenuActionSpec.js @@ -47,8 +47,8 @@ define( mockElement, mockDomainObject, mockEvent, - gesture, - fireGesture; + mockActionContext, + action; beforeEach(function () { mockCompile = jasmine.createSpy("$compile"); @@ -69,38 +69,32 @@ define( mockCompiledTemplate.andReturn(mockMenu); mockDocument.find.andReturn(mockBody); mockRootScope.$new.andReturn(mockScope); + + mockActionContext = {key: 'menu', domainObject: mockDomainObject, event: mockEvent}; - gesture = new ContextMenuGesture( + action = new ContextMenuAction( mockCompile, mockDocument, mockWindow, mockRootScope, - mockElement, - mockDomainObject + mockActionContext ); - - // Capture the contextmenu callback - fireGesture = mockElement.on.mostRecentCall.args[1]; }); - it("compiles and adds a menu to the DOM on a contextmenu event", function () { - // Make sure that callback really is for the contextmenu event - expect(mockElement.on.mostRecentCall.args[0]).toEqual("contextmenu"); - - fireGesture(mockEvent); - + it(" adds a menu to the DOM when perform is called", function () { + action.perform(); expect(mockBody.append).toHaveBeenCalledWith(mockMenu); }); it("prevents the default context menu behavior", function () { - fireGesture(mockEvent); + action.perform(); expect(mockEvent.preventDefault).toHaveBeenCalled(); }); it("positions menus where clicked", function () { mockEvent.pageX = 10; mockEvent.pageY = 5; - fireGesture(mockEvent); + action.perform(); expect(mockScope.menuStyle.left).toEqual("10px"); expect(mockScope.menuStyle.top).toEqual("5px"); expect(mockScope.menuStyle.right).toBeUndefined(); @@ -112,7 +106,7 @@ define( it("repositions menus near the screen edge", function () { mockEvent.pageX = mockWindow.innerWidth - 10; mockEvent.pageY = mockWindow.innerHeight - 5; - fireGesture(mockEvent); + action.perform(); expect(mockScope.menuStyle.right).toEqual("10px"); expect(mockScope.menuStyle.bottom).toEqual("5px"); expect(mockScope.menuStyle.left).toBeUndefined(); @@ -123,14 +117,14 @@ define( it("removes a menu when body is clicked", function () { // Show the menu - fireGesture(mockEvent); - + action.perform(); + // Verify precondition expect(mockBody.off).not.toHaveBeenCalled(); - // Find and fire body's click listener + // Find and fire body's mousedown listener mockBody.on.calls.forEach(function (call) { - if (call.args[0] === 'click') { + if (call.args[0] === 'mousedown') { call.args[1](); } }); @@ -144,14 +138,14 @@ define( it("removes listeners from body if destroyed while menu is showing", function () { // Show the menu - fireGesture(mockEvent); - + action.perform(); + // Verify preconditions expect(mockBody.off).not.toHaveBeenCalled(); expect(mockMenu.remove).not.toHaveBeenCalled(); // Destroy the menu - gesture.destroy(); + action.destroy(); // Verify menu was removed and listener detached expect(mockBody.off).toHaveBeenCalled(); diff --git a/platform/representation/test/gestures/ContextMenuGestureSpec.js b/platform/representation/test/gestures/ContextMenuGestureSpec.js index 7a13bb98ff..98076e6e82 100644 --- a/platform/representation/test/gestures/ContextMenuGestureSpec.js +++ b/platform/representation/test/gestures/ContextMenuGestureSpec.js @@ -31,53 +31,22 @@ define( "use strict"; var JQLITE_FUNCTIONS = [ "on", "off", "find", "append", "remove" ], - DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ], - MENU_DIMENSIONS = GestureConstants.MCT_MENU_DIMENSIONS; + DOMAIN_OBJECT_METHODS = [ "getId", "getModel", "getCapability", "hasCapability", "useCapability" ]; describe("The 'context menu' gesture", function () { - var mockCompile, - mockCompiledTemplate, - mockMenu, - mockDocument, - mockBody, - mockWindow, - mockRootScope, - mockScope, - mockElement, + var mockElement, mockDomainObject, mockEvent, gesture, fireGesture; beforeEach(function () { - mockCompile = jasmine.createSpy("$compile"); - mockCompiledTemplate = jasmine.createSpy("template"); - mockMenu = jasmine.createSpyObj("menu", JQLITE_FUNCTIONS); - mockDocument = jasmine.createSpyObj("$document", JQLITE_FUNCTIONS); - mockBody = jasmine.createSpyObj("body", JQLITE_FUNCTIONS); - mockWindow = { innerWidth: MENU_DIMENSIONS[0] * 4, innerHeight: MENU_DIMENSIONS[1] * 4 }; - mockRootScope = jasmine.createSpyObj("$rootScope", ["$new"]); - mockScope = {}; mockElement = jasmine.createSpyObj("element", JQLITE_FUNCTIONS); mockDomainObject = jasmine.createSpyObj("domainObject", DOMAIN_OBJECT_METHODS); mockEvent = jasmine.createSpyObj("event", ["preventDefault"]); - mockEvent.pageX = 0; - mockEvent.pageY = 0; - mockCompile.andReturn(mockCompiledTemplate); - mockCompiledTemplate.andReturn(mockMenu); - mockDocument.find.andReturn(mockBody); - mockRootScope.$new.andReturn(mockScope); - - gesture = new ContextMenuGesture( - mockCompile, - mockDocument, - mockWindow, - mockRootScope, - mockElement, - mockDomainObject - ); + gesture = new ContextMenuGesture(mockElement, mockDomainObject); // Capture the contextmenu callback fireGesture = mockElement.on.mostRecentCall.args[1]; @@ -97,7 +66,8 @@ define( expect(mockElement.off).toHaveBeenCalledWith( "contextmenu", - mockElement.on.mostRecentCall.args[1] + //mockElement.on.mostRecentCall.args[1] + mockDomainObject.calls ); });