package com.rapidftr.services; import static junit.framework.Assert.assertEquals; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import java.util.Hashtable; import java.util.Vector; import org.junit.Before; import org.junit.Test; import com.rapidftr.Key; import com.rapidftr.datastore.Children; import com.rapidftr.datastore.ChildrenRecordStore; import com.rapidftr.datastore.MockStore; import com.rapidftr.model.Child; import com.rapidftr.model.ChildFactory; import com.rapidftr.model.ChildStatus; import com.rapidftr.net.RequestCallBack; import com.rapidftr.net.RequestFactory; import com.sun.me.web.path.Result; import com.sun.me.web.path.ResultException; import com.sun.me.web.request.Response; public class ChildSyncListenerTest { private ChildPhotoUpdater photoUpdater; private ChildrenRecordStore store; private ChildSyncListener listener; private RequestCallBack requestCallback; @Before public void setup() { photoUpdater = mock(ChildPhotoUpdater.class); store = new ChildrenRecordStore(new MockStore(new Key("childrenrecord"))); requestCallback = mock(RequestCallBack.class); listener = new ChildSyncListener(requestCallback, 1, store, photoUpdater); } @Test public void shouldUpdateChildFieldsOnRequestSuccess() throws Exception { Child child = ChildFactory.existingChild("id"); child.setField("somefield", "original value"); Hashtable requestContext = RequestFactory.getRequestContext(child); listener.done(requestContext, successfulResponse()); final Children children = store.getAll(); final Child childFromStore = children.toArray()[0]; assertEquals("updatedvalue", childFromStore.getField("somefield")); assertEquals(ChildStatus.SYNCED, childFromStore.childStatus()); } @Test public void shouldSetSyncFailedOnFailure() throws Exception { Child child = ChildFactory.existingChild("id"); listener.done(RequestFactory.getRequestContext(child), RequestFactory.failedResponse()); final Children children = store.getAll(); final Child childFromStore = children.toArray()[0]; assertEquals(ChildStatus.SYNC_FAILED, childFromStore.childStatus()); } @Test public void shouldDecrementTotalsOnSuccess() throws Exception { Child child = ChildFactory.existingChild("id"); Hashtable requestContext = RequestFactory.getRequestContext(child); assertEquals(1, listener.getTotal()); listener.done(requestContext, successfulResponse()); assertEquals(0, listener.getTotal()); } @Test public void shouldDecrementTotalsOnFailure() throws Exception { Child child = ChildFactory.existingChild("id"); Hashtable requestContext = RequestFactory.getRequestContext(child); assertEquals(1, listener.getTotal()); listener.done(requestContext, RequestFactory.failedResponse()); assertEquals(0, listener.getTotal()); } @Test public void shouldCallProcessSuccessOnSuccess() throws Exception { Child child = ChildFactory.existingChild("id"); child.setField("somefield", "original value"); Hashtable requestContext = RequestFactory.getRequestContext(child); listener.done(requestContext, successfulResponse()); verify(requestCallback).onProcessSuccess(); } @Test public void shouldCallProcessFailOnFailure() throws Exception { Child child = ChildFactory.existingChild("id"); Hashtable requestContext = RequestFactory.getRequestContext(child); listener.done(requestContext, RequestFactory.failedResponse()); verify(requestCallback).onProcessFail(anyString()); } @Test public void shouldCallPhotoUpdatesIfNeeded() throws Exception { Child child = ChildFactory.existingChild("id"); Hashtable requestContext = RequestFactory.getRequestContext(child); Result result = Result.fromContent("{\"current_photo_key\":\"updatedvalue\"}", "application/json"); Response response = new Response(result, 200); listener.done(requestContext, response); Vector childrenWithPhotos = new Vector(); childrenWithPhotos.addElement(child); verify(photoUpdater).doUpdates(childrenWithPhotos, requestCallback, false); } private Response successfulResponse() throws ResultException { Result result = Result.fromContent("{\"somefield\":\"updatedvalue\"}", "application/json"); Response response = new Response(result, 200); return response; } }