From d2a75c43386958e21ff26d91e316bbd97616ea72 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 5 Jun 2015 06:31:23 -0700 Subject: [PATCH] [Info Bubble] Add test cases for gesture Add test cases for the info gesture, WTD-884. --- .../inspect/src/gestures/InfoGesture.js | 1 + .../inspect/test/gestures/InfoGestureSpec.js | 81 +++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/platform/commonUI/inspect/src/gestures/InfoGesture.js b/platform/commonUI/inspect/src/gestures/InfoGesture.js index 4ac4627bad..44534c4b6d 100644 --- a/platform/commonUI/inspect/src/gestures/InfoGesture.js +++ b/platform/commonUI/inspect/src/gestures/InfoGesture.js @@ -61,6 +61,7 @@ define( if (pendingBubble) { $timeout.cancel(pendingBubble); element.off('mousemove', trackPosition); + element.off('mouseleave', hideBubble); pendingBubble = undefined; } // Also clear mouse position so we don't have a ton of tiny diff --git a/platform/commonUI/inspect/test/gestures/InfoGestureSpec.js b/platform/commonUI/inspect/test/gestures/InfoGestureSpec.js index 4b72d6ba6b..0cead9a4b3 100644 --- a/platform/commonUI/inspect/test/gestures/InfoGestureSpec.js +++ b/platform/commonUI/inspect/test/gestures/InfoGestureSpec.js @@ -34,10 +34,22 @@ define( mockDomainObject, mockScope, mockOff, + testMetadata, + mockPromise, + mockHide, gesture; + function fireEvent(evt, value) { + mockElement.on.calls.forEach(function (call) { + if (call.args[0] === evt) { + call.args[1](value); + } + }); + } + beforeEach(function () { mockTimeout = jasmine.createSpy('$timeout'); + mockTimeout.cancel = jasmine.createSpy('cancel'); mockInfoService = jasmine.createSpyObj( 'infoService', [ 'display' ] @@ -52,9 +64,18 @@ define( ); mockScope = jasmine.createSpyObj('$scope', [ '$on' ]); mockOff = jasmine.createSpy('$off'); + testMetadata = [ { name: "Test name", value: "Test value" } ]; + mockPromise = jasmine.createSpyObj('promise', ['then']); + mockHide = jasmine.createSpy('hide'); + mockDomainObject.getModel.andReturn({ name: "Test Object" }); + mockDomainObject.useCapability.andCallFake(function (c) { + return (c === 'metadata') ? testMetadata : undefined; + }); mockElement.scope.andReturn(mockScope); mockScope.$on.andReturn(mockOff); + mockTimeout.andReturn(mockPromise); + mockInfoService.display.andReturn(mockHide); gesture = new InfoGesture( mockTimeout, @@ -70,6 +91,66 @@ define( .toHaveBeenCalledWith('mouseenter', jasmine.any(Function)); }); + it("displays an info bubble on a delay after mouseenter", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + expect(mockTimeout) + .toHaveBeenCalledWith(jasmine.any(Function), testDelay); + mockTimeout.mostRecentCall.args[0](); + expect(mockInfoService.display).toHaveBeenCalledWith( + jasmine.any(String), + "Test Object", + testMetadata, + [ 1977, 42 ] + ); + }); + + it("does not display info bubble if mouse leaves too soon", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + fireEvent("mouseleave", { clientX: 1977, clientY: 42 }); + expect(mockTimeout.cancel).toHaveBeenCalledWith(mockPromise); + expect(mockInfoService.display).not.toHaveBeenCalled(); + }); + + it("hides a shown bubble when mouse leaves", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + mockTimeout.mostRecentCall.args[0](); + expect(mockHide).not.toHaveBeenCalled(); // verify precondition + fireEvent("mouseleave", {}); + expect(mockHide).toHaveBeenCalled(); + }); + + it("tracks mouse position", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + fireEvent("mousemove", { clientX: 1999, clientY: 11 }); + fireEvent("mousemove", { clientX: 1984, clientY: 11 }); + mockTimeout.mostRecentCall.args[0](); + // Should have displayed at the latest observed mouse position + expect(mockInfoService.display).toHaveBeenCalledWith( + jasmine.any(String), + "Test Object", + testMetadata, + [ 1984, 11 ] + ); + }); + + it("hides shown bubbles when destroyed", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + mockTimeout.mostRecentCall.args[0](); + expect(mockHide).not.toHaveBeenCalled(); // verify precondition + gesture.destroy(); + expect(mockHide).toHaveBeenCalled(); + }); + + it("detaches listeners when destroyed", function () { + fireEvent("mouseenter", { clientX: 1977, clientY: 42 }); + gesture.destroy(); + mockElement.on.calls.forEach(function (call) { + expect(mockElement.off).toHaveBeenCalledWith( + call.args[0], + call.args[1] + ); + }); + }); }); }