builder.clear(); builder.isComplete(state.isComplete() || completeData);
json.put(KEY_COMPLETE, state.isComplete()); json.put(KEY_IS_DELETING_EVENTUALLY, isDeletingEventually); JSONArray availableKeys = new JSONArray(state.availableKeys());
@Test public void testGetAvailableIfKeyAvailable() { ParseObject.State state = mock(ParseObject.State.class); when(state.className()).thenReturn("TestObject"); when(state.isComplete()).thenReturn(false); when(state.availableKeys()).thenReturn(new HashSet<>(Collections.singletonList("foo"))); ParseObject object = ParseObject.from(state); object.get("foo"); }
assertEquals(updateAtLong, newState.updatedAt()); assertEquals("testObjectId", newState.objectId()); assertFalse(newState.isComplete());
@Test public void testParcelable() { long updatedAt = System.currentTimeMillis(); long createdAt = updatedAt + 10; ParseObject.State state = new ParseObject.State.Builder("TestObject") .objectId("fake") .createdAt(new Date(createdAt)) .updatedAt(new Date(updatedAt)) .isComplete(true) .put("foo", "bar") .put("baz", "qux") .availableKeys(Arrays.asList("safe", "keys")) .build(); Parcel parcel = Parcel.obtain(); state.writeToParcel(parcel, ParseParcelEncoder.get()); parcel.setDataPosition(0); ParseObject.State copy = ParseObject.State.createFromParcel(parcel, ParseParcelDecoder.get()); assertEquals(state.className(), copy.className()); assertEquals(state.objectId(), copy.objectId()); assertEquals(state.createdAt(), copy.createdAt()); assertEquals(state.updatedAt(), copy.updatedAt()); assertEquals(state.isComplete(), copy.isComplete()); assertEquals(state.keySet().size(), copy.keySet().size()); assertEquals(state.get("foo"), copy.get("foo")); assertEquals(state.get("baz"), copy.get("baz")); assertEquals(state.availableKeys().size(), copy.availableKeys().size()); assertTrue(state.availableKeys().containsAll(copy.availableKeys())); assertTrue(copy.availableKeys().containsAll(state.availableKeys())); }
@Test public void testSaveAsync() throws Exception { // Make mock response and client JSONObject mockResponse = new JSONObject(); String createAtStr = "2015-08-09T22:15:13.460Z"; long createAtLong = ParseDateFormat.getInstance().parse(createAtStr).getTime(); String updateAtStr = "2015-08-09T22:15:13.497Z"; long updateAtLong = ParseDateFormat.getInstance().parse(updateAtStr).getTime(); mockResponse.put("createdAt", createAtStr); mockResponse.put("objectId", "testObjectId"); mockResponse.put("updatedAt", updateAtStr); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); // Make test state ParseObject object = new ParseObject("Test"); object.put("key", "value"); NetworkObjectController controller = new NetworkObjectController(restClient); ParseObject.State newState = ParseTaskUtils.wait(controller.saveAsync( object.getState(), object.startSave(), "sessionToken", ParseDecoder.get())); assertEquals(createAtLong, newState.createdAt()); assertEquals(updateAtLong, newState.updatedAt()); assertEquals("testObjectId", newState.objectId()); assertFalse(newState.isComplete()); }
@Test public void testFetchAsync() throws Exception { // Make mock response and client JSONObject mockResponse = new JSONObject(); String createAtStr = "2015-08-09T22:15:13.460Z"; long createAtLong = ParseDateFormat.getInstance().parse(createAtStr).getTime(); String updateAtStr = "2015-08-09T22:15:13.497Z"; long updateAtLong = ParseDateFormat.getInstance().parse(updateAtStr).getTime(); mockResponse.put("createdAt", createAtStr); mockResponse.put("objectId", "testObjectId"); mockResponse.put("key", "value"); mockResponse.put("updatedAt", updateAtStr); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); // Make test state ParseObject.State state = new ParseObject.State.Builder("Test") .objectId("testObjectId") .build(); NetworkObjectController controller = new NetworkObjectController(restClient); ParseObject.State newState = ParseTaskUtils.wait(controller.fetchAsync(state, "sessionToken", ParseDecoder.get())); assertEquals(createAtLong, newState.createdAt()); assertEquals(updateAtLong, newState.updatedAt()); assertEquals("value", newState.get("key")); assertEquals("testObjectId", newState.objectId()); assertTrue(newState.isComplete()); }
@Test public void testCopy() { long updatedAt = System.currentTimeMillis(); long createdAt = updatedAt + 10; ParseObject.State state = new ParseObject.State.Builder("TestObject") .objectId("fake") .createdAt(new Date(createdAt)) .updatedAt(new Date(updatedAt)) .isComplete(true) .put("foo", "bar") .put("baz", "qux") .availableKeys(Arrays.asList("safe", "keys")) .build(); ParseObject.State copy = new ParseObject.State.Builder(state).build(); assertEquals(state.className(), copy.className()); assertEquals(state.objectId(), copy.objectId()); assertEquals(state.createdAt(), copy.createdAt()); assertEquals(state.updatedAt(), copy.updatedAt()); assertEquals(state.isComplete(), copy.isComplete()); assertEquals(state.keySet().size(), copy.keySet().size()); assertEquals(state.get("foo"), copy.get("foo")); assertEquals(state.get("baz"), copy.get("baz")); assertEquals(state.availableKeys().size(), copy.availableKeys().size()); assertTrue(state.availableKeys().containsAll(copy.availableKeys())); assertTrue(copy.availableKeys().containsAll(state.availableKeys())); }
/** * Applies a {@code State} on top of this {@code Builder} instance. * * @param other The {@code State} to apply over this instance. * @return A new {@code Builder} instance. */ public T apply(State other) { if (other.objectId() != null) { objectId(other.objectId()); } if (other.createdAt() > 0) { createdAt(other.createdAt()); } if (other.updatedAt() > 0) { updatedAt(other.updatedAt()); } isComplete(isComplete || other.isComplete()); for (String key : other.keySet()) { put(key, other.get(key)); } availableKeys(other.availableKeys()); return self(); }
@Override public Void then(Task<Void> task) { synchronized (mutex) { State newState; if (result.isComplete()) { // Result is complete, so just replace newState = result; } else { // Result is incomplete, so we'll need to apply it to the current state newState = getState().newBuilder() .apply(operationsBeforeSave) .apply(result) .build(); } setState(newState); } return null; } });
@Override public Task<Void> then(Task<Void> task) { synchronized (mutex) { State newState; if (result.isComplete()) { // Result is complete, so just replace newState = result; } else { // Result is incomplete, so we'll need to apply it to the current state newState = getState().newBuilder().apply(result).build(); } setState(newState); } return null; } });
/** * Converts a {@code ParseObject.State} to a {@code ParseObject}. * * @param state The {@code ParseObject.State} to convert from. * @return A {@code ParseObject} instance. */ static <T extends ParseObject> T from(ParseObject.State state) { @SuppressWarnings("unchecked") T object = (T) ParseObject.createWithoutData(state.className(), state.objectId()); synchronized (object.mutex) { State newState; if (state.isComplete()) { newState = state; } else { newState = object.getState().newBuilder().apply(state).build(); } object.setState(newState); } return object; }
@Test public void testGetSessionAsync() throws Exception { // Make mock response and client JSONObject mockResponse = generateBasicMockResponse(); mockResponse.put("installationId", "39c8e8a4-6dd0-4c39-ac85-7fd61425083b"); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); NetworkSessionController controller = new NetworkSessionController(restClient); ParseObject.State newState = ParseTaskUtils.wait(controller.getSessionAsync("sessionToken")); // Verify session state verifyBasicSessionState(mockResponse, newState); assertEquals("39c8e8a4-6dd0-4c39-ac85-7fd61425083b", newState.get("installationId")); assertTrue(newState.isComplete()); }
@Test public void testProperties() { long updatedAt = System.currentTimeMillis(); long createdAt = updatedAt + 10; ParseObject.State state = new ParseObject.State.Builder("TestObject") .objectId("fake") .createdAt(new Date(createdAt)) .updatedAt(new Date(updatedAt)) .isComplete(true) .build(); assertEquals("TestObject", state.className()); assertEquals("fake", state.objectId()); assertEquals(createdAt, state.createdAt()); assertEquals(updatedAt, state.updatedAt()); assertTrue(state.isComplete()); }
@Test public void testUpgradeToRevocable() throws Exception { // Make mock response and client JSONObject mockResponse = generateBasicMockResponse(); ParseHttpClient restClient = ParseTestUtils.mockParseHttpClientWithResponse(mockResponse, 200, "OK"); NetworkSessionController controller = new NetworkSessionController(restClient); ParseObject.State newState = ParseTaskUtils.wait(controller.upgradeToRevocable("sessionToken")); // Verify session state verifyBasicSessionState(mockResponse, newState); assertTrue(newState.isComplete()); }
@Override protected boolean visit(Object object) { if (object instanceof ParseObject) { ParseObject parseObj = (ParseObject) object; State state = parseObj.getState(); if (state.objectId() != null && state.isComplete()) { fetchedObjects.put(state.objectId(), parseObj); } } return true; } };
@Test public void testDefaults() { ParseObject.State state = new ParseObject.State.Builder("TestObject").build(); assertEquals("TestObject", state.className()); assertNull(state.objectId()); assertEquals(-1, state.createdAt()); assertEquals(-1, state.updatedAt()); assertFalse(state.isComplete()); assertTrue(state.keySet().isEmpty()); assertTrue(state.availableKeys().isEmpty()); }
/** * Gets whether the {@code ParseObject} has been fetched. * * @return {@code true} if the {@code ParseObject} is new or has been fetched or refreshed. {@code false} * otherwise. */ public boolean isDataAvailable() { synchronized (mutex) { return state.isComplete(); } }
@Test(expected = IllegalStateException.class) public void testGetUnavailable() { ParseObject.State state = mock(ParseObject.State.class); when(state.className()).thenReturn("TestObject"); when(state.isComplete()).thenReturn(false); ParseObject object = ParseObject.from(state); object.get("foo"); }
Init(State state) { className = state.className(); objectId = state.objectId(); createdAt = state.createdAt(); updatedAt = state.updatedAt(); availableKeys = Collections.synchronizedSet(state.availableKeys()); for (String key : state.keySet()) { serverData.put(key, state.get(key)); availableKeys.add(key); } isComplete = state.isComplete(); }