package com.googlecode.gwt.test.rpc; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet; import com.googlecode.gwt.test.GwtTestTest; import com.googlecode.gwt.test.client.MyObject; import com.googlecode.gwt.test.exceptions.GwtTestRpcException; import org.junit.Before; import org.junit.Test; import org.springframework.mock.web.MockHttpServletRequest; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; public class RemoteServiceTest extends GwtTestTest { private boolean failure; private boolean success; @Test public void accessToHttpRequest() { // Given MyServiceAsync myService = GWT.create(MyService.class); setServletMockProvider(new ServletMockProviderAdapter() { @Override public HttpServletRequest getMockedRequest(AbstractRemoteServiceServlet rpcService, Method rpcMethod) { MockHttpServletRequest mock = new MockHttpServletRequest(); mock.addHeader("myHeader", "mocked header's value"); return mock; } }); // When myService.getHttpRequestHeader("myHeader", new AsyncCallback<String>() { public void onFailure(Throwable caught) { fail("onFailure should not be called"); } public void onSuccess(String result) { success = true; assertThat(result).isEqualTo("mocked header's value"); } }); // Then assertThat(success).isFalse(); getBrowserSimulator().fireLoopEnd(); assertThat(success).isTrue(); } @Test public void accessToHttpRequest_ThrowsExceptionWhenNoMockConfigured() { // Given MyServiceAsync myService = GWT.create(MyService.class); // When try { myService.getHttpRequestHeader("myHeader", new AsyncCallback<String>() { public void onFailure(Throwable caught) { fail("onFailure should not be called"); } public void onSuccess(String result) { fail("onSucess should not be called"); } }); getBrowserSimulator().fireLoopEnd(); fail("getHttpRequestHeader should have thrown a GwtTestRpcException"); } catch (GwtTestRpcException e) { assertThat(e).hasMessage("Illegal call to com.googlecode.gwt.test.rpc.MyServiceImpl.getThreadLocalRequest() : You have to set a valid ServletMockProvider instance through RemoteServiceTest.setServletMockProvider(..) method"); } } @Before public void beforeRemoteServiceTest() { failure = false; success = false; } @Test public void rpcCall_WithException() { // Given MyServiceAsync myService = GWT.create(MyService.class); // When myService.someCallWithException(new AsyncCallback<Void>() { public void onFailure(Throwable caught) { assertThat(caught.getMessage()).isEqualTo("Server side thrown exception !!"); failure = true; } public void onSuccess(Void result) { fail("onSucess should not be called"); } }); // Then assertThat(failure).isFalse(); getBrowserSimulator().fireLoopEnd(); assertThat(failure).isTrue(); } @Test public void rpcCall_WithSuccess() { // Given MyObject object = new MyObject("my field initialized during test setup"); MyServiceAsync myService = GWT.create(MyService.class); // When myService.update(object, new AsyncCallback<MyObject>() { public void onFailure(Throwable caught) { fail("onFailure should not be called"); } public void onSuccess(MyObject result) { // Then 2 assertThat(result.getMyField()).isEqualTo("updated field by server side code"); assertThat(result.getMyTransientField()).isEqualTo("transient field"); assertThat(result.getMyChildObjects()).hasSize(1); assertThat(result.getMyChildObjects().get(0).getMyChildField()).isEqualTo("this is a child !"); assertThat(result.getMyChildObjects().get(0).getMyChildTransientField()).isEqualTo("child object transient field"); assertThat(result.getMyChildObjects().get(0).getMyField()).isEqualTo("the field inherited from the parent has been updated !"); assertThat(result.getMyChildObjects().get(0).getMyTransientField()).isEqualTo("transient field"); success = true; } }); // Then 1 assertThat(success).isFalse(); getBrowserSimulator().fireLoopEnd(); // Then 3 assertThat(success).isTrue(); } }