Skip to content

Commit 35dd55f

Browse files
committed
More unit tests for remind routine
1 parent eaf1d66 commit 35dd55f

File tree

3 files changed

+123
-13
lines changed

3 files changed

+123
-13
lines changed

application/src/main/java/org/togetherjava/tjbot/commands/reminder/RemindRoutine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* Reminders can be set by using {@link RemindCommand}.
2828
*/
2929
public final class RemindRoutine implements Routine {
30-
private static final Logger logger = LoggerFactory.getLogger(RemindRoutine.class);
30+
static final Logger logger = LoggerFactory.getLogger(RemindRoutine.class);
3131
private static final Color AMBIENT_COLOR = Color.decode("#F7F492");
3232
private static final int SCHEDULE_INTERVAL_SECONDS = 30;
3333
private final Database database;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,16 @@ final class RawReminderTestHelper {
2323
}
2424

2525
void insertReminder(@NotNull String content, @NotNull Instant remindAt) {
26-
insertReminder(content, remindAt, jdaTester.getMemberSpy());
26+
insertReminder(content, remindAt, jdaTester.getMemberSpy(), jdaTester.getTextChannelSpy());
2727
}
2828

2929
void insertReminder(@NotNull String content, @NotNull Instant remindAt,
3030
@NotNull Member author) {
31-
TextChannel channel = jdaTester.getTextChannelSpy();
31+
insertReminder(content, remindAt, author, jdaTester.getTextChannelSpy());
32+
}
33+
34+
void insertReminder(@NotNull String content, @NotNull Instant remindAt, @NotNull Member author,
35+
@NotNull TextChannel channel) {
3236
long channelId = channel.getIdLong();
3337
long guildId = channel.getGuild().getIdLong();
3438
long authorId = author.getIdLong();

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

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

3-
import net.dv8tion.jda.api.entities.MessageEmbed;
4-
import net.dv8tion.jda.api.entities.TextChannel;
5-
import net.dv8tion.jda.api.entities.User;
3+
import net.dv8tion.jda.api.entities.*;
4+
import net.dv8tion.jda.api.requests.ErrorResponse;
5+
import net.dv8tion.jda.api.requests.RestAction;
66
import org.jetbrains.annotations.NotNull;
77
import org.junit.jupiter.api.BeforeEach;
88
import org.junit.jupiter.api.DisplayName;
@@ -13,11 +13,12 @@
1313
import org.togetherjava.tjbot.jda.JdaTester;
1414

1515
import java.time.Instant;
16+
import java.time.temporal.ChronoUnit;
1617
import java.util.concurrent.TimeUnit;
1718

1819
import static org.junit.jupiter.api.Assertions.assertEquals;
1920
import static org.junit.jupiter.api.Assertions.assertTrue;
20-
import static org.mockito.Mockito.verify;
21+
import static org.mockito.Mockito.*;
2122
import static org.togetherjava.tjbot.db.generated.tables.PendingReminders.PENDING_REMINDERS;
2223

2324
final class RemindRoutineTest {
@@ -37,20 +38,70 @@ private void triggerRoutine() {
3738
routine.runRoutine(jdaTester.getJdaMock());
3839
}
3940

40-
private static @NotNull MessageEmbed getLastMessageFrom(@NotNull TextChannel channel) {
41+
private static @NotNull MessageEmbed getLastMessageFrom(@NotNull MessageChannel channel) {
4142
ArgumentCaptor<MessageEmbed> responseCaptor = ArgumentCaptor.forClass(MessageEmbed.class);
4243
verify(channel).sendMessageEmbeds(responseCaptor.capture());
4344
return responseCaptor.getValue();
4445
}
4546

47+
private @NotNull Member createAndSetupUnknownMember() {
48+
int unknownMemberId = 2;
49+
50+
Member member = jdaTester.createMemberSpy(unknownMemberId);
51+
52+
RestAction<User> unknownMemberAction = jdaTester.createFailedActionMock(
53+
jdaTester.createErrorResponseException(ErrorResponse.UNKNOWN_USER));
54+
when(jdaTester.getJdaMock().retrieveUserById(unknownMemberId))
55+
.thenReturn(unknownMemberAction);
56+
57+
RestAction<PrivateChannel> unknownPrivateChannelAction = jdaTester.createFailedActionMock(
58+
jdaTester.createErrorResponseException(ErrorResponse.UNKNOWN_USER));
59+
when(jdaTester.getJdaMock().openPrivateChannelById(anyLong()))
60+
.thenReturn(unknownPrivateChannelAction);
61+
when(jdaTester.getJdaMock().openPrivateChannelById(anyString()))
62+
.thenReturn(unknownPrivateChannelAction);
63+
64+
return member;
65+
}
66+
67+
private @NotNull TextChannel createAndSetupUnknownChannel() {
68+
int unknownChannelId = 2;
69+
70+
TextChannel channel = jdaTester.createTextChannelSpy(unknownChannelId);
71+
when(jdaTester.getJdaMock().getTextChannelById(unknownChannelId)).thenReturn(null);
72+
73+
return channel;
74+
}
75+
4676
@Test
47-
@DisplayName("Sends out a pending reminder, the base case")
48-
void sendsPendingReminder() {
77+
@DisplayName("Sends out a pending reminder to a guild channel, the base case")
78+
void sendsPendingReminderChannelFoundAuthorFound() {
4979
// GIVEN a pending reminder
5080
Instant remindAt = Instant.now();
5181
String reminderContent = "foo";
52-
User author = jdaTester.getMemberSpy().getUser();
53-
rawReminders.insertReminder("foo", remindAt);
82+
Member author = jdaTester.getMemberSpy();
83+
rawReminders.insertReminder("foo", remindAt, author);
84+
85+
// WHEN running the routine
86+
triggerRoutine();
87+
88+
// THEN the reminder is sent out and deleted from the database
89+
assertTrue(rawReminders.readReminders().isEmpty());
90+
91+
MessageEmbed lastMessage = getLastMessageFrom(jdaTester.getTextChannelSpy());
92+
assertEquals(reminderContent, lastMessage.getDescription());
93+
assertSimilar(remindAt, lastMessage.getTimestamp().toInstant());
94+
assertEquals(author.getUser().getAsTag(), lastMessage.getAuthor().getName());
95+
}
96+
97+
@Test
98+
@DisplayName("Sends out a pending reminder to a guild channel, even if the author could not be retrieved anymore")
99+
void sendsPendingReminderChannelFoundAuthorNotFound() {
100+
// GIVEN a pending reminder from an unknown user
101+
Instant remindAt = Instant.now();
102+
String reminderContent = "foo";
103+
Member unknownAuthor = createAndSetupUnknownMember();
104+
rawReminders.insertReminder("foo", remindAt, unknownAuthor);
54105

55106
// WHEN running the routine
56107
triggerRoutine();
@@ -61,7 +112,62 @@ void sendsPendingReminder() {
61112
MessageEmbed lastMessage = getLastMessageFrom(jdaTester.getTextChannelSpy());
62113
assertEquals(reminderContent, lastMessage.getDescription());
63114
assertSimilar(remindAt, lastMessage.getTimestamp().toInstant());
64-
assertEquals(author.getAsTag(), lastMessage.getAuthor().getName());
115+
assertEquals("Unknown user", lastMessage.getAuthor().getName());
116+
}
117+
118+
@Test
119+
@DisplayName("Sends out a pending reminder via DM, even if the channel could not be retrieved anymore")
120+
void sendsPendingReminderChannelNotFoundAuthorFound() {
121+
// GIVEN a pending reminder from an unknown channel
122+
Instant remindAt = Instant.now();
123+
String reminderContent = "foo";
124+
Member author = jdaTester.getMemberSpy();
125+
TextChannel unknownChannel = createAndSetupUnknownChannel();
126+
rawReminders.insertReminder("foo", remindAt, author, unknownChannel);
127+
128+
// WHEN running the routine
129+
triggerRoutine();
130+
131+
// THEN the reminder is sent out and deleted from the database
132+
assertTrue(rawReminders.readReminders().isEmpty());
133+
134+
MessageEmbed lastMessage = getLastMessageFrom(jdaTester.getPrivateChannelSpy());
135+
assertEquals(reminderContent, lastMessage.getDescription());
136+
assertSimilar(remindAt, lastMessage.getTimestamp().toInstant());
137+
assertEquals(author.getUser().getAsTag(), lastMessage.getAuthor().getName());
138+
}
139+
140+
@Test
141+
@DisplayName("Skips a pending reminder if sending it out resulted in an error")
142+
void skipPendingReminderOnErrorChannelNotFoundAuthorNotFound() {
143+
// GIVEN a pending reminder and from an unknown channel and author
144+
Instant remindAt = Instant.now();
145+
String reminderContent = "foo";
146+
Member unknownAuthor = createAndSetupUnknownMember();
147+
TextChannel unknownChannel = createAndSetupUnknownChannel();
148+
rawReminders.insertReminder("foo", remindAt, unknownAuthor, unknownChannel);
149+
150+
// WHEN running the routine
151+
triggerRoutine();
152+
153+
// THEN the reminder is skipped and deleted from the database
154+
assertTrue(rawReminders.readReminders().isEmpty());
155+
}
156+
157+
@Test
158+
@DisplayName("A reminder that is not pending yet, is not send out")
159+
void reminderIsNotSendIfNotPending() {
160+
// GIVEN a reminder that is not pending yet
161+
Instant remindAt = Instant.now().plus(1, ChronoUnit.HOURS);
162+
String reminderContent = "foo";
163+
rawReminders.insertReminder("foo", remindAt);
164+
165+
// WHEN running the routine
166+
triggerRoutine();
167+
168+
// THEN the reminder is not send yet and still in the database
169+
assertEquals(1, rawReminders.readReminders().size());
170+
verify(jdaTester.getTextChannelSpy(), never()).sendMessageEmbeds(any(MessageEmbed.class));
65171
}
66172

67173
private static void assertSimilar(@NotNull Instant expected, @NotNull Instant actual) {

0 commit comments

Comments
 (0)