Skip to content

Commit 93d6ecc

Browse files
authored
Added integration tests (#95)
Add integration tests for UserRequest, InviteRequest, VoiceRequest and fixed bugs
1 parent 139f541 commit 93d6ecc

File tree

26 files changed

+349
-158
lines changed

26 files changed

+349
-158
lines changed

.github/workflows/pre-commit.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ on:
66
jobs:
77
pre-commit:
88
runs-on: ubuntu-latest
9+
10+
environment:
11+
name: Tests
12+
913
steps:
1014
- uses: actions/checkout@v3
1115

@@ -19,4 +23,6 @@ jobs:
1923
gradle-version: 8.7
2024

2125
- name: Build with Gradle
26+
env:
27+
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
2228
run: gradle build

api/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ dependencies {
1515
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.17.1'
1616

1717
testImplementation project(":core")
18+
testImplementation project(":annotations")
1819
testImplementation "io.gatehill.imposter:distro-embedded:3.38.2"
1920
testImplementation "io.gatehill.imposter:imposter-server:3.38.2"
2021
testImplementation "io.gatehill.imposter:config-dynamic:3.38.2"

api/src/main/java/com/javadiscord/jdi/core/api/GuildRequest.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ public AsyncResponse<Void> addGuildMemberRole(long userId, long roleId) {
2525
Void.class, new AddGuildMemberRoleRequest(guildId, userId, roleId));
2626
}
2727

28-
public AsyncResponse<List<Member>> beginGuildPrune(
28+
public AsyncResponse<List<GuildMember>> beginGuildPrune(
2929
int days, boolean computePruneCount, List<Long> includeRoles) {
3030
return responseParser.callAndParseList(
31-
Member.class,
31+
GuildMember.class,
3232
new BeginGuildPruneRequest(guildId, days, computePruneCount, includeRoles));
3333
}
3434

@@ -86,9 +86,9 @@ public AsyncResponse<Invite> guildInvites() {
8686
return responseParser.callAndParse(Invite.class, new GetGuildInvitesRequest(guildId));
8787
}
8888

89-
public AsyncResponse<Member> guildMember(long userId) {
89+
public AsyncResponse<GuildMember> guildMember(long userId) {
9090
return responseParser.callAndParse(
91-
Member.class, new GetGuildMemberRequest(guildId, userId));
91+
GuildMember.class, new GetGuildMemberRequest(guildId, userId));
9292
}
9393

9494
public AsyncResponse<Onboarding> guildOnboarding() {
@@ -144,12 +144,12 @@ public AsyncResponse<List<Channel>> listActiveGuildThreads() {
144144
Channel.class, new ListActiveGuildThreadsRequest(guildId));
145145
}
146146

147-
public AsyncResponse<List<Member>> listGuildMembers(ListGuildMembersBuilder builder) {
148-
return responseParser.callAndParseList(Member.class, builder.guildId(guildId).build());
147+
public AsyncResponse<List<GuildMember>> listGuildMembers(ListGuildMembersBuilder builder) {
148+
return responseParser.callAndParseList(GuildMember.class, builder.guildId(guildId).build());
149149
}
150150

151-
public AsyncResponse<Member> modifyCurrentMember(ModifyCurrentMemberBuilder builder) {
152-
return responseParser.callAndParse(Member.class, builder.guildId(guildId).build());
151+
public AsyncResponse<GuildMember> modifyCurrentMember(ModifyCurrentMemberBuilder builder) {
152+
return responseParser.callAndParse(GuildMember.class, builder.guildId(guildId).build());
153153
}
154154

155155
@Deprecated
@@ -173,8 +173,8 @@ public AsyncResponse<MFALevel> modifyGuildMFALevel(MFALevel level) {
173173
MFALevel.class, new ModifyGuildMFALevelRequest(guildId, level));
174174
}
175175

176-
public AsyncResponse<Member> modifyGuildMember(ModifyGuildMemberBuilder builder) {
177-
return responseParser.callAndParse(Member.class, builder.guildId(guildId).build());
176+
public AsyncResponse<GuildMember> modifyGuildMember(ModifyGuildMemberBuilder builder) {
177+
return responseParser.callAndParse(GuildMember.class, builder.guildId(guildId).build());
178178
}
179179

180180
public AsyncResponse<Onboarding> modifyGuildOnboarding(
@@ -219,12 +219,12 @@ public AsyncResponse<Guild> removeGuildBan(long userId) {
219219
return responseParser.callAndParse(Guild.class, new RemoveGuildBanRequest(guildId, userId));
220220
}
221221

222-
public AsyncResponse<Member> removeGuildMemberRole(long userId, long roleId) {
222+
public AsyncResponse<GuildMember> removeGuildMemberRole(long userId, long roleId) {
223223
return responseParser.callAndParse(
224-
Member.class, new RemoveGuildMemberRoleRequest(guildId, userId, roleId));
224+
GuildMember.class, new RemoveGuildMemberRoleRequest(guildId, userId, roleId));
225225
}
226226

227-
public AsyncResponse<List<Member>> searchGuildMembers(SearchGuildMembersBuilder builder) {
228-
return responseParser.callAndParseList(Member.class, builder.guildId(guildId).build());
227+
public AsyncResponse<List<GuildMember>> searchGuildMembers(SearchGuildMembersBuilder builder) {
228+
return responseParser.callAndParseList(GuildMember.class, builder.guildId(guildId).build());
229229
}
230230
}

api/src/main/java/com/javadiscord/jdi/core/api/UserRequest.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.javadiscord.jdi.core.api.builders.GetCurrentUserGuildsBuilder;
44
import com.javadiscord.jdi.core.api.builders.ModifyCurrentUserBuilder;
55
import com.javadiscord.jdi.core.api.builders.UpdateCurrentUserApplicationRoleConnectionBuilder;
6+
import com.javadiscord.jdi.core.models.channel.Channel;
67
import com.javadiscord.jdi.core.models.guild.Guild;
78
import com.javadiscord.jdi.core.models.user.Connection;
89
import com.javadiscord.jdi.core.models.user.Member;
@@ -21,12 +22,14 @@ public UserRequest(DiscordResponseParser responseParser, long guildId) {
2122
this.responseParser = responseParser;
2223
}
2324

24-
public CreateDMRequest createDM(long recipientId) {
25-
return new CreateDMRequest(recipientId);
25+
public AsyncResponse<Channel> createDM(long recipientId) {
26+
return responseParser.callAndParse(Channel.class, new CreateDMRequest(recipientId));
2627
}
2728

28-
public CreateGroupDMRequest createGroupDM(List<String> accessTokens, Map<Long, String> nicks) {
29-
return new CreateGroupDMRequest(accessTokens, nicks);
29+
public AsyncResponse<Channel> createGroupDM(
30+
List<String> accessTokens, Map<Long, String> nicks) {
31+
return responseParser.callAndParse(
32+
Channel.class, new CreateGroupDMRequest(accessTokens, nicks));
3033
}
3134

3235
public AsyncResponse<Connection> getCurrentUserApplicationRoleConnection(long applicationId) {

api/src/main/java/com/javadiscord/jdi/core/api/builders/CreateScheduledEventBuilder.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.javadiscord.jdi.core.api.builders;
22

33
import com.javadiscord.jdi.core.models.guild.EntityMetadata;
4-
import com.javadiscord.jdi.core.models.guild.PrivacyLevel;
4+
import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEntityType;
55
import com.javadiscord.jdi.internal.api.guild_scheduled_event.CreateScheduledEventRequest;
66

77
import java.time.OffsetDateTime;
@@ -10,7 +10,7 @@
1010
public class CreateScheduledEventBuilder {
1111
private long guildId;
1212
private final String name;
13-
private final int entityType;
13+
private final ScheduledEntityType entityType;
1414
private final int privacyLevel;
1515
private final OffsetDateTime scheduledStartTime;
1616

@@ -21,13 +21,10 @@ public class CreateScheduledEventBuilder {
2121
private Optional<String> image;
2222

2323
public CreateScheduledEventBuilder(
24-
String name,
25-
int entityType,
26-
PrivacyLevel privacyLevel,
27-
OffsetDateTime scheduledStartTime) {
24+
String name, ScheduledEntityType entityType, OffsetDateTime scheduledStartTime) {
2825
this.name = name;
2926
this.entityType = entityType;
30-
this.privacyLevel = privacyLevel.ordinal();
27+
this.privacyLevel = 2;
3128
this.scheduledStartTime = scheduledStartTime;
3229
this.channelId = Optional.empty();
3330
this.entityMetadata = Optional.empty();

api/src/main/java/com/javadiscord/jdi/core/api/builders/ModifyCurrentUserBuilder.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@
66

77
public class ModifyCurrentUserBuilder {
88
private final String username;
9-
private final String type;
109
private Optional<String> avatarImage;
1110

12-
public ModifyCurrentUserBuilder(String username, String type) {
11+
public ModifyCurrentUserBuilder(String username) {
1312
this.username = username;
14-
this.type = type;
1513
this.avatarImage = Optional.empty();
1614
}
1715

@@ -21,6 +19,6 @@ public ModifyCurrentUserBuilder avatarImage(String avatarImage) {
2119
}
2220

2321
public ModifyCurrentUserRequest build() {
24-
return new ModifyCurrentUserRequest(username, avatarImage, type);
22+
return new ModifyCurrentUserRequest(username, avatarImage);
2523
}
2624
}

api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
5+
import com.fasterxml.jackson.databind.json.JsonMapper;
6+
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
57
import com.github.mizosoft.methanol.MultipartBodyPublisher;
68

79
import java.net.URLEncoder;
@@ -11,7 +13,8 @@
1113
import java.util.Map;
1214

1315
public class DiscordRequestBuilder {
14-
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
16+
private static final ObjectMapper OBJECT_MAPPER =
17+
JsonMapper.builder().addModule(new JavaTimeModule()).build();
1518
private final DiscordResponseFuture future = new DiscordResponseFuture();
1619
private final Map<String, Object> headers = new HashMap<>();
1720
private final Map<String, Object> queryParameters = new HashMap<>();

api/src/main/java/com/javadiscord/jdi/internal/api/guild_scheduled_event/CreateScheduledEventRequest.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import com.fasterxml.jackson.annotation.JsonFormat;
44
import com.javadiscord.jdi.core.models.guild.EntityMetadata;
5+
import com.javadiscord.jdi.core.models.scheduled_event.ScheduledEntityType;
56
import com.javadiscord.jdi.internal.api.DiscordRequest;
67
import com.javadiscord.jdi.internal.api.DiscordRequestBuilder;
78

89
import java.time.OffsetDateTime;
10+
import java.time.format.DateTimeFormatter;
911
import java.util.HashMap;
1012
import java.util.Map;
1113
import java.util.Optional;
@@ -21,7 +23,7 @@ public record CreateScheduledEventRequest(
2123
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssX")
2224
Optional<OffsetDateTime> scheduledEndTime,
2325
Optional<String> description,
24-
int entityType,
26+
ScheduledEntityType entityType,
2527
Optional<String> image)
2628
implements DiscordRequest {
2729

@@ -32,10 +34,16 @@ public DiscordRequestBuilder create() {
3234
entityMetadata.ifPresent(val -> body.put("entity_metadata", val));
3335
body.put("name", name);
3436
body.put("privacy_level", privacyLevel);
35-
body.put("scheduled_start_time", scheduledStartTime);
36-
scheduledEndTime.ifPresent(val -> body.put("scheduled_end_time", val));
37+
body.put(
38+
"scheduled_start_time",
39+
scheduledStartTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
40+
scheduledEndTime.ifPresent(
41+
val ->
42+
body.put(
43+
"scheduled_end_time",
44+
val.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)));
3745
description.ifPresent(val -> body.put("description", val));
38-
body.put("entity_type", entityType);
46+
body.put("entity_type", entityType.ordinal() + 1);
3947
image.ifPresent(val -> body.put("image", val));
4048
return new DiscordRequestBuilder()
4149
.post()

api/src/main/java/com/javadiscord/jdi/internal/api/user/ModifyCurrentUserRequest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@
77
import java.util.Map;
88
import java.util.Optional;
99

10-
public record ModifyCurrentUserRequest(String username, Optional<String> avatarImage, String type)
10+
public record ModifyCurrentUserRequest(String username, Optional<String> avatarImage)
1111
implements DiscordRequest {
1212
@Override
1313
public DiscordRequestBuilder create() {
1414
Map<String, Object> payload = new HashMap<>();
1515
payload.put("username", username);
16-
payload.put("type", type);
1716
avatarImage.ifPresent(val -> payload.put("avatar", "%s".formatted(val)));
1817

1918
return new DiscordRequestBuilder().path("/users/@me").patch().body(payload);
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.javadiscord.jdi.core.api;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import com.javadiscord.jdi.core.Guild;
7+
import com.javadiscord.jdi.core.api.builders.GetInviteBuilder;
8+
import com.javadiscord.jdi.core.models.invite.Invite;
9+
10+
import helpers.LiveDiscordHelper;
11+
12+
import org.junit.jupiter.api.Assertions;
13+
import org.junit.jupiter.api.BeforeAll;
14+
import org.junit.jupiter.api.Disabled;
15+
import org.junit.jupiter.api.Test;
16+
17+
import java.util.concurrent.CountDownLatch;
18+
import java.util.concurrent.TimeUnit;
19+
20+
@Disabled
21+
class InviteRequestTest {
22+
private static Guild guild;
23+
24+
@BeforeAll
25+
public static void setup() throws InterruptedException {
26+
guild = new LiveDiscordHelper().getGuild();
27+
}
28+
29+
@Test
30+
void testGetInvite() throws InterruptedException {
31+
String testInviteCode = "P4zBwyPuwC";
32+
CountDownLatch latch = new CountDownLatch(1);
33+
AsyncResponse<Invite> asyncResponse =
34+
guild.invite().getInvite(new GetInviteBuilder(testInviteCode));
35+
asyncResponse.onSuccess(
36+
invite -> {
37+
assertEquals(testInviteCode, invite.code());
38+
latch.countDown();
39+
});
40+
asyncResponse.onError(Assertions::fail);
41+
assertTrue(latch.await(30, TimeUnit.SECONDS));
42+
}
43+
44+
@Test
45+
@Disabled
46+
void testDeleteInvite() throws InterruptedException {
47+
String testInviteCode = "P4zBwyPuwC";
48+
CountDownLatch latch = new CountDownLatch(1);
49+
AsyncResponse<Invite> asyncResponse = guild.invite().deleteInvite(testInviteCode);
50+
asyncResponse.onSuccess(
51+
invite -> {
52+
assertEquals(testInviteCode, invite.code());
53+
latch.countDown();
54+
});
55+
asyncResponse.onError(Assertions::fail);
56+
assertTrue(latch.await(30, TimeUnit.SECONDS));
57+
}
58+
}

0 commit comments

Comments
 (0)