Skip to content

Commit cbd070d

Browse files
committed
Added testing of SystemHookManager.handleEvent() (#332).
1 parent afdd3ef commit cbd070d

File tree

3 files changed

+132
-2
lines changed

3 files changed

+132
-2
lines changed

src/test/java/org/gitlab4j/api/JsonUtils.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ public class JsonUtils {
2525
jacksonJson.getObjectMapper().configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
2626
}
2727

28-
28+
static JsonNode readTreeFromResource(String filename) throws JsonParseException, JsonMappingException, IOException {
29+
InputStreamReader reader = new InputStreamReader(TestGitLabApiBeans.class.getResourceAsStream(filename));
30+
return (jacksonJson.readTree(reader));
31+
}
32+
2933
static <T> T unmarshalResource(Class<T> returnType, String filename) throws JsonParseException, JsonMappingException, IOException {
3034
InputStreamReader reader = new InputStreamReader(TestGitLabApiBeans.class.getResourceAsStream(filename));
3135
return (jacksonJson.unmarshal(returnType, reader));
@@ -45,6 +49,10 @@ static <T> T unmarshal(Class<T> returnType, Reader reader) throws JsonParseExcep
4549
return (jacksonJson.unmarshal(returnType, reader));
4650
}
4751

52+
static <T> T unmarshal(Class<T> returnType, JsonNode tree) throws JsonParseException, JsonMappingException, IOException {
53+
return (jacksonJson.unmarshal(returnType, tree));
54+
}
55+
4856
static <T> T unmarshal(Class<T> returnType, String json) throws JsonParseException, JsonMappingException, IOException {
4957
return (jacksonJson.unmarshal(returnType, json));
5058
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package org.gitlab4j.api;
2+
3+
import java.io.IOException;
4+
5+
import javax.servlet.ReadListener;
6+
import javax.servlet.ServletInputStream;
7+
8+
public class MockServletInputStream extends ServletInputStream {
9+
10+
private byte[] inputBytes;
11+
private int lastIndexRetrieved = -1;
12+
private ReadListener readListener = null;
13+
14+
public MockServletInputStream(String data) {
15+
inputBytes = data.getBytes();
16+
}
17+
18+
@Override
19+
public boolean isFinished() {
20+
return (lastIndexRetrieved == inputBytes.length-1);
21+
}
22+
23+
@Override
24+
public boolean isReady() {
25+
// This implementation will never block
26+
// We also never need to call the readListener from this method, as this method will never return false
27+
return isFinished();
28+
}
29+
30+
@Override
31+
public void setReadListener(ReadListener readListener) {
32+
this.readListener = readListener;
33+
if (!isFinished()) {
34+
try {
35+
readListener.onDataAvailable();
36+
} catch (IOException e) {
37+
readListener.onError(e);
38+
}
39+
} else {
40+
try {
41+
readListener.onAllDataRead();
42+
} catch (IOException e) {
43+
readListener.onError(e);
44+
}
45+
}
46+
}
47+
48+
@Override
49+
public int read() throws IOException {
50+
int i;
51+
if (!isFinished()) {
52+
i = inputBytes[lastIndexRetrieved+1];
53+
lastIndexRetrieved++;
54+
if (isFinished() && (readListener != null)) {
55+
try {
56+
readListener.onAllDataRead();
57+
} catch (IOException ex) {
58+
readListener.onError(ex);
59+
throw ex;
60+
}
61+
}
62+
return i;
63+
} else {
64+
return -1;
65+
}
66+
}
67+
}

src/test/java/org/gitlab4j/api/TestGitLabApiEvents.java

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22

33

44
import static org.gitlab4j.api.JsonUtils.compareJson;
5+
import static org.gitlab4j.api.JsonUtils.readTreeFromResource;
56
import static org.gitlab4j.api.JsonUtils.unmarshalResource;
7+
import static org.junit.Assert.assertEquals;
8+
import static org.junit.Assert.assertNotNull;
69
import static org.junit.Assert.assertTrue;
10+
import static org.mockito.BDDMockito.given;
11+
import static org.mockito.Mockito.mock;
12+
13+
import java.util.logging.Level;
14+
15+
import javax.servlet.ServletInputStream;
16+
import javax.servlet.http.HttpServletRequest;
717

818
import org.gitlab4j.api.systemhooks.MergeRequestSystemHookEvent;
919
import org.gitlab4j.api.systemhooks.ProjectSystemHookEvent;
1020
import org.gitlab4j.api.systemhooks.PushSystemHookEvent;
1121
import org.gitlab4j.api.systemhooks.SystemHookEvent;
22+
import org.gitlab4j.api.systemhooks.SystemHookListener;
23+
import org.gitlab4j.api.systemhooks.SystemHookManager;
1224
import org.gitlab4j.api.systemhooks.TeamMemberSystemHookEvent;
1325
import org.gitlab4j.api.utils.JacksonJson;
1426
import org.gitlab4j.api.webhook.BuildEvent;
@@ -20,23 +32,33 @@
2032
import org.gitlab4j.api.webhook.PushEvent;
2133
import org.gitlab4j.api.webhook.TagPushEvent;
2234
import org.gitlab4j.api.webhook.WikiPageEvent;
35+
import org.junit.AfterClass;
2336
import org.junit.BeforeClass;
2437
import org.junit.Test;
2538

39+
import com.fasterxml.jackson.databind.JsonNode;
2640
import com.fasterxml.jackson.databind.SerializationFeature;
41+
import com.fasterxml.jackson.databind.node.ObjectNode;
2742

2843
public class TestGitLabApiEvents {
2944

3045
private static JacksonJson jacksonJson;
46+
private static Level savedLevel;
3147

3248
public TestGitLabApiEvents() {
3349
super();
3450
}
3551

3652
@BeforeClass
37-
public static void setup() {
53+
public static void setup() throws Exception {
3854
jacksonJson = new JacksonJson();
3955
jacksonJson.getObjectMapper().configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);
56+
savedLevel = GitLabApi.getLogger().getLevel();
57+
}
58+
59+
@AfterClass
60+
public static void teardown() {
61+
GitLabApi.getLogger().setLevel(savedLevel);
4062
}
4163

4264
@Test
@@ -243,4 +265,37 @@ public void testPolymorphicSystemHookEvent() throws Exception {
243265
event = unmarshalResource(SystemHookEvent.class, "merge-request-system-hook-event.json");
244266
assertTrue(compareJson(event, "merge-request-system-hook-event.json"));
245267
}
268+
269+
@Test
270+
public void testSystemHookManagerHandleEvent() throws Exception {
271+
272+
// Turn off logging. This is a hack as if we don't turn it off the logging tests ran later will fail
273+
GitLabApi.getLogger().setLevel(Level.OFF);;
274+
275+
// Arrange
276+
HttpServletRequest request = mock(HttpServletRequest.class);
277+
given(request.getHeader("X-Gitlab-Event")).willReturn(SystemHookManager.SYSTEM_HOOK_EVENT);
278+
279+
JsonNode tree = readTreeFromResource("merge-request-system-hook-event.json");
280+
((ObjectNode)tree).remove("event_name");
281+
String json = jacksonJson.getObjectMapper().writeValueAsString(tree);
282+
ServletInputStream servletInputStream = new MockServletInputStream(json);
283+
given(request.getInputStream()).willReturn(servletInputStream);
284+
285+
SystemHookManager systemHookMgr = new SystemHookManager();
286+
final SystemHookEvent receivedEvents[] = new SystemHookEvent[1];
287+
systemHookMgr.addListener(new SystemHookListener() {
288+
public void onMergeRequestEvent(MergeRequestSystemHookEvent event) {
289+
receivedEvents[0] = event;
290+
}
291+
});
292+
293+
// Act
294+
systemHookMgr.handleEvent(request);
295+
296+
// Assert
297+
assertNotNull(receivedEvents[0]);
298+
assertEquals(MergeRequestSystemHookEvent.class, receivedEvents[0].getClass());
299+
assertTrue(compareJson(receivedEvents[0], "merge-request-system-hook-event.json"));
300+
}
246301
}

0 commit comments

Comments
 (0)