From 1cd1dbebf5866e4768a5f1ba0c4c3f8fd5f156ba Mon Sep 17 00:00:00 2001 From: Anuj Hydrabadi Date: Thu, 1 May 2025 14:57:30 +0530 Subject: [PATCH] Add polymorphic deserialization for the GHAppInstallation account field --- src/main/java/org/kohsuke/github/GHAppInstallation.java | 9 +++++++-- src/test/java/org/kohsuke/github/AppTest.java | 1 + src/test/java/org/kohsuke/github/GHAppTest.java | 3 ++- src/test/java/org/kohsuke/github/GHEventPayloadTest.java | 5 +++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/kohsuke/github/GHAppInstallation.java b/src/main/java/org/kohsuke/github/GHAppInstallation.java index e92c744e99..1dfc63d0e9 100644 --- a/src/main/java/org/kohsuke/github/GHAppInstallation.java +++ b/src/main/java/org/kohsuke/github/GHAppInstallation.java @@ -1,6 +1,8 @@ package org.kohsuke.github; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.kohsuke.github.internal.EnumUtils; @@ -39,7 +41,10 @@ GHRepository[] getItems(GitHub root) { @JsonProperty("access_tokens_url") private String accessTokenUrl; - private GHUser account; + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") + @JsonSubTypes({ @JsonSubTypes.Type(value = GHUser.class, name = "User"), + @JsonSubTypes.Type(value = GHOrganization.class, name = "Organization") }) + private GHPerson account; @JsonProperty("app_id") private long appId; private List events; @@ -122,7 +127,7 @@ public String getAccessTokenUrl() { * @return the account */ @SuppressFBWarnings(value = { "EI_EXPOSE_REP" }, justification = "Expected behavior") - public GHUser getAccount() { + public GHPerson getAccount() { return account; } diff --git a/src/test/java/org/kohsuke/github/AppTest.java b/src/test/java/org/kohsuke/github/AppTest.java index cb59f2af62..2772f85c04 100755 --- a/src/test/java/org/kohsuke/github/AppTest.java +++ b/src/test/java/org/kohsuke/github/AppTest.java @@ -737,6 +737,7 @@ public void testGetAppInstallations() throws Exception { final GHAppInstallation ghAppInstallation = appInstallation.toList().get(0); assertThat(ghAppInstallation.getAppId(), is(122478L)); assertThat(ghAppInstallation.getAccount().getLogin(), is("t0m4uk1991")); + assertThat(ghAppInstallation.getAccount(), instanceOf(GHUser.class)); } /** diff --git a/src/test/java/org/kohsuke/github/GHAppTest.java b/src/test/java/org/kohsuke/github/GHAppTest.java index 420bc16466..dc297d14a6 100644 --- a/src/test/java/org/kohsuke/github/GHAppTest.java +++ b/src/test/java/org/kohsuke/github/GHAppTest.java @@ -264,11 +264,12 @@ public void listInstallationsSince() throws IOException, ParseException { private void testAppInstallation(GHAppInstallation appInstallation) throws IOException { Map appPermissions = appInstallation.getPermissions(); - GHUser appAccount = appInstallation.getAccount(); + GHPerson appAccount = appInstallation.getAccount(); assertThat(appInstallation.getId(), is((long) 11111111)); assertThat(appAccount.getId(), is((long) 111111111)); assertThat(appAccount.login, is("bogus")); + assertThat(appAccount, instanceOf(GHOrganization.class)); assertThat(appAccount.getType(), is("Organization")); assertThat(appInstallation.getRepositorySelection(), is(GHRepositorySelection.SELECTED)); assertThat(appInstallation.getAccessTokenUrl(), endsWith("/app/installations/11111111/access_tokens")); diff --git a/src/test/java/org/kohsuke/github/GHEventPayloadTest.java b/src/test/java/org/kohsuke/github/GHEventPayloadTest.java index 506bb62269..ec030ee17a 100644 --- a/src/test/java/org/kohsuke/github/GHEventPayloadTest.java +++ b/src/test/java/org/kohsuke/github/GHEventPayloadTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasToString; +import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.lessThanOrEqualTo; import static org.hamcrest.Matchers.notNullValue; @@ -59,6 +60,8 @@ public void InstallationCreatedEvent() throws Exception { assertThat(event.getAction(), is("created")); assertThat(event.getInstallation().getId(), is(43898337L)); assertThat(event.getInstallation().getAccount().getLogin(), is("CronFire")); + assertThat(event.getInstallation().getAccount(), instanceOf(GHOrganization.class)); + assertThat(event.getInstallation().getAccount().getType(), is("Organization")); assertThat(event.getRepositories().isEmpty(), is(false)); assertThat(event.getRepositories().get(0).getId(), is(1296269L)); @@ -84,6 +87,8 @@ public void InstallationDeletedEvent() throws Exception { assertThat(event.getAction(), is("deleted")); assertThat(event.getInstallation().getId(), is(2L)); assertThat(event.getInstallation().getAccount().getLogin(), is("octocat")); + assertThat(event.getInstallation().getAccount(), instanceOf(GHUser.class)); + assertThat(event.getInstallation().getAccount().getType(), is("User")); assertThrows(IllegalStateException.class, () -> event.getRepositories().isEmpty()); assertThat(event.getRawRepositories().isEmpty(), is(false));