package com.eclipsesource.tabris.xcallbackurl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import static org.mockito.Matchers.anyMap; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.util.Map; import org.eclipse.rap.json.JsonObject; import org.eclipse.rap.rwt.remote.RemoteObject; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; import com.eclipsesource.tabris.test.util.TabrisEnvironment; public class XCallbackTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); @Test( expected = IllegalArgumentException.class ) public void testFailsWithNullConfiguration() { new XCallback( null ); } @Test( expected = IllegalArgumentException.class ) public void testFailsWithNullCallback() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); xCallback.addXCallbackListener( null ); } @Test( expected = IllegalArgumentException.class ) public void testFailsWithRemovingNullCallback() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); xCallback.removeXCallbackListener( null ); } @Test public void testUsesConfigAsCallParameter() { RemoteObject remoteObject = environment.getRemoteObject(); XCallbackConfiguration configuration = new XCallbackConfiguration( "foo", "bar" ); XCallback xCallback = new XCallback( configuration ); xCallback.call(); ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class ); verify( remoteObject ).call( eq( "call" ), captor.capture() ); assertEquals( "foo", captor.getValue().get( "targetScheme" ).asString() ); assertEquals( "bar", captor.getValue().get( "targetAction" ).asString() ); } @Test public void testUsesConfigAsCallParameterWithXSource() { RemoteObject remoteObject = environment.getRemoteObject(); XCallbackConfiguration configuration = new XCallbackConfiguration( "foo", "bar" ); XCallback xCallback = new XCallback( configuration ); configuration.setXSource( "foo" ); xCallback.call(); ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class ); verify( remoteObject ).call( eq( "call" ), captor.capture() ); assertEquals( "foo", captor.getValue().get( "xSource" ).asString() ); } @Test public void testUsesConfigAsCallParameterWithActionParameters() { RemoteObject remoteObject = environment.getRemoteObject(); XCallbackConfiguration configuration = new XCallbackConfiguration( "foo", "bar" ); XCallback xCallback = new XCallback( configuration ); configuration.addActionParameter( "foo1", "bar1" ); xCallback.call(); ArgumentCaptor<JsonObject> captor = ArgumentCaptor.forClass( JsonObject.class ); verify( remoteObject ).call( eq( "call" ), captor.capture() ); JsonObject parameter = captor.getValue().get( "actionParameters" ).asObject(); assertEquals( "bar1", parameter.get( "foo1" ).asString() ); } @Test @SuppressWarnings("unchecked") public void testNotifiesCallbackOnSuccess() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); JsonObject parameters = new JsonObject(); parameters.add( "foo", "bar" ); environment.dispatchNotify( "Success", parameters ); ArgumentCaptor<Map> captor = ArgumentCaptor.forClass( Map.class ); verify( listener ).onSuccess( captor.capture() ); assertEquals( 1, captor.getValue().size() ); assertEquals( "bar", captor.getValue().get( "foo" ) ); } @Test @SuppressWarnings("unchecked") public void testNotifiesAllCallbacksOnSuccess() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); XCallbackListener listener2 = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); xCallback.addXCallbackListener( listener2 ); environment.dispatchNotify( "Success", null ); InOrder order = inOrder( listener, listener2 ); order.verify( listener ).onSuccess( anyMap() ); order.verify( listener2 ).onSuccess( anyMap() ); } @Test public void testNotifiesCallbackOnError() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); JsonObject parameters = new JsonObject(); parameters.add( "errorCode", "42" ); parameters.add( "errorMessage", "foo" ); environment.dispatchNotify( "Error", parameters ); verify( listener ).onError( "42", "foo" ); } @Test public void testNotifiesAllCallbacksOnError() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); XCallbackListener listener2 = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); xCallback.addXCallbackListener( listener2 ); JsonObject parameters = new JsonObject(); parameters.add( "errorCode", "42" ); parameters.add( "errorMessage", "foo" ); environment.dispatchNotify( "Error", parameters ); InOrder order = inOrder( listener, listener2 ); order.verify( listener ).onError( "42", "foo" ); order.verify( listener2 ).onError( "42", "foo" ); } @Test public void testNotifiesCallbackOnCancel() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); environment.dispatchNotify( "Cancel", null ); verify( listener ).onCancel(); } @Test public void testNotifiesAllCallbacksOnCancel() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); XCallbackListener listener = mock( XCallbackListener.class ); XCallbackListener listener2 = mock( XCallbackListener.class ); xCallback.addXCallbackListener( listener ); xCallback.addXCallbackListener( listener2 ); environment.dispatchNotify( "Cancel", null ); InOrder order = inOrder( listener, listener2 ); order.verify( listener ).onCancel(); order.verify( listener2 ).onCancel(); } @Test public void testGetsRemoteObjectAsAdapter() { XCallback xCallback = new XCallback( mock( XCallbackConfiguration.class ) ); RemoteObject adapter = xCallback.getAdapter( RemoteObject.class ); assertSame( adapter, xCallback.getRemoteObject() ); } @Test public void testGetsConfigurationAsAdapter() { XCallbackConfiguration configuration = mock( XCallbackConfiguration.class ); XCallback xCallback = new XCallback( configuration ); XCallbackConfiguration adapter = xCallback.getAdapter( XCallbackConfiguration.class ); assertSame( adapter, configuration ); } @Test public void testDisposeDestroysRemoteObject() { RemoteObject remoteObject = environment.getRemoteObject(); XCallbackConfiguration configuration = mock( XCallbackConfiguration.class ); XCallback xCallback = new XCallback( configuration ); xCallback.dispose(); verify( remoteObject ).destroy(); } @Test( expected = IllegalStateException.class ) public void testFaislWithDoubleDestroy() { XCallbackConfiguration configuration = mock( XCallbackConfiguration.class ); XCallback xCallback = new XCallback( configuration ); xCallback.dispose(); xCallback.dispose(); } @Test( expected = IllegalStateException.class ) public void testFaislCallAfterDestroy() { XCallbackConfiguration configuration = mock( XCallbackConfiguration.class ); XCallback xCallback = new XCallback( configuration ); xCallback.dispose(); xCallback.call(); } }