From a620ee424d9891c7b7d73abcd2ec11a5781c0bf2 Mon Sep 17 00:00:00 2001 From: surajkumar Date: Sun, 12 May 2024 11:30:13 +0100 Subject: [PATCH 1/2] Added integration tests for UserRequest, InviteRequest, VoiceRequest and fixed bugs --- .github/workflows/pre-commit.yaml | 2 + api/build.gradle | 1 + .../jdi/core/api/GuildRequest.java | 28 ++--- .../javadiscord/jdi/core/api/UserRequest.java | 11 +- .../builders/CreateScheduledEventBuilder.java | 11 +- .../builders/ModifyCurrentUserBuilder.java | 6 +- .../internal/api/DiscordRequestBuilder.java | 5 +- .../CreateScheduledEventRequest.java | 16 ++- .../api/user/ModifyCurrentUserRequest.java | 3 +- .../jdi/core/api/InviteRequestTest.java | 58 +++++++++ .../jdi/core/api/UserRequestTest.java | 119 ++++++++++++++++++ .../jdi/core/api/VoiceRequestTest.java | 46 +++++++ ...tCurrentApplicationRequestRequestTest.java | 49 -------- ...tCurrentApplicationRequestRequestTest.java | 31 ----- ...eAutoModerationRequestRuleRequestTest.java | 11 -- ...eAutoModerationRequestRuleRequestTest.java | 13 -- .../helpers/LiveDiscordHelper.java | 43 +++++++ .../helpers/MockServerInitializer.java | 11 +- .../com/javadiscord/jdi/core/Discord.java | 2 +- .../javadiscord/jdi/core/EventListener.java | 7 +- .../jdi/core/GatewayEventListener.java | 8 ++ .../jdi/core/models/channel/ThreadMember.java | 4 +- .../guild/{Member.java => GuildMember.java} | 2 +- .../jdi/core/models/guild/PrivacyLevel.java | 11 +- .../scheduled_event/ScheduledEntityType.java | 3 +- ...erTest.java => ThreadGuildMemberTest.java} | 2 +- 26 files changed, 345 insertions(+), 158 deletions(-) create mode 100644 api/src/test/integration/com/javadiscord/jdi/core/api/InviteRequestTest.java create mode 100644 api/src/test/integration/com/javadiscord/jdi/core/api/UserRequestTest.java create mode 100644 api/src/test/integration/com/javadiscord/jdi/core/api/VoiceRequestTest.java delete mode 100644 api/src/test/integration/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequestRequestTest.java delete mode 100644 api/src/test/integration/com/javadiscord/jdi/internal/api/application/GetCurrentApplicationRequestRequestTest.java delete mode 100644 api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/CreateAutoModerationRequestRuleRequestTest.java delete mode 100644 api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/DeleteAutoModerationRequestRuleRequestTest.java create mode 100644 api/src/test/integration/helpers/LiveDiscordHelper.java rename models/src/main/java/com/javadiscord/jdi/core/models/guild/{Member.java => GuildMember.java} (98%) rename models/src/test/unit/com/javadiscord/jdi/internal/channel/{ThreadMemberTest.java => ThreadGuildMemberTest.java} (97%) diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index 1772502c..fd59431c 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -19,4 +19,6 @@ jobs: gradle-version: 8.7 - name: Build with Gradle + env: + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} run: gradle build diff --git a/api/build.gradle b/api/build.gradle index d8e4e2d7..39fdfa46 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -15,6 +15,7 @@ dependencies { implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1' testImplementation project(":core") + testImplementation project(":annotations") testImplementation "io.gatehill.imposter:distro-embedded:3.38.2" testImplementation "io.gatehill.imposter:imposter-server:3.38.2" testImplementation "io.gatehill.imposter:config-dynamic:3.38.2" diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/GuildRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/GuildRequest.java index ed39447f..8ec04621 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/GuildRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/GuildRequest.java @@ -25,10 +25,10 @@ public AsyncResponse addGuildMemberRole(long userId, long roleId) { Void.class, new AddGuildMemberRoleRequest(guildId, userId, roleId)); } - public AsyncResponse> beginGuildPrune( + public AsyncResponse> beginGuildPrune( int days, boolean computePruneCount, List includeRoles) { return responseParser.callAndParseList( - Member.class, + GuildMember.class, new BeginGuildPruneRequest(guildId, days, computePruneCount, includeRoles)); } @@ -86,9 +86,9 @@ public AsyncResponse guildInvites() { return responseParser.callAndParse(Invite.class, new GetGuildInvitesRequest(guildId)); } - public AsyncResponse guildMember(long userId) { + public AsyncResponse guildMember(long userId) { return responseParser.callAndParse( - Member.class, new GetGuildMemberRequest(guildId, userId)); + GuildMember.class, new GetGuildMemberRequest(guildId, userId)); } public AsyncResponse guildOnboarding() { @@ -144,12 +144,12 @@ public AsyncResponse> listActiveGuildThreads() { Channel.class, new ListActiveGuildThreadsRequest(guildId)); } - public AsyncResponse> listGuildMembers(ListGuildMembersBuilder builder) { - return responseParser.callAndParseList(Member.class, builder.guildId(guildId).build()); + public AsyncResponse> listGuildMembers(ListGuildMembersBuilder builder) { + return responseParser.callAndParseList(GuildMember.class, builder.guildId(guildId).build()); } - public AsyncResponse modifyCurrentMember(ModifyCurrentMemberBuilder builder) { - return responseParser.callAndParse(Member.class, builder.guildId(guildId).build()); + public AsyncResponse modifyCurrentMember(ModifyCurrentMemberBuilder builder) { + return responseParser.callAndParse(GuildMember.class, builder.guildId(guildId).build()); } @Deprecated @@ -173,8 +173,8 @@ public AsyncResponse modifyGuildMFALevel(MFALevel level) { MFALevel.class, new ModifyGuildMFALevelRequest(guildId, level)); } - public AsyncResponse modifyGuildMember(ModifyGuildMemberBuilder builder) { - return responseParser.callAndParse(Member.class, builder.guildId(guildId).build()); + public AsyncResponse modifyGuildMember(ModifyGuildMemberBuilder builder) { + return responseParser.callAndParse(GuildMember.class, builder.guildId(guildId).build()); } public AsyncResponse modifyGuildOnboarding( @@ -219,12 +219,12 @@ public AsyncResponse removeGuildBan(long userId) { return responseParser.callAndParse(Guild.class, new RemoveGuildBanRequest(guildId, userId)); } - public AsyncResponse removeGuildMemberRole(long userId, long roleId) { + public AsyncResponse removeGuildMemberRole(long userId, long roleId) { return responseParser.callAndParse( - Member.class, new RemoveGuildMemberRoleRequest(guildId, userId, roleId)); + GuildMember.class, new RemoveGuildMemberRoleRequest(guildId, userId, roleId)); } - public AsyncResponse> searchGuildMembers(SearchGuildMembersBuilder builder) { - return responseParser.callAndParseList(Member.class, builder.guildId(guildId).build()); + public AsyncResponse> searchGuildMembers(SearchGuildMembersBuilder builder) { + return responseParser.callAndParseList(GuildMember.class, builder.guildId(guildId).build()); } } diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/UserRequest.java b/api/src/main/java/com/javadiscord/jdi/core/api/UserRequest.java index e7d6458e..9cf7a455 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/UserRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/UserRequest.java @@ -3,6 +3,7 @@ import com.javadiscord.jdi.core.api.builders.GetCurrentUserGuildsBuilder; import com.javadiscord.jdi.core.api.builders.ModifyCurrentUserBuilder; import com.javadiscord.jdi.core.api.builders.UpdateCurrentUserApplicationRoleConnectionBuilder; +import com.javadiscord.jdi.core.models.channel.Channel; import com.javadiscord.jdi.core.models.guild.Guild; import com.javadiscord.jdi.core.models.user.Connection; import com.javadiscord.jdi.core.models.user.Member; @@ -21,12 +22,14 @@ public UserRequest(DiscordResponseParser responseParser, long guildId) { this.responseParser = responseParser; } - public CreateDMRequest createDM(long recipientId) { - return new CreateDMRequest(recipientId); + public AsyncResponse createDM(long recipientId) { + return responseParser.callAndParse(Channel.class, new CreateDMRequest(recipientId)); } - public CreateGroupDMRequest createGroupDM(List accessTokens, Map nicks) { - return new CreateGroupDMRequest(accessTokens, nicks); + public AsyncResponse createGroupDM( + List accessTokens, Map nicks) { + return responseParser.callAndParse( + Channel.class, new CreateGroupDMRequest(accessTokens, nicks)); } public AsyncResponse getCurrentUserApplicationRoleConnection(long applicationId) { diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/builders/CreateScheduledEventBuilder.java b/api/src/main/java/com/javadiscord/jdi/core/api/builders/CreateScheduledEventBuilder.java index b82dbaf6..4aa2c981 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/builders/CreateScheduledEventBuilder.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/builders/CreateScheduledEventBuilder.java @@ -1,7 +1,7 @@ package com.javadiscord.jdi.core.api.builders; import com.javadiscord.jdi.core.models.guild.EntityMetadata; -import com.javadiscord.jdi.core.models.guild.PrivacyLevel; +import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEntityType; import com.javadiscord.jdi.internal.api.guild_scheduled_event.CreateScheduledEventRequest; import java.time.OffsetDateTime; @@ -10,7 +10,7 @@ public class CreateScheduledEventBuilder { private long guildId; private final String name; - private final int entityType; + private final ScheduledEntityType entityType; private final int privacyLevel; private final OffsetDateTime scheduledStartTime; @@ -21,13 +21,10 @@ public class CreateScheduledEventBuilder { private Optional image; public CreateScheduledEventBuilder( - String name, - int entityType, - PrivacyLevel privacyLevel, - OffsetDateTime scheduledStartTime) { + String name, ScheduledEntityType entityType, OffsetDateTime scheduledStartTime) { this.name = name; this.entityType = entityType; - this.privacyLevel = privacyLevel.ordinal(); + this.privacyLevel = 2; this.scheduledStartTime = scheduledStartTime; this.channelId = Optional.empty(); this.entityMetadata = Optional.empty(); diff --git a/api/src/main/java/com/javadiscord/jdi/core/api/builders/ModifyCurrentUserBuilder.java b/api/src/main/java/com/javadiscord/jdi/core/api/builders/ModifyCurrentUserBuilder.java index 9ef3aca3..4cc643e0 100644 --- a/api/src/main/java/com/javadiscord/jdi/core/api/builders/ModifyCurrentUserBuilder.java +++ b/api/src/main/java/com/javadiscord/jdi/core/api/builders/ModifyCurrentUserBuilder.java @@ -6,12 +6,10 @@ public class ModifyCurrentUserBuilder { private final String username; - private final String type; private Optional avatarImage; - public ModifyCurrentUserBuilder(String username, String type) { + public ModifyCurrentUserBuilder(String username) { this.username = username; - this.type = type; this.avatarImage = Optional.empty(); } @@ -21,6 +19,6 @@ public ModifyCurrentUserBuilder avatarImage(String avatarImage) { } public ModifyCurrentUserRequest build() { - return new ModifyCurrentUserRequest(username, avatarImage, type); + return new ModifyCurrentUserRequest(username, avatarImage); } } diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java index cdcb85a3..c1285e56 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.github.mizosoft.methanol.MultipartBodyPublisher; import java.net.URLEncoder; @@ -11,7 +13,8 @@ import java.util.Map; public class DiscordRequestBuilder { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private static final ObjectMapper OBJECT_MAPPER = + JsonMapper.builder().addModule(new JavaTimeModule()).build(); private final DiscordResponseFuture future = new DiscordResponseFuture(); private final Map headers = new HashMap<>(); private final Map queryParameters = new HashMap<>(); diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/guild_scheduled_event/CreateScheduledEventRequest.java b/api/src/main/java/com/javadiscord/jdi/internal/api/guild_scheduled_event/CreateScheduledEventRequest.java index a420eca1..ecd4070a 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/guild_scheduled_event/CreateScheduledEventRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/guild_scheduled_event/CreateScheduledEventRequest.java @@ -2,10 +2,12 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.javadiscord.jdi.core.models.guild.EntityMetadata; +import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEntityType; import com.javadiscord.jdi.internal.api.DiscordRequest; import com.javadiscord.jdi.internal.api.DiscordRequestBuilder; import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -21,7 +23,7 @@ public record CreateScheduledEventRequest( @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssX") Optional scheduledEndTime, Optional description, - int entityType, + ScheduledEntityType entityType, Optional image) implements DiscordRequest { @@ -32,10 +34,16 @@ public DiscordRequestBuilder create() { entityMetadata.ifPresent(val -> body.put("entity_metadata", val)); body.put("name", name); body.put("privacy_level", privacyLevel); - body.put("scheduled_start_time", scheduledStartTime); - scheduledEndTime.ifPresent(val -> body.put("scheduled_end_time", val)); + body.put( + "scheduled_start_time", + scheduledStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)); + scheduledEndTime.ifPresent( + val -> + body.put( + "scheduled_end_time", + val.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME))); description.ifPresent(val -> body.put("description", val)); - body.put("entity_type", entityType); + body.put("entity_type", entityType.ordinal() + 1); image.ifPresent(val -> body.put("image", val)); return new DiscordRequestBuilder() .post() diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/user/ModifyCurrentUserRequest.java b/api/src/main/java/com/javadiscord/jdi/internal/api/user/ModifyCurrentUserRequest.java index 8db11a2c..2ed84277 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/user/ModifyCurrentUserRequest.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/user/ModifyCurrentUserRequest.java @@ -7,13 +7,12 @@ import java.util.Map; import java.util.Optional; -public record ModifyCurrentUserRequest(String username, Optional avatarImage, String type) +public record ModifyCurrentUserRequest(String username, Optional avatarImage) implements DiscordRequest { @Override public DiscordRequestBuilder create() { Map payload = new HashMap<>(); payload.put("username", username); - payload.put("type", type); avatarImage.ifPresent(val -> payload.put("avatar", "%s".formatted(val))); return new DiscordRequestBuilder().path("/users/@me").patch().body(payload); diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/InviteRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/InviteRequestTest.java new file mode 100644 index 00000000..1d6ad797 --- /dev/null +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/InviteRequestTest.java @@ -0,0 +1,58 @@ +package com.javadiscord.jdi.core.api; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.javadiscord.jdi.core.Guild; +import com.javadiscord.jdi.core.api.builders.GetInviteBuilder; +import com.javadiscord.jdi.core.models.invite.Invite; + +import helpers.LiveDiscordHelper; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +@Disabled +class InviteRequestTest { + private static Guild guild; + + @BeforeAll + public static void setup() throws InterruptedException { + guild = new LiveDiscordHelper().getGuild(); + } + + @Test + void testGetInvite() throws InterruptedException { + String testInviteCode = "P4zBwyPuwC"; + CountDownLatch latch = new CountDownLatch(1); + AsyncResponse asyncResponse = + guild.invite().getInvite(new GetInviteBuilder(testInviteCode)); + asyncResponse.onSuccess( + invite -> { + assertEquals(testInviteCode, invite.code()); + latch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } + + @Test + @Disabled + void testDeleteInvite() throws InterruptedException { + String testInviteCode = "P4zBwyPuwC"; + CountDownLatch latch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.invite().deleteInvite(testInviteCode); + asyncResponse.onSuccess( + invite -> { + assertEquals(testInviteCode, invite.code()); + latch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } +} diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/UserRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/UserRequestTest.java new file mode 100644 index 00000000..29ee1e20 --- /dev/null +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/UserRequestTest.java @@ -0,0 +1,119 @@ +package com.javadiscord.jdi.core.api; + +import static org.junit.jupiter.api.Assertions.*; + +import com.javadiscord.jdi.core.Guild; +import com.javadiscord.jdi.core.api.builders.ModifyCurrentUserBuilder; +import com.javadiscord.jdi.core.models.channel.Channel; +import com.javadiscord.jdi.core.models.channel.ChannelType; +import com.javadiscord.jdi.core.models.user.Member; +import com.javadiscord.jdi.core.models.user.User; + +import helpers.LiveDiscordHelper; + +import org.junit.jupiter.api.*; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +class UserRequestTest { + private static Guild guild; + + @BeforeAll + public static void setup() throws InterruptedException { + guild = new LiveDiscordHelper().getGuild(); + } + + @AfterEach + void delayBetweenTests() throws InterruptedException { + TimeUnit.SECONDS.sleep(30); + } + + @Test + void testGetCurrentUserGuildMember() throws InterruptedException { + CountDownLatch countDownLatch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.user().getCurrentUserGuildMember(); + asyncResponse.onSuccess(res -> fail()); + asyncResponse.onError( + err -> { + assertTrue(err.getMessage().contains("Bots cannot use this endpoint")); + countDownLatch.countDown(); + }); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } + + @Test + void testGetCurrentUser() throws InterruptedException { + CountDownLatch countDownLatch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.user().getCurrentUser(); + asyncResponse.onSuccess( + user -> { + assertEquals(1242792739129790475L, user.id()); + assertTrue(user.bot()); + countDownLatch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } + + @Test + void testGetUser() throws InterruptedException { + long wazeiUserId = 821143476455342120L; + CountDownLatch countDownLatch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.user().getUser(wazeiUserId); + asyncResponse.onSuccess( + user -> { + assertEquals(wazeiUserId, user.id()); + assertEquals("wazei", user.displayName()); + assertEquals("0", user.discriminator()); + assertFalse(user.bot()); + countDownLatch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } + + @Test + @Disabled + void testModifyCurrentUser() throws InterruptedException { + CountDownLatch countDownLatch = new CountDownLatch(1); + try { + AsyncResponse asyncResponse = + guild.user().modifyCurrentUser(new ModifyCurrentUserBuilder("dummy")); + asyncResponse.onSuccess( + user -> { + assertEquals("dummy", user.username()); + assertTrue(user.bot()); + countDownLatch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } finally { + guild.user().modifyCurrentUser(new ModifyCurrentUserBuilder("JDA")); + } + } + + @Test + @Disabled + void leaveGuild() throws InterruptedException { + CountDownLatch countDownLatch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.user().leaveGuild(); + asyncResponse.onSuccess(v -> countDownLatch.countDown()); + asyncResponse.onError(Assertions::fail); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } + + @Test + void testCreateDM() throws InterruptedException { + long wazeiUserId = 821143476455342120L; + CountDownLatch countDownLatch = new CountDownLatch(1); + AsyncResponse asyncResponse = guild.user().createDM(wazeiUserId); + asyncResponse.onSuccess( + channel -> { + assertEquals(ChannelType.DM, channel.type()); + countDownLatch.countDown(); + }); + asyncResponse.onError(Assertions::fail); + assertTrue(countDownLatch.await(30, TimeUnit.SECONDS)); + } +} diff --git a/api/src/test/integration/com/javadiscord/jdi/core/api/VoiceRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/core/api/VoiceRequestTest.java new file mode 100644 index 00000000..fa169902 --- /dev/null +++ b/api/src/test/integration/com/javadiscord/jdi/core/api/VoiceRequestTest.java @@ -0,0 +1,46 @@ +package com.javadiscord.jdi.core.api; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.javadiscord.jdi.core.Guild; +import com.javadiscord.jdi.core.models.voice.VoiceRegion; + +import helpers.LiveDiscordHelper; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +class VoiceRequestTest { + private static final Logger LOGGER = LogManager.getLogger(VoiceRequestTest.class); + private static Guild guild; + + @BeforeAll + public static void setup() throws InterruptedException { + guild = new LiveDiscordHelper().getGuild(); + } + + @Test + void testListVoiceRegions() throws InterruptedException { + CountDownLatch latch = new CountDownLatch(1); + AsyncResponse> asyncResponse = guild.voice().listVoiceRegions(); + asyncResponse.onSuccess( + regions -> { + assertFalse(regions.isEmpty()); + latch.countDown(); + }); + asyncResponse.onError( + err -> { + LOGGER.error("testListVoiceRegions test failed", err); + Assertions.fail(err); + }); + assertTrue(latch.await(30, TimeUnit.SECONDS)); + } +} diff --git a/api/src/test/integration/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequestRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequestRequestTest.java deleted file mode 100644 index 3683b322..00000000 --- a/api/src/test/integration/com/javadiscord/jdi/internal/api/application/EditCurrentApplicationRequestRequestTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.javadiscord.jdi.internal.api.application; - -import static org.junit.jupiter.api.Assertions.*; - -import com.javadiscord.jdi.core.models.application.ApplicationInstallParams; -import com.javadiscord.jdi.internal.api.DiscordRequest; -import com.javadiscord.jdi.internal.api.DiscordResponseFuture; - -import helpers.RestTestHelper; - -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -class EditCurrentApplicationRequestRequestTest extends RestTestHelper { - - @Test - void test() throws InterruptedException { - DiscordRequest request = - new EditCurrentApplicationRequest( - "", - "", - "", - new ApplicationInstallParams(List.of(), ""), - Map.of(), - 0, - "", - "", - "", - List.of()); - - DiscordResponseFuture response = getDiscordRequestDispatcher().queue(request); - - CountDownLatch latch = new CountDownLatch(1); - - response.onSuccess( - (r) -> { - assertEquals(r.status(), 200); - latch.countDown(); - }); - - response.onError(err -> fail()); - - assertTrue(latch.await(5, TimeUnit.SECONDS)); - } -} diff --git a/api/src/test/integration/com/javadiscord/jdi/internal/api/application/GetCurrentApplicationRequestRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/internal/api/application/GetCurrentApplicationRequestRequestTest.java deleted file mode 100644 index 81527eda..00000000 --- a/api/src/test/integration/com/javadiscord/jdi/internal/api/application/GetCurrentApplicationRequestRequestTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.javadiscord.jdi.internal.api.application; - -import static org.junit.jupiter.api.Assertions.*; - -import com.javadiscord.jdi.internal.api.DiscordResponseFuture; - -import helpers.RestTestHelper; - -import org.junit.jupiter.api.Test; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - -class GetCurrentApplicationRequestRequestTest extends RestTestHelper { - - @Test - void test() throws InterruptedException { - DiscordResponseFuture response = - getDiscordRequestDispatcher().queue(new GetCurrentApplicationRequest()); - CountDownLatch latch = new CountDownLatch(1); - - response.onSuccess( - (r) -> { - assertEquals(r.status(), 200); - latch.countDown(); - }); - - response.onError(err -> fail()); - assertTrue(latch.await(5, TimeUnit.SECONDS)); - } -} diff --git a/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/CreateAutoModerationRequestRuleRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/CreateAutoModerationRequestRuleRequestTest.java deleted file mode 100644 index 6a404e15..00000000 --- a/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/CreateAutoModerationRequestRuleRequestTest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.javadiscord.jdi.internal.api.auto_moderation; - -import helpers.RestTestHelper; - -import org.junit.jupiter.api.Test; - -class CreateAutoModerationRequestRuleRequestTest extends RestTestHelper { - - @Test - void test() throws InterruptedException {} -} diff --git a/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/DeleteAutoModerationRequestRuleRequestTest.java b/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/DeleteAutoModerationRequestRuleRequestTest.java deleted file mode 100644 index 8747917f..00000000 --- a/api/src/test/integration/com/javadiscord/jdi/internal/api/auto_moderation/DeleteAutoModerationRequestRuleRequestTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.javadiscord.jdi.internal.api.auto_moderation; - -import helpers.RestTestHelper; - -import org.junit.jupiter.api.Test; - -class DeleteAutoModerationRequestRuleRequestTest extends RestTestHelper { - - @Test - void test() throws InterruptedException { - sendRequestAndAssert(new DeleteAutoModerationRuleRequest(0L, 0L), 204); - } -} diff --git a/api/src/test/integration/helpers/LiveDiscordHelper.java b/api/src/test/integration/helpers/LiveDiscordHelper.java new file mode 100644 index 00000000..18b9d281 --- /dev/null +++ b/api/src/test/integration/helpers/LiveDiscordHelper.java @@ -0,0 +1,43 @@ +package helpers; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.javadiscord.jdi.core.Discord; +import com.javadiscord.jdi.core.EventListener; +import com.javadiscord.jdi.core.Guild; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +public class LiveDiscordHelper { + private static final String BOT_TOKEN = System.getenv("BOT_TOKEN"); + private static final TestListener TEST_LISTENER = new TestListener(); + private static final AtomicReference GUILD_ATOMIC_REFERENCE = new AtomicReference<>(); + private static final CountDownLatch STARTUP_LATCH = new CountDownLatch(1); + private static Guild guild; + + private static class TestListener implements EventListener { + + @Override + public void onGuildCreate(Guild guild) { + GUILD_ATOMIC_REFERENCE.set(guild); + STARTUP_LATCH.countDown(); + } + } + + public LiveDiscordHelper() throws InterruptedException { + Discord discord = new Discord(BOT_TOKEN); + discord.registerListener(TEST_LISTENER); + discord.start(); + assertTrue(STARTUP_LATCH.await(30, TimeUnit.SECONDS)); + if (GUILD_ATOMIC_REFERENCE.get() == null) { + throw new NullPointerException("Received a null guild"); + } + guild = GUILD_ATOMIC_REFERENCE.get(); + } + + public Guild getGuild() { + return guild; + } +} diff --git a/api/src/test/integration/helpers/MockServerInitializer.java b/api/src/test/integration/helpers/MockServerInitializer.java index 0d35f326..bbb3cdd1 100644 --- a/api/src/test/integration/helpers/MockServerInitializer.java +++ b/api/src/test/integration/helpers/MockServerInitializer.java @@ -2,18 +2,13 @@ import com.javadiscord.jdi.core.Discord; -import io.gatehill.imposter.embedded.MockEngine; -import io.gatehill.imposter.openapi.embedded.OpenApiImposterBuilder; - -import java.nio.file.Paths; - public class MockServerInitializer { private static final String OPEN_API_SPEC = "mocks/openapi-spec.json"; private static final String API_VERSION = "/api/v10"; private static final String DISCORD_BASE_URL_ENV_VAR = "DISCORD_BASE_URL"; - private static final Discord discord; + private static Discord discord; - static { + /* static { MockEngine imposter = new OpenApiImposterBuilder<>() .withSpecificationFile(Paths.get(OPEN_API_SPEC)) @@ -23,7 +18,7 @@ public class MockServerInitializer { "%s%s".formatted(imposter.getBaseUrl().toString(), API_VERSION)); discord = new Discord("dummy-bot-token"); discord.startWithoutGatewayEvents(); - } + }*/ public static Discord getDiscord() { return discord; diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 6c774c35..1973215a 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -184,7 +184,7 @@ private static Gateway getGatewayURL(String authentication) { } return OBJECT_MAPPER.readValue(response.body(), Gateway.class); } catch (Exception e) { - LOGGER.error("Failed to fetch the gateway URL from discord"); + LOGGER.error("Failed to fetch the gateway URL from discord", e); throw new RuntimeException(e); } } diff --git a/core/src/main/java/com/javadiscord/jdi/core/EventListener.java b/core/src/main/java/com/javadiscord/jdi/core/EventListener.java index 7eca9fbd..d4f1e6a9 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/EventListener.java +++ b/core/src/main/java/com/javadiscord/jdi/core/EventListener.java @@ -11,6 +11,7 @@ import com.javadiscord.jdi.core.models.scheduled_event.EventUser; import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEvent; import com.javadiscord.jdi.core.models.stage.Stage; +import com.javadiscord.jdi.core.models.user.Member; import com.javadiscord.jdi.core.models.user.User; import com.javadiscord.jdi.core.models.voice.VoiceServer; import com.javadiscord.jdi.core.models.voice.VoiceState; @@ -45,7 +46,7 @@ default void onMessageReactionRemovedAll( default void onScheduledEventUpdate(ScheduledEvent scheduledEvent, Guild guild) {} - default void onGuildMemberAdd(Member member, Guild guild) {} + default void onGuildMemberAdd(Member guildMember, Guild guild) {} default void onStageCreate(Stage stage, Guild guild) {} @@ -112,13 +113,13 @@ default void onGuildInviteCreate(Invite invite, Guild guild) {} default void onAutoModerationRuleUpdate(AutoModerationRule autoModerationRule, Guild guild) {} - default void onGuildMemberRemove(Member member, Guild guild) {} + default void onGuildMemberRemove(Member guildMember, Guild guild) {} default void onChannelPinUpdate(MessagePin messagePin, Guild guild) {} default void onThreadCreate(Thread thread, Guild guild) {} - default void onGuildMemberUpdate(Member member, Guild guild) {} + default void onGuildMemberUpdate(Member guildMember, Guild guild) {} default void onGuildRoleCreate(Role role, Guild guild) {} diff --git a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java index f5f8804a..bfd7cce9 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java +++ b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java @@ -11,6 +11,7 @@ import com.javadiscord.jdi.core.models.scheduled_event.EventUser; import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEvent; import com.javadiscord.jdi.core.models.stage.Stage; +import com.javadiscord.jdi.core.models.user.Member; import com.javadiscord.jdi.core.models.user.User; import com.javadiscord.jdi.core.models.voice.VoiceServer; import com.javadiscord.jdi.core.models.voice.VoiceState; @@ -36,6 +37,13 @@ public GatewayEventListener(Discord discord) { } static Guild getGuild(Discord discord, Object event) { + if (event instanceof com.javadiscord.jdi.core.models.guild.Guild) { + return new Guild( + (com.javadiscord.jdi.core.models.guild.Guild) event, + discord.getCache(), + discord); + } + Cache cache = discord.getCache(); Guild guild = null; try { diff --git a/models/src/main/java/com/javadiscord/jdi/core/models/channel/ThreadMember.java b/models/src/main/java/com/javadiscord/jdi/core/models/channel/ThreadMember.java index f06274e2..a05a5d34 100644 --- a/models/src/main/java/com/javadiscord/jdi/core/models/channel/ThreadMember.java +++ b/models/src/main/java/com/javadiscord/jdi/core/models/channel/ThreadMember.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.javadiscord.jdi.core.models.guild.Member; +import com.javadiscord.jdi.core.models.guild.GuildMember; import java.time.OffsetDateTime; @@ -15,4 +15,4 @@ public record ThreadMember( @JsonProperty("join_timestamp") OffsetDateTime joinTime, @JsonProperty("flags") int flags, - @JsonProperty("member") Member member) {} + @JsonProperty("member") GuildMember guildMember) {} diff --git a/models/src/main/java/com/javadiscord/jdi/core/models/guild/Member.java b/models/src/main/java/com/javadiscord/jdi/core/models/guild/GuildMember.java similarity index 98% rename from models/src/main/java/com/javadiscord/jdi/core/models/guild/Member.java rename to models/src/main/java/com/javadiscord/jdi/core/models/guild/GuildMember.java index 7be7de59..06077944 100644 --- a/models/src/main/java/com/javadiscord/jdi/core/models/guild/Member.java +++ b/models/src/main/java/com/javadiscord/jdi/core/models/guild/GuildMember.java @@ -9,7 +9,7 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) -public record Member( +public record GuildMember( @JsonProperty("user") User user, @JsonProperty("nick") String nick, @JsonProperty("avatar") String avatar, diff --git a/models/src/main/java/com/javadiscord/jdi/core/models/guild/PrivacyLevel.java b/models/src/main/java/com/javadiscord/jdi/core/models/guild/PrivacyLevel.java index ad99487b..7f1756ca 100644 --- a/models/src/main/java/com/javadiscord/jdi/core/models/guild/PrivacyLevel.java +++ b/models/src/main/java/com/javadiscord/jdi/core/models/guild/PrivacyLevel.java @@ -1,6 +1,15 @@ package com.javadiscord.jdi.core.models.guild; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum PrivacyLevel { PUBLIC, - PRIVATE + PRIVATE; + + @JsonCreator + public static PrivacyLevel fromIndex(int index) { + return PrivacyLevel.values()[index - 1]; + } } diff --git a/models/src/main/java/com/javadiscord/jdi/core/models/scheduled_event/ScheduledEntityType.java b/models/src/main/java/com/javadiscord/jdi/core/models/scheduled_event/ScheduledEntityType.java index 6022487a..62511387 100644 --- a/models/src/main/java/com/javadiscord/jdi/core/models/scheduled_event/ScheduledEntityType.java +++ b/models/src/main/java/com/javadiscord/jdi/core/models/scheduled_event/ScheduledEntityType.java @@ -1,6 +1,7 @@ package com.javadiscord.jdi.core.models.scheduled_event; public enum ScheduledEntityType { - GUILD, + STAGE_INSTANCE, + VOICE, EXTERNAL } diff --git a/models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadMemberTest.java b/models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadGuildMemberTest.java similarity index 97% rename from models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadMemberTest.java rename to models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadGuildMemberTest.java index ae8bc5f3..3d76ff9d 100644 --- a/models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadMemberTest.java +++ b/models/src/test/unit/com/javadiscord/jdi/internal/channel/ThreadGuildMemberTest.java @@ -13,7 +13,7 @@ import java.time.OffsetDateTime; -class ThreadMemberTest { +class ThreadGuildMemberTest { private static final ObjectMapper OBJECT_MAPPER = JsonMapper.builder().addModule(new JavaTimeModule()).build(); From c1d452680e4e444eaed7d513415196c2fa8fd0e5 Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Wed, 22 May 2024 15:03:45 +0100 Subject: [PATCH 2/2] Add environment to pre-commit.yaml --- .github/workflows/pre-commit.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index fd59431c..90bd6657 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -6,6 +6,10 @@ on: jobs: pre-commit: runs-on: ubuntu-latest + + environment: + name: Tests + steps: - uses: actions/checkout@v3