/sigmah/src/test/java/org/sigmah/client/offline/ui/OfflinePresenterTest.java

http://sigma-h.googlecode.com/ · Java · 306 lines · 208 code · 74 blank · 24 comment · 0 complexity · b16299211c161c0d237e981d5323d173 MD5 · raw file

  1. /*
  2. * All Sigmah code is released under the GNU General Public License v3
  3. * See COPYRIGHT.txt and LICENSE.txt.
  4. */
  5. package org.sigmah.client.offline.ui;
  6. import com.extjs.gxt.ui.client.event.BaseObservable;
  7. import com.extjs.gxt.ui.client.event.Events;
  8. import com.extjs.gxt.ui.client.event.MenuEvent;
  9. import com.extjs.gxt.ui.client.event.Observable;
  10. import com.google.gwt.user.client.rpc.AsyncCallback;
  11. import com.google.inject.Provider;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14. import org.sigmah.client.dispatch.AsyncMonitor;
  15. import org.sigmah.client.dispatch.remote.RemoteDispatcher;
  16. import org.sigmah.client.mock.MockEventBus;
  17. import org.sigmah.client.mock.MockStateManager;
  18. import org.sigmah.client.offline.OfflineGateway;
  19. import org.sigmah.client.offline.sync.SyncStatusEvent;
  20. import org.sigmah.client.offline.ui.OfflinePresenter.PromptCallback;
  21. import org.sigmah.shared.command.Command;
  22. import org.sigmah.shared.command.result.CommandResult;
  23. import java.util.Date;
  24. import static org.easymock.EasyMock.*;
  25. import static org.hamcrest.CoreMatchers.equalTo;
  26. import static org.junit.Assert.assertThat;
  27. public class OfflinePresenterTest {
  28. private ViewStub view;
  29. private MockEventBus eventBus;
  30. private Provider<OfflineGateway> gatewayProvider;
  31. private OfflineImplStub offlineImpl;
  32. private MockStateManager stateManager;
  33. private RemoteDispatcher remoteDispatcher;
  34. @Before
  35. public void setUp() {
  36. view = new ViewStub();
  37. eventBus = new MockEventBus();
  38. offlineImpl = new OfflineImplStub();
  39. gatewayProvider = new Provider<OfflineGateway>() {
  40. @Override
  41. public OfflineGateway get() {
  42. return offlineImpl;
  43. }
  44. };
  45. stateManager = new MockStateManager();
  46. remoteDispatcher = null;
  47. }
  48. @Test
  49. public void installationSequence() {
  50. // No state is set, so the presenter should assume that offline is not yet installed
  51. OfflinePresenter presenter = new OfflinePresenter(view, eventBus, remoteDispatcher,
  52. gatewayProvider, stateManager);
  53. assertThat(view.defaultButtonText, equalTo("Install"));
  54. // click the default button
  55. view.defaultButton.fireEvent(Events.Select);
  56. // verify that installation has been launched
  57. assertThat(offlineImpl.lastCall, equalTo("install"));
  58. // verify the UI is showing the status
  59. assertThat(view.defaultButtonText, equalTo("Installing..."));
  60. assertThat(view.progressDialogVisible, equalTo(true));
  61. assertThat(view.menuEnabled, equalTo(false));
  62. // status event is fired
  63. eventBus.fireEvent(new SyncStatusEvent("sync-task", 50));
  64. // verify that progress bar is updated
  65. assertThat(view.percentComplete, equalTo(50d));
  66. // signal that installation is complete
  67. offlineImpl.lastCallback.onSuccess(null);
  68. // verify that the UI has been updated
  69. assertThat(view.progressDialogVisible, equalTo(false));
  70. assertThat(view.defaultButtonText, equalTo("Last Sync'd: <date>"));
  71. assertThat(view.menuEnabled, equalTo(true));
  72. }
  73. @Test
  74. public void loadWhenOfflineIsEnabled() {
  75. // No state is set, so the presenter should assume that offline is not yet installed
  76. stateManager.set(OfflinePresenter.OFFLINE_MODE_KEY, OfflinePresenter.OfflineMode.OFFLINE.toString());
  77. OfflinePresenter presenter = new OfflinePresenter(view, eventBus,
  78. remoteDispatcher, gatewayProvider, stateManager);
  79. // offline async fragment finishes loading
  80. assertThat(offlineImpl.lastCall, equalTo("goOffline"));
  81. offlineImpl.lastCallback.onSuccess(null);
  82. assertThat(view.defaultButtonText, equalTo("Last Sync'd: <date>"));
  83. assertThat(offlineImpl.lastCall, equalTo("goOffline"));
  84. }
  85. @Test
  86. public void reinstallWhileOffline() {
  87. stateManager.set(OfflinePresenter.OFFLINE_MODE_KEY, OfflinePresenter.OfflineMode.OFFLINE.toString());
  88. new OfflinePresenter(view, eventBus, remoteDispatcher,
  89. gatewayProvider, stateManager);
  90. // offline async fragment finishes loading
  91. offlineImpl.lastCallback.onSuccess(null);
  92. // now click the reinstall menu item
  93. view.reinstallItem.fireEvent(Events.Select, new MenuEvent(null));
  94. // we should be in install mode
  95. assertThat(offlineImpl.lastCall, equalTo("install"));
  96. assertThat(view.defaultButtonText, equalTo("Installing..."));
  97. }
  98. private static class ViewStub implements OfflinePresenter.View {
  99. public BaseObservable defaultButton = new BaseObservable();
  100. public String defaultButtonText;
  101. public boolean progressDialogVisible = false;
  102. public String taskDescription;
  103. public double percentComplete;
  104. public boolean menuEnabled = false;
  105. private BaseObservable reinstallItem = new BaseObservable();
  106. private BaseObservable toggleItem = new BaseObservable();
  107. private BaseObservable syncNowItem = new BaseObservable();
  108. @Override
  109. public Observable getButton() {
  110. return defaultButton;
  111. }
  112. @Override
  113. public Observable getReinstallItem() {
  114. return reinstallItem;
  115. }
  116. @Override
  117. public Observable getToggleItem() {
  118. return toggleItem;
  119. }
  120. @Override
  121. public Observable getSyncNowItem() {
  122. return syncNowItem;
  123. }
  124. @Override
  125. public void setButtonTextToInstall() {
  126. this.defaultButtonText = "Install";
  127. }
  128. @Override
  129. public void setButtonTextToInstalling() {
  130. this.defaultButtonText = "Installing...";
  131. }
  132. @Override
  133. public void setButtonTextToLoading() {
  134. this.defaultButtonText = "Loading...";
  135. }
  136. @Override
  137. public void setButtonTextToSyncing() {
  138. this.defaultButtonText = "Syncing...";
  139. }
  140. @Override
  141. public void setButtonTextToLastSync(Date lastSyncTime) {
  142. this.defaultButtonText = "Last Sync'd: <date>";
  143. }
  144. @Override
  145. public void setButtonTextToOnline() {
  146. this.defaultButtonText = "Online";
  147. }
  148. @Override
  149. public void updateProgress(String taskDescription, double percentComplete) {
  150. this.taskDescription = taskDescription;
  151. this.percentComplete = percentComplete;
  152. }
  153. @Override
  154. public void showProgressDialog() {
  155. progressDialogVisible = true;
  156. }
  157. @Override
  158. public void hideProgressDialog() {
  159. progressDialogVisible = false;
  160. }
  161. @Override
  162. public void enableMenu() {
  163. menuEnabled = true;
  164. }
  165. @Override
  166. public void disableMenu() {
  167. menuEnabled = false;
  168. }
  169. @Override
  170. public void showError(String message) {
  171. // TODO Auto-generated method stub
  172. }
  173. @Override
  174. public void promptToGoOnline(PromptCallback callback) {
  175. // TODO Auto-generated method stub
  176. }
  177. @Override
  178. public void setConnectionDialogToFailure() {
  179. // TODO Auto-generated method stub
  180. }
  181. @Override
  182. public void setConnectionDialogToBusy() {
  183. // TODO Auto-generated method stub
  184. }
  185. @Override
  186. public void hideConnectionDialog() {
  187. // TODO Auto-generated method stub
  188. }
  189. }
  190. private static class OfflineImplStub implements OfflineGateway {
  191. AsyncCallback<Void> lastCallback;
  192. String lastCall = "not yet been called";
  193. @Override
  194. public void install(AsyncCallback<Void> callback) {
  195. onCalled("install", callback);
  196. }
  197. @Override
  198. public void goOffline(AsyncCallback<Void> callback) {
  199. onCalled("goOffline", callback);
  200. }
  201. @Override
  202. public void goOnline(AsyncCallback<Void> callback) {
  203. onCalled("goOnline", callback);
  204. }
  205. @Override
  206. public void synchronize(AsyncCallback<Void> callback) {
  207. onCalled("synchronize", callback);
  208. }
  209. @Override
  210. public Date getLastSyncTime() {
  211. return null;
  212. }
  213. private void onCalled(String method, AsyncCallback<Void> callback) {
  214. lastCall = method;
  215. lastCallback = callback;
  216. }
  217. @Override
  218. public boolean validateOfflineInstalled() {
  219. return true;
  220. }
  221. @Override
  222. public boolean canHandle(Command command) {
  223. // TODO Auto-generated method stub
  224. return false;
  225. }
  226. @Override
  227. public void execute(Command command, AsyncMonitor monitor,
  228. AsyncCallback callback) {
  229. // TODO Auto-generated method stub
  230. }
  231. }
  232. }