Skip to content

Commit 1302618

Browse files
authored
Bael 8832 (#18020)
* BAEL-8832 add pattern to assert log * update containsPattern
1 parent 433b309 commit 1302618

File tree

2 files changed

+74
-10
lines changed

2 files changed

+74
-10
lines changed

testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/BusinessWorkerUnitTest.java

+48-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5+
import java.util.List;
6+
import java.util.regex.Pattern;
7+
58
import org.junit.After;
69
import org.junit.Before;
710
import org.junit.Test;
@@ -12,6 +15,7 @@
1215
import ch.qos.logback.classic.LoggerContext;
1316

1417
public class BusinessWorkerUnitTest {
18+
1519
private static MemoryAppender memoryAppender;
1620
private static final String LOGGER_NAME = "com.baeldung.junit.log";
1721
private static final String MSG = "This is a test message!!!";
@@ -37,12 +41,54 @@ public void cleanUp() {
3741
public void test() {
3842
BusinessWorker worker = new BusinessWorker();
3943
worker.generateLogs(MSG);
40-
44+
4145
// I check that I only have 4 messages (all but trace)
4246
assertThat(memoryAppender.countEventsForLogger(LOGGER_NAME)).isEqualTo(4);
4347
// I look for a specific message at a specific level, and I only have 1
44-
assertThat(memoryAppender.search(MSG, Level.INFO).size()).isEqualTo(1);
48+
assertThat(memoryAppender.search(MSG, Level.INFO)
49+
.size()).isEqualTo(1);
4550
// I check that the entry that is not present is the trace level
4651
assertThat(memoryAppender.contains(MSG, Level.TRACE)).isFalse();
4752
}
53+
54+
@Test
55+
public void whenMultipleLogLevel_thenReturnExpectedResult() {
56+
BusinessWorker worker = new BusinessWorker();
57+
worker.generateLogs("Transaction started for Order ID: 1001");
58+
assertThat(memoryAppender.countEventsForLogger(LOGGER_NAME)).isEqualTo(4);
59+
assertThat(memoryAppender.search("Transaction started", Level.INFO)
60+
.size()).isEqualTo(1);
61+
assertThat(memoryAppender.search("Transaction started", Level.WARN)
62+
.size()).isEqualTo(1);
63+
assertThat(memoryAppender.search("Transaction started", Level.ERROR)
64+
.size()).isEqualTo(1);
65+
assertThat(memoryAppender.search("Transaction started", Level.TRACE)).isEmpty();
66+
}
67+
68+
@Test
69+
public void whenUsingPattern_thenReturnExpectedResult() {
70+
BusinessWorker worker = new BusinessWorker();
71+
worker.generateLogs("Order processed successfully for Order ID: 12345");
72+
73+
Pattern orderPattern = Pattern.compile(".*Order ID: \\d{5}.*");
74+
75+
assertThat(memoryAppender.containsPattern(orderPattern, Level.INFO)).isTrue();
76+
assertThat(memoryAppender.containsPattern(orderPattern, Level.WARN)).isTrue();
77+
assertThat(memoryAppender.containsPattern(orderPattern, Level.ERROR)).isTrue();
78+
assertThat(memoryAppender.containsPattern(orderPattern, Level.TRACE)).isFalse();
79+
}
80+
81+
@Test
82+
public void whenUsingMultiplePatterns_thenReturnExpectedResult() {
83+
BusinessWorker worker = new BusinessWorker();
84+
worker.generateLogs("User Login: username=user123, timestamp=2024-11-25T10:15:30");
85+
86+
List<Pattern> patterns = List.of(
87+
Pattern.compile(".*username=user\\w+.*"),
88+
Pattern.compile(".*timestamp=\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.*")
89+
);
90+
91+
assertThat(memoryAppender.containsPatterns(patterns, Level.INFO)).isTrue();
92+
assertThat(memoryAppender.containsPatterns(patterns, Level.WARN)).isTrue();
93+
}
4894
}

testing-modules/testing-assertions/src/test/java/com/baeldung/junit/log/MemoryAppender.java

+26-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.Collections;
44
import java.util.List;
5+
import java.util.regex.Pattern;
56
import java.util.stream.Collectors;
67

78
import ch.qos.logback.classic.Level;
@@ -13,32 +14,38 @@
1314
* Convenient appender to be able to check slf4j invocations
1415
*/
1516
public class MemoryAppender extends ListAppender<ILoggingEvent> {
17+
1618
public void reset() {
1719
this.list.clear();
1820
}
1921

2022
public boolean contains(String string, Level level) {
2123
return this.list.stream()
22-
.anyMatch(event -> event.toString().contains(string)
23-
&& event.getLevel().equals(level));
24+
.anyMatch(event -> event.toString()
25+
.contains(string) && event.getLevel()
26+
.equals(level));
2427
}
2528

2629
public int countEventsForLogger(String loggerName) {
2730
return (int) this.list.stream()
28-
.filter(event -> event.getLoggerName().contains(loggerName)).count();
31+
.filter(event -> event.getLoggerName()
32+
.contains(loggerName))
33+
.count();
2934
}
3035

3136
public List<ILoggingEvent> search(String string) {
3237
return this.list.stream()
33-
.filter(event -> event.toString().contains(string))
34-
.collect(Collectors.toList());
38+
.filter(event -> event.toString()
39+
.contains(string))
40+
.collect(Collectors.toList());
3541
}
3642

3743
public List<ILoggingEvent> search(String string, Level level) {
3844
return this.list.stream()
39-
.filter(event -> event.toString().contains(string)
40-
&& event.getLevel().equals(level))
41-
.collect(Collectors.toList());
45+
.filter(event -> event.toString()
46+
.contains(string) && event.getLevel()
47+
.equals(level))
48+
.collect(Collectors.toList());
4249
}
4350

4451
public int getSize() {
@@ -48,4 +55,15 @@ public int getSize() {
4855
public List<ILoggingEvent> getLoggedEvents() {
4956
return Collections.unmodifiableList(this.list);
5057
}
58+
59+
public boolean containsPattern(Pattern pattern, Level level) {
60+
return this.list.stream()
61+
.filter(event -> event.getLevel().equals(level))
62+
.anyMatch(event -> pattern.matcher(event.getFormattedMessage()).matches());
63+
}
64+
65+
public boolean containsPatterns(List<Pattern> patternList, Level level) {
66+
return patternList.stream()
67+
.allMatch(pattern -> containsPattern(pattern, level));
68+
}
5169
}

0 commit comments

Comments
 (0)