/******************************************************************************* * Copyright (c) 2013 EclipseSource and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * EclipseSource - initial API and implementation ******************************************************************************/ package com.eclipsesource.tabris.internal.ui; import static com.eclipsesource.tabris.internal.Constants.METHOD_OPEN; import static com.eclipsesource.tabris.internal.Constants.PROPERTY_MESSAGE; import static com.eclipsesource.tabris.internal.Constants.PROPERTY_QUERY; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonObject; import org.eclipse.rap.rwt.internal.serverpush.ServerPushManager; import org.eclipse.rap.rwt.remote.RemoteObject; import org.eclipse.swt.widgets.Display; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import com.eclipsesource.tabris.test.util.TabrisEnvironment; import com.eclipsesource.tabris.ui.UI; import com.eclipsesource.tabris.ui.UIConfiguration; import com.eclipsesource.tabris.ui.action.Proposal; import com.eclipsesource.tabris.ui.action.ProposalHandler; import com.eclipsesource.tabris.ui.action.SearchAction; import com.eclipsesource.tabris.ui.action.SearchActionListener; @SuppressWarnings("restriction") public class RemoteSearchActionTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); private RemoteObject remoteObject; private ActionDescriptor actionDescriptor; private UI ui; private RemoteUI uiRenderer; @Before public void setUp() { Display display = new Display(); remoteObject = environment.getRemoteObject(); ui = mock( UI.class ); mockUI( mock( SearchActionListener.class ) ); uiRenderer = mock( RemoteUI.class ); when( uiRenderer.getRemoteUIId() ).thenReturn( "foo" ); when( ui.getDisplay() ).thenReturn( display ); actionDescriptor = mock( ActionDescriptor.class ); when( actionDescriptor.getId() ).thenReturn( "foo" ); InputStream image = RemoteActionTest.class.getResourceAsStream( "testImage.png" ); when( actionDescriptor.getImage() ).thenReturn( ImageUtil.getBytes( image ) ); when( actionDescriptor.getTitle() ).thenReturn( "bar" ); TestSearchAction action = new TestSearchAction(); when( actionDescriptor.getAction() ).thenReturn( action ); } @Test public void testRegistersItselfAsChangeListener() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); RemoteSearchAction renderer = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); PropertyChangeNotifier adapter = action.getAdapter( PropertyChangeNotifier.class ); assertSame( adapter.getPropertyChangeHandler(), renderer ); } @Test public void testCallsExecuteOnSelectionEvent() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); environment.dispatchNotify( "Selection", new JsonObject() ); verify( action ).execute( ui ); } @Test public void testCallsSearchOnSearchEvent() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Search", properties ); verify( action ).search( "bar" ); } @Test public void testNotifiesListenerOnSearchEvent() { SearchActionListener listener = mock( SearchActionListener.class ); mockUI( listener ); SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Search", properties ); verify( listener ).searched( ui, action, "bar" ); } @Test public void testCallsGetProposalsOnModifyEvent() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Modify", properties ); verify( action ).modified( eq( "bar" ), any( ProposalHandler.class ) ); } @Test public void testNotifiesListenerOnModifyEvent() { SearchActionListener listener = mock( SearchActionListener.class ); mockUI( listener ); SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Modify", properties ); verify( listener ).modified( ui, action, "bar" ); } @Test public void testSendsProposals() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); List<Proposal> proposals = new ArrayList<Proposal>(); proposals.add( new Proposal( "foo" ) ); proposals.add( new Proposal( "bar" ) ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Modify", properties ); ArgumentCaptor<ProposalHandler> captor = ArgumentCaptor.forClass( ProposalHandler.class ); verify( action ).modified( eq( "bar" ), captor.capture() ); captor.getValue().setProposals( proposals ); verify( remoteObject ).set( "proposals", new JsonArray().add( "foo" ).add( "bar" ) ); } @Test public void testSendsNullProposalsAsEmptyArray() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Modify", properties ); ArgumentCaptor<ProposalHandler> captor = ArgumentCaptor.forClass( ProposalHandler.class ); verify( action ).modified( eq( "bar" ), captor.capture() ); captor.getValue().setProposals( new ArrayList<Proposal>() ); verify( remoteObject ).set( "proposals", new JsonArray() ); } @Test( expected = IllegalArgumentException.class ) public void testFailsWithNullProposals() { SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); when( actionDescriptor.getAction() ).thenReturn( action ); JsonObject properties = new JsonObject(); properties.add( "query", "bar" ); environment.dispatchNotify( "Modify", properties ); ArgumentCaptor<ProposalHandler> captor = ArgumentCaptor.forClass( ProposalHandler.class ); verify( action ).modified( eq( "bar" ), captor.capture() ); captor.getValue().setProposals( null ); } @Test public void testActivatesServerPushSessionOnActivate() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); SearchAction action = spy( new TestSearchAction() ); when( actionDescriptor.getAction() ).thenReturn( action ); remoteAction.handleCall( "activate", null ); assertTrue( ServerPushManager.getInstance().isServerPushActive() ); } @Test public void testDeactivatesServerPushSessionOnDeactivate() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); remoteAction.handleCall( "activate", null ); remoteAction.handleCall( "deactivate", null ); assertFalse( ServerPushManager.getInstance().isServerPushActive() ); } @Test public void testCallsOpenOnPropertyChange() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); remoteAction.propertyChanged( METHOD_OPEN, null ); verify( remoteObject ).call( "open", null ); } @Test public void testCallsExecuteBeforeOpenOnPropertyChange() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); remoteAction.propertyChanged( METHOD_OPEN, null ); assertTrue( ( ( TestSearchAction ) actionDescriptor.getAction() ).wasExecuted() ); } @Test public void testSetsQueryOnPropertyChange() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); remoteAction.propertyChanged( PROPERTY_QUERY, "foo" ); verify( remoteObject ).set( "query", "foo" ); } @Test public void testSetsMessageOnPropertyChange() { RemoteSearchAction remoteAction = new RemoteSearchAction( ui, uiRenderer, actionDescriptor ); remoteAction.propertyChanged( PROPERTY_MESSAGE, "foo" ); verify( remoteObject ).set( "message", "foo" ); } private void mockUI( SearchActionListener listener ) { UIConfiguration configuration = new UIConfiguration(); configuration.addActionListener( listener ); when( ui.getConfiguration() ).thenReturn( configuration ); } }