Skip to content

Commit 44de33d

Browse files
committed
tests for warn decay
1 parent 548a7a9 commit 44de33d

File tree

2 files changed

+164
-2
lines changed

2 files changed

+164
-2
lines changed

src/main/java/net/discordjug/javabot/systems/moderation/ModerationService.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,18 @@ public void warn(User user, WarnSeverity severity, String reason, Member warnedB
9797
*/
9898
public SeverityInformation getTotalSeverityWeight(Guild guild, long userId) {
9999
ModerationConfig moderationConfig = botConfig.get(guild).getModerationConfig();
100-
LocalDateTime now = LocalDateTime.now();
101-
List<Warn> activeWarns = warnRepository.getActiveWarnsByUserId(userId, now.minusDays(moderationConfig.getMaxWarnValidityDays()));
100+
List<Warn> activeWarns = warnRepository.getActiveWarnsByUserId(userId, LocalDateTime.now().minusDays(moderationConfig.getMaxWarnValidityDays()));
101+
return calculateSeverityWeight(moderationConfig, activeWarns);
102+
}
103+
104+
static SeverityInformation calculateSeverityWeight(ModerationConfig moderationConfig, List<Warn> activeWarns) {
102105
int accumulatedUndiscountedSeverity = 0;
103106
long maxSeverity = 0;
104107
long usedSeverityDiscount = 0;
105108
List<Warn> contributingWarns = Collections.emptyList();
106109

110+
LocalDateTime now = LocalDateTime.now();
111+
107112
for (int i = 0; i < activeWarns.size(); i++) {
108113
Warn warn = activeWarns.get(i);
109114
accumulatedUndiscountedSeverity += warn.getSeverityWeight();
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package net.discordjug.javabot.systems.moderation;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import java.time.LocalDateTime;
6+
import java.util.ArrayList;
7+
import java.util.Collections;
8+
import java.util.List;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
import net.discordjug.javabot.data.config.guild.ModerationConfig;
13+
import net.discordjug.javabot.systems.moderation.ModerationService.SeverityInformation;
14+
import net.discordjug.javabot.systems.moderation.warn.model.Warn;
15+
import net.discordjug.javabot.systems.moderation.warn.model.WarnSeverity;
16+
17+
/**
18+
* Tests for warn decay.
19+
*/
20+
public class WarnDecayTest {
21+
@Test
22+
void testWithNoWarns() {
23+
ModerationConfig config = new ModerationConfig();
24+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, Collections.emptyList());
25+
assertEquals(new SeverityInformation(0, 0, Collections.emptyList()), result);
26+
}
27+
28+
@Test
29+
void testWithNewWarn() {
30+
ModerationConfig config = new ModerationConfig();
31+
List<Warn> warns = List.of(createWarn(LocalDateTime.now()));
32+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
33+
assertEquals(new SeverityInformation(20, 0, warns), result);
34+
}
35+
36+
@Test
37+
void testWithOnceDiscountedWarn() {
38+
ModerationConfig config = new ModerationConfig();
39+
config.setWarnDecayAmount(5);
40+
config.setWarnDecayDays(1);
41+
42+
List<Warn> warns = List.of(createWarn(LocalDateTime.now().minusDays(1)));
43+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
44+
assertEquals(new SeverityInformation(15, 5, warns), result);
45+
}
46+
47+
@Test
48+
void testWithMultipleTimesDiscountedWarn() {
49+
ModerationConfig config = new ModerationConfig();
50+
config.setWarnDecayAmount(5);
51+
config.setWarnDecayDays(1);
52+
53+
List<Warn> warns = List.of(createWarn(LocalDateTime.now().minusDays(2)));
54+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
55+
assertEquals(new SeverityInformation(10, 10, warns), result);
56+
}
57+
58+
@Test
59+
void testWithMultipleDiscountedWarns() {
60+
ModerationConfig config = new ModerationConfig();
61+
config.setWarnDecayAmount(5);
62+
config.setWarnDecayDays(1);
63+
64+
List<Warn> warns = List.of(
65+
createWarn(LocalDateTime.now().minusDays(2)),
66+
createWarn(LocalDateTime.now().minusDays(5), WarnSeverity.HIGH)
67+
);
68+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
69+
assertEquals(new SeverityInformation(75, 25, warns), result);
70+
}
71+
72+
@Test
73+
void testWithTooOldWarn() {
74+
ModerationConfig config = new ModerationConfig();
75+
config.setWarnDecayAmount(5);
76+
config.setWarnDecayDays(1);
77+
78+
List<Warn> warns = List.of(createWarn(LocalDateTime.now().minusDays(10)));
79+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
80+
assertEquals(new SeverityInformation(0, 0, Collections.emptyList()), result);
81+
}
82+
83+
@Test
84+
void testWithTooOldAndRecentWarns() {
85+
ModerationConfig config = new ModerationConfig();
86+
config.setWarnDecayAmount(5);
87+
config.setWarnDecayDays(1);
88+
89+
Warn recentWarn = createWarn(LocalDateTime.now().minusDays(2));
90+
List<Warn> warns = List.of(
91+
recentWarn,
92+
createWarn(LocalDateTime.now().minusDays(8))
93+
);
94+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
95+
assertEquals(new SeverityInformation(10, 10, List.of(recentWarn)), result);
96+
}
97+
98+
@Test
99+
void testWarnReenablingFutureWarns() {
100+
ModerationConfig config = new ModerationConfig();
101+
config.setWarnDecayAmount(5);
102+
config.setWarnDecayDays(1);
103+
104+
List<Warn> warns = List.of(
105+
createWarn(LocalDateTime.now().minusDays(2)),
106+
createWarn(LocalDateTime.now().minusDays(8)),
107+
createWarn(LocalDateTime.now().minusDays(10), WarnSeverity.HIGH)
108+
);
109+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
110+
assertEquals(new SeverityInformation(70, 50, warns), result);
111+
}
112+
113+
@Test
114+
void testWithMultipleRecentAndOldWarns() {
115+
ModerationConfig config = new ModerationConfig();
116+
config.setWarnDecayAmount(5);
117+
config.setWarnDecayDays(1);
118+
119+
List<Warn> expected = List.of(
120+
createWarn(LocalDateTime.now().minusDays(2)),//20
121+
createWarn(LocalDateTime.now().minusDays(5), WarnSeverity.HIGH)//80, -25
122+
);
123+
List<Warn> warns = new ArrayList<>(expected);
124+
warns.add(createWarn(LocalDateTime.now().minusDays(10)));//ignored
125+
126+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
127+
assertEquals(new SeverityInformation(75, 25, expected), result);
128+
}
129+
130+
@Test
131+
void testMultipleOldWarns() {
132+
ModerationConfig config = new ModerationConfig();
133+
config.setWarnDecayAmount(5);
134+
config.setWarnDecayDays(1);
135+
136+
List<Warn> warns = List.of(
137+
//would all be ignored on their own but outweigh decay together
138+
createWarn(LocalDateTime.now().minusDays(5)),
139+
createWarn(LocalDateTime.now().minusDays(5)),
140+
createWarn(LocalDateTime.now().minusDays(5)),
141+
createWarn(LocalDateTime.now().minusDays(5)),
142+
createWarn(LocalDateTime.now().minusDays(5))
143+
);
144+
SeverityInformation result = ModerationService.calculateSeverityWeight(config, warns);
145+
assertEquals(new SeverityInformation(75, 25, warns), result);
146+
}
147+
148+
private Warn createWarn(LocalDateTime creationTimestamp) {
149+
return createWarn(creationTimestamp, WarnSeverity.LOW);
150+
}
151+
152+
private Warn createWarn(LocalDateTime creationTimestamp, WarnSeverity severity) {
153+
Warn warn = new Warn(0, 0, severity, "a");
154+
warn.setCreatedAt(creationTimestamp);
155+
return warn;
156+
}
157+
}

0 commit comments

Comments
 (0)