Skip to content

Commit aa4b7c2

Browse files
Add comprehensive unit tests for ContentTypesCallback class
1 parent b82f8ff commit aa4b7c2

File tree

1 file changed

+308
-0
lines changed

1 file changed

+308
-0
lines changed
Lines changed: 308 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,308 @@
1+
package com.contentstack.sdk;
2+
3+
import org.json.JSONObject;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.concurrent.atomic.AtomicBoolean;
7+
import java.util.concurrent.atomic.AtomicReference;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
/**
12+
* Comprehensive unit tests for ContentTypesCallback class.
13+
*/
14+
public class TestContentTypesCallback {
15+
16+
@Test
17+
void testOnRequestFinishCallsOnCompletion() {
18+
// Track if onCompletion was called and with what parameters
19+
AtomicBoolean onCompletionCalled = new AtomicBoolean(false);
20+
AtomicReference<ContentTypesModel> receivedModel = new AtomicReference<>();
21+
AtomicReference<Error> receivedError = new AtomicReference<>();
22+
23+
// Create a concrete implementation
24+
ContentTypesCallback callback = new ContentTypesCallback() {
25+
@Override
26+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
27+
onCompletionCalled.set(true);
28+
receivedModel.set(contentTypesModel);
29+
receivedError.set(error);
30+
}
31+
};
32+
33+
// Create a dummy ContentTypesModel
34+
JSONObject response = new JSONObject();
35+
response.put("uid", "test_content_type");
36+
response.put("title", "Test Content Type");
37+
ContentTypesModel model = new ContentTypesModel();
38+
model.setJSON(response);
39+
40+
// Call onRequestFinish
41+
callback.onRequestFinish(model);
42+
43+
// Verify onCompletion was called with the model and null error
44+
assertTrue(onCompletionCalled.get());
45+
assertNotNull(receivedModel.get());
46+
assertEquals(model, receivedModel.get());
47+
assertNull(receivedError.get());
48+
}
49+
50+
@Test
51+
void testOnRequestFinishWithNullModel() {
52+
AtomicBoolean onCompletionCalled = new AtomicBoolean(false);
53+
AtomicReference<ContentTypesModel> receivedModel = new AtomicReference<>();
54+
AtomicReference<Error> receivedError = new AtomicReference<>();
55+
56+
ContentTypesCallback callback = new ContentTypesCallback() {
57+
@Override
58+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
59+
onCompletionCalled.set(true);
60+
receivedModel.set(contentTypesModel);
61+
receivedError.set(error);
62+
}
63+
};
64+
65+
// Call onRequestFinish with null
66+
callback.onRequestFinish(null);
67+
68+
// Verify onCompletion was called with null model and null error
69+
assertTrue(onCompletionCalled.get());
70+
assertNull(receivedModel.get());
71+
assertNull(receivedError.get());
72+
}
73+
74+
@Test
75+
void testOnRequestFailCallsOnCompletion() {
76+
AtomicBoolean onCompletionCalled = new AtomicBoolean(false);
77+
AtomicReference<ContentTypesModel> receivedModel = new AtomicReference<>();
78+
AtomicReference<Error> receivedError = new AtomicReference<>();
79+
80+
ContentTypesCallback callback = new ContentTypesCallback() {
81+
@Override
82+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
83+
onCompletionCalled.set(true);
84+
receivedModel.set(contentTypesModel);
85+
receivedError.set(error);
86+
}
87+
};
88+
89+
// Create an error
90+
Error error = new Error();
91+
error.setErrorMessage("Test error message");
92+
error.setErrorCode(404);
93+
94+
// Call onRequestFail
95+
callback.onRequestFail(ResponseType.NETWORK, error);
96+
97+
// Verify onCompletion was called with null model and the error
98+
assertTrue(onCompletionCalled.get());
99+
assertNull(receivedModel.get());
100+
assertNotNull(receivedError.get());
101+
assertEquals(error, receivedError.get());
102+
assertEquals("Test error message", receivedError.get().getErrorMessage());
103+
assertEquals(404, receivedError.get().getErrorCode());
104+
}
105+
106+
@Test
107+
void testOnRequestFailWithNullError() {
108+
AtomicBoolean onCompletionCalled = new AtomicBoolean(false);
109+
AtomicReference<ContentTypesModel> receivedModel = new AtomicReference<>();
110+
AtomicReference<Error> receivedError = new AtomicReference<>();
111+
112+
ContentTypesCallback callback = new ContentTypesCallback() {
113+
@Override
114+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
115+
onCompletionCalled.set(true);
116+
receivedModel.set(contentTypesModel);
117+
receivedError.set(error);
118+
}
119+
};
120+
121+
// Call onRequestFail with null error
122+
callback.onRequestFail(ResponseType.UNKNOWN, null);
123+
124+
// Verify onCompletion was called with null model and null error
125+
assertTrue(onCompletionCalled.get());
126+
assertNull(receivedModel.get());
127+
assertNull(receivedError.get());
128+
}
129+
130+
@Test
131+
void testOnRequestFailWithDifferentResponseTypes() {
132+
// Test with NETWORK response type
133+
AtomicReference<ResponseType> receivedResponseType = new AtomicReference<>();
134+
135+
ContentTypesCallback callback = new ContentTypesCallback() {
136+
@Override
137+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
138+
// Capture for verification
139+
}
140+
};
141+
142+
Error error = new Error();
143+
error.setErrorMessage("Network error");
144+
145+
// Test NETWORK
146+
assertDoesNotThrow(() -> callback.onRequestFail(ResponseType.NETWORK, error));
147+
148+
// Test UNKNOWN
149+
assertDoesNotThrow(() -> callback.onRequestFail(ResponseType.UNKNOWN, error));
150+
}
151+
152+
@Test
153+
void testMultipleOnRequestFinishCalls() {
154+
// Counter to track how many times onCompletion is called
155+
final int[] callCount = {0};
156+
157+
ContentTypesCallback callback = new ContentTypesCallback() {
158+
@Override
159+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
160+
callCount[0]++;
161+
}
162+
};
163+
164+
JSONObject response1 = new JSONObject();
165+
response1.put("uid", "content_type_1");
166+
ContentTypesModel model1 = new ContentTypesModel();
167+
model1.setJSON(response1);
168+
169+
JSONObject response2 = new JSONObject();
170+
response2.put("uid", "content_type_2");
171+
ContentTypesModel model2 = new ContentTypesModel();
172+
model2.setJSON(response2);
173+
174+
// Call multiple times
175+
callback.onRequestFinish(model1);
176+
callback.onRequestFinish(model2);
177+
callback.onRequestFinish(null);
178+
179+
// Verify onCompletion was called 3 times
180+
assertEquals(3, callCount[0]);
181+
}
182+
183+
@Test
184+
void testMultipleOnRequestFailCalls() {
185+
final int[] callCount = {0};
186+
187+
ContentTypesCallback callback = new ContentTypesCallback() {
188+
@Override
189+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
190+
callCount[0]++;
191+
}
192+
};
193+
194+
Error error1 = new Error();
195+
error1.setErrorMessage("Error 1");
196+
197+
Error error2 = new Error();
198+
error2.setErrorMessage("Error 2");
199+
200+
// Call multiple times
201+
callback.onRequestFail(ResponseType.NETWORK, error1);
202+
callback.onRequestFail(ResponseType.UNKNOWN, error2);
203+
callback.onRequestFail(ResponseType.NETWORK, null);
204+
205+
// Verify onCompletion was called 3 times
206+
assertEquals(3, callCount[0]);
207+
}
208+
209+
@Test
210+
void testOnCompletionWithCompleteContentTypesModel() {
211+
AtomicReference<ContentTypesModel> receivedModel = new AtomicReference<>();
212+
213+
ContentTypesCallback callback = new ContentTypesCallback() {
214+
@Override
215+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
216+
receivedModel.set(contentTypesModel);
217+
}
218+
};
219+
220+
// Create a complete model with multiple fields
221+
JSONObject response = new JSONObject();
222+
response.put("uid", "blog_post");
223+
response.put("title", "Blog Post");
224+
response.put("description", "Blog post content type");
225+
226+
ContentTypesModel model = new ContentTypesModel();
227+
model.setJSON(response);
228+
229+
callback.onRequestFinish(model);
230+
231+
assertNotNull(receivedModel.get());
232+
assertEquals(model, receivedModel.get());
233+
}
234+
235+
@Test
236+
void testOnCompletionWithCompleteError() {
237+
AtomicReference<Error> receivedError = new AtomicReference<>();
238+
239+
ContentTypesCallback callback = new ContentTypesCallback() {
240+
@Override
241+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
242+
receivedError.set(error);
243+
}
244+
};
245+
246+
// Create a complete error
247+
Error error = new Error();
248+
error.setErrorMessage("Unauthorized access");
249+
error.setErrorCode(401);
250+
error.setErrorDetail("Invalid API key");
251+
252+
callback.onRequestFail(ResponseType.NETWORK, error);
253+
254+
assertNotNull(receivedError.get());
255+
assertEquals("Unauthorized access", receivedError.get().getErrorMessage());
256+
assertEquals(401, receivedError.get().getErrorCode());
257+
assertEquals("Invalid API key", receivedError.get().getErrorDetail());
258+
}
259+
260+
@Test
261+
void testCallbackImplementationRequiresOnCompletion() {
262+
// Verify that the abstract method must be implemented
263+
ContentTypesCallback callback = new ContentTypesCallback() {
264+
@Override
265+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
266+
// Implementation required
267+
assertNotNull(this); // Just to have some assertion
268+
}
269+
};
270+
271+
assertNotNull(callback);
272+
}
273+
274+
@Test
275+
void testOnRequestFinishAndFailInteraction() {
276+
// Test that both methods can be called on the same callback instance
277+
final int[] successCount = {0};
278+
final int[] failCount = {0};
279+
280+
ContentTypesCallback callback = new ContentTypesCallback() {
281+
@Override
282+
public void onCompletion(ContentTypesModel contentTypesModel, Error error) {
283+
if (error == null) {
284+
successCount[0]++;
285+
} else {
286+
failCount[0]++;
287+
}
288+
}
289+
};
290+
291+
JSONObject response = new JSONObject();
292+
response.put("uid", "test");
293+
ContentTypesModel model = new ContentTypesModel();
294+
model.setJSON(response);
295+
296+
Error error = new Error();
297+
error.setErrorMessage("Test error");
298+
299+
// Call both methods
300+
callback.onRequestFinish(model);
301+
callback.onRequestFail(ResponseType.NETWORK, error);
302+
callback.onRequestFinish(model);
303+
304+
assertEquals(2, successCount[0]);
305+
assertEquals(1, failCount[0]);
306+
}
307+
}
308+

0 commit comments

Comments
 (0)