Skip to content

Commit 511a59d

Browse files
committed
Draft of RemindRoutineTest
1 parent 4b4a927 commit 511a59d

File tree

4 files changed

+147
-49
lines changed

4 files changed

+147
-49
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.togetherjava.tjbot.commands.reminder;
2+
3+
import net.dv8tion.jda.api.entities.Member;
4+
import net.dv8tion.jda.api.entities.TextChannel;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.togetherjava.tjbot.db.Database;
7+
import org.togetherjava.tjbot.db.generated.Tables;
8+
import org.togetherjava.tjbot.db.generated.tables.records.PendingRemindersRecord;
9+
import org.togetherjava.tjbot.jda.JdaTester;
10+
11+
import java.time.Instant;
12+
import java.util.List;
13+
14+
import static org.togetherjava.tjbot.db.generated.tables.PendingReminders.PENDING_REMINDERS;
15+
16+
final class RawReminderTestHelper {
17+
private Database database;
18+
private JdaTester jdaTester;
19+
20+
RawReminderTestHelper(@NotNull Database database, @NotNull JdaTester jdaTester) {
21+
this.database = database;
22+
this.jdaTester = jdaTester;
23+
}
24+
25+
void insertReminder(@NotNull String content, @NotNull Instant remindAt) {
26+
insertReminder(content, remindAt, jdaTester.getMemberSpy());
27+
}
28+
29+
void insertReminder(@NotNull String content, @NotNull Instant remindAt,
30+
@NotNull Member author) {
31+
TextChannel channel = jdaTester.getTextChannelSpy();
32+
long channelId = channel.getIdLong();
33+
long guildId = channel.getGuild().getIdLong();
34+
long authorId = author.getIdLong();
35+
36+
database.write(context -> context.newRecord(Tables.PENDING_REMINDERS)
37+
.setCreatedAt(Instant.now())
38+
.setGuildId(guildId)
39+
.setChannelId(channelId)
40+
.setAuthorId(authorId)
41+
.setRemindAt(remindAt)
42+
.setContent(content)
43+
.insert());
44+
}
45+
46+
@NotNull
47+
List<String> readReminders() {
48+
return readReminders(jdaTester.getMemberSpy());
49+
}
50+
51+
@NotNull
52+
List<String> readReminders(@NotNull Member author) {
53+
long guildId = jdaTester.getTextChannelSpy().getGuild().getIdLong();
54+
long authorId = author.getIdLong();
55+
56+
return database.read(context -> context.selectFrom(PENDING_REMINDERS)
57+
.where(PENDING_REMINDERS.AUTHOR_ID.eq(authorId)
58+
.and(PENDING_REMINDERS.GUILD_ID.eq(guildId)))
59+
.stream()
60+
.map(PendingRemindersRecord::getContent)
61+
.toList());
62+
}
63+
}

application/src/test/java/org/togetherjava/tjbot/commands/reminder/RemindCommandTest.java

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.togetherjava.tjbot.commands.reminder;
22

33
import net.dv8tion.jda.api.entities.Member;
4-
import net.dv8tion.jda.api.entities.TextChannel;
54
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
65
import org.jetbrains.annotations.NotNull;
76
import org.junit.jupiter.api.Assertions;
@@ -11,8 +10,6 @@
1110
import org.junit.jupiter.api.function.Executable;
1211
import org.togetherjava.tjbot.commands.SlashCommand;
1312
import org.togetherjava.tjbot.db.Database;
14-
import org.togetherjava.tjbot.db.generated.Tables;
15-
import org.togetherjava.tjbot.db.generated.tables.records.PendingRemindersRecord;
1613
import org.togetherjava.tjbot.jda.JdaTester;
1714

1815
import java.time.Instant;
@@ -26,15 +23,16 @@
2623
import static org.togetherjava.tjbot.db.generated.tables.PendingReminders.PENDING_REMINDERS;
2724

2825
final class RemindCommandTest {
29-
private Database database;
3026
private SlashCommand command;
3127
private JdaTester jdaTester;
28+
private RawReminderTestHelper rawReminders;
3229

3330
@BeforeEach
3431
void setUp() {
35-
database = Database.createMemoryDatabase(PENDING_REMINDERS);
32+
Database database = Database.createMemoryDatabase(PENDING_REMINDERS);
3633
command = new RemindCommand(database);
3734
jdaTester = new JdaTester();
35+
rawReminders = new RawReminderTestHelper(database, jdaTester);
3836
}
3937

4038
private @NotNull SlashCommandEvent triggerSlashCommand(int timeAmount, @NotNull String timeUnit,
@@ -55,43 +53,6 @@ void setUp() {
5553
return event;
5654
}
5755

58-
private void insertReminderRaw(@NotNull String content, @NotNull Instant remindAt) {
59-
insertReminderRaw(content, remindAt, jdaTester.getMemberSpy());
60-
}
61-
62-
private void insertReminderRaw(@NotNull String content, @NotNull Instant remindAt,
63-
@NotNull Member author) {
64-
TextChannel channel = jdaTester.getTextChannelSpy();
65-
long channelId = channel.getIdLong();
66-
long guildId = channel.getGuild().getIdLong();
67-
long authorId = author.getIdLong();
68-
69-
database.write(context -> context.newRecord(Tables.PENDING_REMINDERS)
70-
.setCreatedAt(Instant.now())
71-
.setGuildId(guildId)
72-
.setChannelId(channelId)
73-
.setAuthorId(authorId)
74-
.setRemindAt(remindAt)
75-
.setContent(content)
76-
.insert());
77-
}
78-
79-
private List<String> readRemindersRaw() {
80-
return readRemindersRaw(jdaTester.getMemberSpy());
81-
}
82-
83-
private List<String> readRemindersRaw(@NotNull Member author) {
84-
long guildId = jdaTester.getTextChannelSpy().getGuild().getIdLong();
85-
long authorId = author.getIdLong();
86-
87-
return database.read(context -> context.selectFrom(PENDING_REMINDERS)
88-
.where(PENDING_REMINDERS.AUTHOR_ID.eq(authorId)
89-
.and(PENDING_REMINDERS.GUILD_ID.eq(guildId)))
90-
.stream()
91-
.map(PendingRemindersRecord::getContent)
92-
.toList());
93-
}
94-
9556
@Test
9657
@DisplayName("Throws an exception if the time unit is not supported, i.e. not part of the actual choice dialog")
9758
void throwsWhenGivenUnsupportedUnit() {
@@ -101,7 +62,7 @@ void throwsWhenGivenUnsupportedUnit() {
10162

10263
// THEN command throws, no reminder was created
10364
Assertions.assertThrows(IllegalArgumentException.class, triggerRemind);
104-
assertTrue(readRemindersRaw().isEmpty());
65+
assertTrue(rawReminders.readReminders().isEmpty());
10566
}
10667

10768
@Test
@@ -113,7 +74,7 @@ void doesNotSupportDatesTooFarInFuture() {
11374

11475
// THEN rejects and responds accordingly, no reminder was created
11576
verify(event).reply(startsWith("The reminder is set too far in the future"));
116-
assertTrue(readRemindersRaw().isEmpty());
77+
assertTrue(rawReminders.readReminders().isEmpty());
11778
}
11879

11980
@Test
@@ -122,7 +83,7 @@ void userIsLimitedIfTooManyPendingReminders() {
12283
// GIVEN a user with too many reminders still pending
12384
Instant remindAt = Instant.now().plus(100, ChronoUnit.DAYS);
12485
for (int i = 0; i < RemindCommand.MAX_PENDING_REMINDERS_PER_USER; i++) {
125-
insertReminderRaw("foo " + i, remindAt);
86+
rawReminders.insertReminder("foo " + i, remindAt);
12687
}
12788

12889
// WHEN triggering another reminder
@@ -131,7 +92,8 @@ void userIsLimitedIfTooManyPendingReminders() {
13192
// THEN rejects and responds accordingly, no new reminder was created
13293
verify(event)
13394
.reply(startsWith("You have reached the maximum amount of pending reminders per user"));
134-
assertEquals(RemindCommand.MAX_PENDING_REMINDERS_PER_USER, readRemindersRaw().size());
95+
assertEquals(RemindCommand.MAX_PENDING_REMINDERS_PER_USER,
96+
rawReminders.readReminders().size());
13597
}
13698

13799
@Test
@@ -142,7 +104,7 @@ void userIsNotLimitedIfOtherUserHasTooManyPendingReminders() {
142104
Member firstUser = jdaTester.createMemberSpy(1);
143105
Instant remindAt = Instant.now().plus(100, ChronoUnit.DAYS);
144106
for (int i = 0; i < RemindCommand.MAX_PENDING_REMINDERS_PER_USER; i++) {
145-
insertReminderRaw("foo " + i, remindAt, firstUser);
107+
rawReminders.insertReminder("foo " + i, remindAt, firstUser);
146108
}
147109

148110
Member secondUser = jdaTester.createMemberSpy(2);
@@ -153,7 +115,7 @@ void userIsNotLimitedIfOtherUserHasTooManyPendingReminders() {
153115
// THEN accepts the reminder and responds accordingly
154116
verify(event).reply("Will remind you about 'foo' in 5 minutes.");
155117

156-
List<String> remindersOfSecondUser = readRemindersRaw(secondUser);
118+
List<String> remindersOfSecondUser = rawReminders.readReminders(secondUser);
157119
assertEquals(1, remindersOfSecondUser.size());
158120
assertEquals("foo", remindersOfSecondUser.get(0));
159121
}
@@ -168,7 +130,7 @@ void canCreateReminders() {
168130
// THEN accepts the reminder and responds accordingly
169131
verify(event).reply("Will remind you about 'foo' in 5 minutes.");
170132

171-
List<String> pendingReminders = readRemindersRaw();
133+
List<String> pendingReminders = rawReminders.readReminders();
172134
assertEquals(1, pendingReminders.size());
173135
assertEquals("foo", pendingReminders.get(0));
174136
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package org.togetherjava.tjbot.commands.reminder;
2+
3+
import net.dv8tion.jda.api.entities.MessageEmbed;
4+
import net.dv8tion.jda.api.entities.TextChannel;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
import org.mockito.ArgumentCaptor;
10+
import org.togetherjava.tjbot.commands.Routine;
11+
import org.togetherjava.tjbot.db.Database;
12+
import org.togetherjava.tjbot.jda.JdaTester;
13+
14+
import java.time.Instant;
15+
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertTrue;
18+
import static org.mockito.Mockito.verify;
19+
import static org.togetherjava.tjbot.db.generated.tables.PendingReminders.PENDING_REMINDERS;
20+
21+
final class RemindRoutineTest {
22+
private Routine routine;
23+
private JdaTester jdaTester;
24+
private RawReminderTestHelper rawReminders;
25+
26+
@BeforeEach
27+
void setUp() {
28+
Database database = Database.createMemoryDatabase(PENDING_REMINDERS);
29+
routine = new RemindRoutine(database);
30+
jdaTester = new JdaTester();
31+
rawReminders = new RawReminderTestHelper(database, jdaTester);
32+
}
33+
34+
private void triggerRoutine() {
35+
routine.runRoutine(jdaTester.getJdaMock());
36+
}
37+
38+
private static @NotNull MessageEmbed getLastMessageFrom(@NotNull TextChannel channel) {
39+
ArgumentCaptor<MessageEmbed> responseCaptor = ArgumentCaptor.forClass(MessageEmbed.class);
40+
verify(channel).sendMessageEmbeds(responseCaptor.capture());
41+
return responseCaptor.getValue();
42+
}
43+
44+
@Test
45+
@DisplayName("Sends out a pending reminder, the base case")
46+
void sendsPendingReminder() {
47+
// GIVEN a pending reminder
48+
Instant remindAt = Instant.now();
49+
rawReminders.insertReminder("foo", remindAt);
50+
51+
// WHEN running the routine
52+
triggerRoutine();
53+
54+
// THEN the reminder is sent out and deleted from the database
55+
assertTrue(rawReminders.readReminders().isEmpty());
56+
57+
MessageEmbed lastMessage = getLastMessageFrom(jdaTester.getTextChannelSpy());
58+
assertEquals("foo", lastMessage.getDescription());
59+
assertEquals(remindAt, lastMessage.getTimestamp().toInstant());
60+
// TODO Use actual name of the test user
61+
assertEquals("name", lastMessage.getAuthor().getName());
62+
}
63+
}

application/src/test/java/org/togetherjava/tjbot/jda/JdaTester.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.togetherjava.tjbot.jda;
22

33
import net.dv8tion.jda.api.AccountType;
4+
import net.dv8tion.jda.api.JDA;
45
import net.dv8tion.jda.api.Permission;
56
import net.dv8tion.jda.api.entities.*;
67
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@@ -280,6 +281,15 @@ public JdaTester() {
280281
return member;
281282
}
282283

284+
/**
285+
* Gets the JDA mock used as universal instance by all mocks created by this tester instance.
286+
*
287+
* @return the JDA mock used by this tester
288+
*/
289+
public @NotNull JDA getJdaMock() {
290+
return jda;
291+
}
292+
283293
/**
284294
* Creates a mocked action that always succeeds and consumes the given object.
285295
* <p>

0 commit comments

Comments
 (0)