Skip to content

Commit 299ea98

Browse files
author
Ben Lei
committed
Handle the response on non-atomically deleting records
1 parent a432d00 commit 299ea98

9 files changed

+451
-1
lines changed

skygear/src/androidTest/java/io/skygear/skygear/MultiRecordDeleteResponseHandlerUnitTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ public void testMultiRecordDeleteResponseNormalFlow() throws Exception {
2626
jsonObject2.put("_recordID", "48092492-0791-4120-B314-022202AD3971");
2727
results.put(jsonObject2);
2828

29-
3029
JSONObject resultObject = new JSONObject();
3130
resultObject.put("result", results);
3231

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package io.skygear.skygear;
2+
3+
import android.support.test.runner.AndroidJUnit4;
4+
5+
import org.json.JSONArray;
6+
import org.json.JSONObject;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
10+
import static org.junit.Assert.*;
11+
12+
@RunWith(AndroidJUnit4.class)
13+
public class RecordNonAtomicDeleteByIDResponseHandlerUnitTest {
14+
@Test
15+
public void testRecordNonAtomicDeleteByIDResponseSomeErrorsFlow() throws Exception {
16+
JSONArray results = new JSONArray();
17+
18+
JSONObject jsonObject1 = new JSONObject();
19+
jsonObject1.put("_type", "record");
20+
jsonObject1.put("_recordType", "Note");
21+
jsonObject1.put("_recordID", "48092492-0791-4120-B314-022202AD3970");
22+
results.put(jsonObject1);
23+
24+
JSONObject jsonObject2 = new JSONObject();
25+
jsonObject2.put("_type", "error");
26+
jsonObject2.put("code", 110);
27+
jsonObject2.put("message", "record not found");
28+
jsonObject2.put("type", "ResourceNotFound");
29+
results.put(jsonObject2);
30+
31+
JSONObject jsonObject3 = new JSONObject();
32+
jsonObject3.put("_type", "record");
33+
jsonObject3.put("_recordType", "Note");
34+
jsonObject3.put("_recordID", "48092492-0791-4120-B314-022202AD3971");
35+
results.put(jsonObject3);
36+
37+
JSONObject resultObject = new JSONObject();
38+
resultObject.put("result", results);
39+
40+
final boolean[] checkpoints = new boolean[] { false };
41+
RecordNonAtomicDeleteByIDResponseHandler handler = new RecordNonAtomicDeleteByIDResponseHandler() {
42+
@Override
43+
public void onDeleteSuccess(RecordResult<String>[] results) {
44+
assertEquals(3, results.length);
45+
assertEquals("48092492-0791-4120-B314-022202AD3970", results[0].value);
46+
assertEquals("48092492-0791-4120-B314-022202AD3971", results[2].value);
47+
48+
assertNull(results[1].value);
49+
assertTrue(results[1].isError());
50+
assertEquals(110, results[1].error.getCode().getValue());
51+
assertEquals("record not found", results[1].error.getDetailMessage());
52+
53+
checkpoints[0] = true;
54+
}
55+
56+
@Override
57+
public void onDeleteFail(Error error) {
58+
fail("Should not get error callback");
59+
}
60+
};
61+
62+
handler.onSuccess(resultObject);
63+
assertTrue(checkpoints[0]);
64+
}
65+
66+
@Test
67+
public void testRecordNonAtomicDeleteByIDResponseNormalFlow() throws Exception {
68+
JSONArray results = new JSONArray();
69+
70+
JSONObject jsonObject1 = new JSONObject();
71+
jsonObject1.put("_type", "record");
72+
jsonObject1.put("_recordType", "Note");
73+
jsonObject1.put("_recordID", "48092492-0791-4120-B314-022202AD3970");
74+
results.put(jsonObject1);
75+
76+
JSONObject jsonObject2 = new JSONObject();
77+
jsonObject2.put("_type", "record");
78+
jsonObject2.put("_recordType", "Note");
79+
jsonObject2.put("_recordID", "48092492-0791-4120-B314-022202AD3971");
80+
results.put(jsonObject2);
81+
82+
JSONObject resultObject = new JSONObject();
83+
resultObject.put("result", results);
84+
85+
final boolean[] checkpoints = new boolean[] { false };
86+
RecordNonAtomicDeleteByIDResponseHandler handler = new RecordNonAtomicDeleteByIDResponseHandler() {
87+
@Override
88+
public void onDeleteSuccess(RecordResult<String>[] results) {
89+
assertEquals(2, results.length);
90+
assertEquals("48092492-0791-4120-B314-022202AD3970", results[0].value);
91+
assertEquals("48092492-0791-4120-B314-022202AD3971", results[1].value);
92+
93+
checkpoints[0] = true;
94+
}
95+
96+
@Override
97+
public void onDeleteFail(Error error) {
98+
fail("Should not get error callback");
99+
}
100+
};
101+
102+
handler.onSuccess(resultObject);
103+
assertTrue(checkpoints[0]);
104+
}
105+
106+
@Test
107+
public void testRecordNonAtomicDeleteByIDResponseOperationalErrorFlow() throws Exception {
108+
final boolean[] checkpoints = new boolean[] { false };
109+
RecordNonAtomicDeleteByIDResponseHandler handler = new RecordNonAtomicDeleteByIDResponseHandler() {
110+
@Override
111+
public void onDeleteSuccess(RecordResult<String>[] results) {
112+
fail("Should not get success callback");
113+
}
114+
115+
@Override
116+
public void onDeleteFail(Error error) {
117+
assertEquals("some-error", error.getDetailMessage());
118+
checkpoints[0] = true;
119+
}
120+
};
121+
122+
handler.onFail(new Error("some-error"));
123+
assertTrue(checkpoints[0]);
124+
}
125+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package io.skygear.skygear;
2+
3+
import android.support.test.runner.AndroidJUnit4;
4+
5+
import org.json.JSONArray;
6+
import org.json.JSONObject;
7+
import org.junit.Test;
8+
import org.junit.runner.RunWith;
9+
10+
import static org.junit.Assert.*;
11+
12+
@RunWith(AndroidJUnit4.class)
13+
public class RecordNonAtomicDeleteResponseHandlerUnitTest {
14+
@Test
15+
public void testRecordNonAtomicDeleteResponseNormalFlow() throws Exception {
16+
JSONArray results = new JSONArray();
17+
18+
JSONObject jsonObject1 = new JSONObject();
19+
jsonObject1.put("_type", "record");
20+
jsonObject1.put("_recordType", "Note");
21+
jsonObject1.put("_recordID", "48092492-0791-4120-B314-022202AD3970");
22+
results.put(jsonObject1);
23+
24+
JSONObject jsonObject2 = new JSONObject();
25+
jsonObject2.put("_type", "record");
26+
jsonObject2.put("_recordType", "Note");
27+
jsonObject2.put("_recordID", "48092492-0791-4120-B314-022202AD3971");
28+
results.put(jsonObject2);
29+
30+
JSONObject resultObject = new JSONObject();
31+
resultObject.put("result", results);
32+
33+
final boolean[] checkpoints = new boolean[] { false };
34+
RecordNonAtomicDeleteResponseHandler handler = new RecordNonAtomicDeleteResponseHandler() {
35+
@Override
36+
public void onDeleteSuccess(RecordResult<Record>[] results) {
37+
assertEquals(2, results.length);
38+
assertEquals("Note", results[0].value.getType());
39+
assertEquals("48092492-0791-4120-B314-022202AD3970", results[0].value.getId());
40+
assertTrue(results[0].value.deleted);
41+
assertEquals("Note", results[1].value.getType());
42+
assertEquals("48092492-0791-4120-B314-022202AD3971", results[1].value.getId());
43+
assertTrue(results[1].value.deleted);
44+
45+
checkpoints[0] = true;
46+
}
47+
48+
@Override
49+
public void onDeleteFail(Error error) {
50+
fail("Should not get error callback");
51+
}
52+
};
53+
54+
handler.onSuccess(resultObject);
55+
assertTrue(checkpoints[0]);
56+
}
57+
58+
@Test
59+
public void testRecordNonAtomicDeleteResponseSomeErrorsFlow() throws Exception {
60+
JSONArray results = new JSONArray();
61+
62+
JSONObject jsonObject1 = new JSONObject();
63+
jsonObject1.put("_type", "record");
64+
jsonObject1.put("_recordType", "Note");
65+
jsonObject1.put("_recordID", "48092492-0791-4120-B314-022202AD3970");
66+
results.put(jsonObject1);
67+
68+
JSONObject jsonObject2 = new JSONObject();
69+
jsonObject2.put("_type", "error");
70+
jsonObject2.put("code", 110);
71+
jsonObject2.put("message", "record not found");
72+
jsonObject2.put("type", "ResourceNotFound");
73+
results.put(jsonObject2);
74+
75+
JSONObject jsonObject3 = new JSONObject();
76+
jsonObject3.put("_type", "record");
77+
jsonObject3.put("_recordType", "Note");
78+
jsonObject3.put("_recordID", "48092492-0791-4120-B314-022202AD3971");
79+
results.put(jsonObject3);
80+
81+
JSONObject resultObject = new JSONObject();
82+
resultObject.put("result", results);
83+
84+
final boolean[] checkpoints = new boolean[] { false };
85+
RecordNonAtomicDeleteResponseHandler handler = new RecordNonAtomicDeleteResponseHandler() {
86+
@Override
87+
public void onDeleteSuccess(RecordResult<Record>[] results) {
88+
assertEquals(3, results.length);
89+
assertEquals("Note", results[0].value.getType());
90+
assertEquals("48092492-0791-4120-B314-022202AD3970", results[0].value.getId());
91+
assertTrue(results[0].value.deleted);
92+
assertEquals("Note", results[2].value.getType());
93+
assertEquals("48092492-0791-4120-B314-022202AD3971", results[2].value.getId());
94+
assertTrue(results[2].value.deleted);
95+
96+
assertNull(results[1].value);
97+
assertTrue(results[1].isError());
98+
assertEquals(110, results[1].error.getCode().getValue());
99+
assertEquals("record not found", results[1].error.getDetailMessage());
100+
101+
checkpoints[0] = true;
102+
}
103+
104+
@Override
105+
public void onDeleteFail(Error error) {
106+
fail("Should not get error callback");
107+
}
108+
};
109+
110+
handler.onSuccess(resultObject);
111+
assertTrue(checkpoints[0]);
112+
}
113+
114+
@Test
115+
public void testRecordNonAtomicDeleteResponseOperationalErrorFlow() throws Exception {
116+
final boolean[] checkpoints = new boolean[] { false };
117+
RecordNonAtomicDeleteResponseHandler handler = new RecordNonAtomicDeleteResponseHandler() {
118+
@Override
119+
public void onDeleteSuccess(RecordResult<Record>[] results) {
120+
fail("Should not get success callback");
121+
}
122+
123+
@Override
124+
public void onDeleteFail(Error error) {
125+
assertEquals("some-error", error.getDetailMessage());
126+
checkpoints[0] = true;
127+
}
128+
};
129+
130+
handler.onFail(new Error("some-error"));
131+
assertTrue(checkpoints[0]);
132+
}
133+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package io.skygear.skygear;
2+
3+
import org.junit.Test;
4+
5+
import static org.junit.Assert.*;
6+
7+
public class RecordResultUnitTest {
8+
@Test
9+
public void testValueOnly() {
10+
RecordResult<String> result = new RecordResult<>("some-value");
11+
assertEquals("some-value", result.value);
12+
assertNull(result.error);
13+
assertFalse(result.isError());
14+
}
15+
16+
@Test
17+
public void testErrorResult() {
18+
RecordResult<String> result = new RecordResult<>(
19+
null,
20+
new Error("some-error")
21+
);
22+
assertNull(result.value);
23+
assertEquals("some-error", result.error.getDetailMessage());
24+
assertTrue(result.isError());
25+
}
26+
}

skygear/src/main/java/io/skygear/skygear/Database.java

+36
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,42 @@ public void delete(String recordType, String[] recordIDs, MultiRecordDeleteByIDR
362362
this.getContainer().sendRequest(request);
363363
}
364364

365+
/**
366+
* Delete records by IDs non-atomically.
367+
*
368+
* @param recordType the record type
369+
* @param recordIDs the record IDs
370+
* @param handler the response handler
371+
*/
372+
public void deleteNonAtomically(
373+
String recordType,
374+
String[] recordIDs,
375+
RecordNonAtomicDeleteByIDResponseHandler handler)
376+
{
377+
RecordDeleteRequest request = new RecordDeleteRequest(recordType, recordIDs, this);
378+
request.setAtomic(false);
379+
request.setResponseHandler(handler);
380+
381+
this.getContainer().sendRequest(request);
382+
}
383+
384+
/**
385+
* Delete records non-atomically.
386+
*
387+
* @param records the records
388+
* @param handler the response handler
389+
*/
390+
public void deleteNonAtomically(
391+
Record[] records,
392+
RecordNonAtomicDeleteResponseHandler handler
393+
) {
394+
RecordDeleteRequest request = new RecordDeleteRequest(records, this);
395+
request.setAtomic(false);
396+
request.setResponseHandler(handler);
397+
398+
this.getContainer().sendRequest(request);
399+
}
400+
365401
/**
366402
* Upload asset.
367403
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.skygear.skygear;
2+
3+
import org.json.JSONException;
4+
import org.json.JSONObject;
5+
6+
/**
7+
* The Response Handler for Non-Atomic Deleting Record by ID
8+
*/
9+
public abstract class RecordNonAtomicDeleteByIDResponseHandler
10+
extends RecordNonAtomicDeleteResponseBaseHandler<String>
11+
{
12+
@Override
13+
protected final String parseRecordJSONObject(JSONObject jsonObject) throws JSONException {
14+
return RecordSerializer.deserialize(jsonObject).getId();
15+
}
16+
}

0 commit comments

Comments
 (0)