1
1
package org .togetherjava .tjbot .commands .reminder ;
2
2
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 ;
6
6
import org .jetbrains .annotations .NotNull ;
7
7
import org .junit .jupiter .api .BeforeEach ;
8
8
import org .junit .jupiter .api .DisplayName ;
13
13
import org .togetherjava .tjbot .jda .JdaTester ;
14
14
15
15
import java .time .Instant ;
16
+ import java .time .temporal .ChronoUnit ;
16
17
import java .util .concurrent .TimeUnit ;
17
18
18
19
import static org .junit .jupiter .api .Assertions .assertEquals ;
19
20
import static org .junit .jupiter .api .Assertions .assertTrue ;
20
- import static org .mockito .Mockito .verify ;
21
+ import static org .mockito .Mockito .* ;
21
22
import static org .togetherjava .tjbot .db .generated .tables .PendingReminders .PENDING_REMINDERS ;
22
23
23
24
final class RemindRoutineTest {
@@ -37,20 +38,70 @@ private void triggerRoutine() {
37
38
routine .runRoutine (jdaTester .getJdaMock ());
38
39
}
39
40
40
- private static @ NotNull MessageEmbed getLastMessageFrom (@ NotNull TextChannel channel ) {
41
+ private static @ NotNull MessageEmbed getLastMessageFrom (@ NotNull MessageChannel channel ) {
41
42
ArgumentCaptor <MessageEmbed > responseCaptor = ArgumentCaptor .forClass (MessageEmbed .class );
42
43
verify (channel ).sendMessageEmbeds (responseCaptor .capture ());
43
44
return responseCaptor .getValue ();
44
45
}
45
46
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
+
46
76
@ 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 () {
49
79
// GIVEN a pending reminder
50
80
Instant remindAt = Instant .now ();
51
81
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 );
54
105
55
106
// WHEN running the routine
56
107
triggerRoutine ();
@@ -61,7 +112,62 @@ void sendsPendingReminder() {
61
112
MessageEmbed lastMessage = getLastMessageFrom (jdaTester .getTextChannelSpy ());
62
113
assertEquals (reminderContent , lastMessage .getDescription ());
63
114
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 ));
65
171
}
66
172
67
173
private static void assertSimilar (@ NotNull Instant expected , @ NotNull Instant actual ) {
0 commit comments