Skip to content

Commit 09c5dd2

Browse files
committed
Add unit tests for EventHandler functionality and implement UserEventCounterHandler
1 parent 6d44dfb commit 09c5dd2

3 files changed

Lines changed: 199 additions & 1 deletion

File tree

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
package com.neroyun.mediator;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.concurrent.Executors;
7+
import java.util.stream.Stream;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
/**
12+
* Unit tests for Event Handler functionality.
13+
* Tests event handling, event publishing, and multiple handlers for a single event.
14+
*/
15+
public class EventHandlerTest {
16+
17+
private Mediator mediator;
18+
private UserEventCounterHandler userEventCounter;
19+
20+
@BeforeEach
21+
void setUp() {
22+
// Clear any previous state
23+
UserStore.getInstance().clear();
24+
25+
// Create handler instances
26+
userEventCounter = new UserEventCounterHandler();
27+
28+
// Setup mediator with handlers
29+
mediator = new PipelinedMediator()
30+
.use(() -> Stream.of(
31+
new UserCreatedEventHandler(),
32+
userEventCounter
33+
))
34+
.use(() -> Executors.newFixedThreadPool(2));
35+
}
36+
37+
@Test
38+
void testUserCreatedEventHandler() {
39+
// Arrange
40+
UserCreatedEvent event = new UserCreatedEvent(123L, "Jane Doe");
41+
UserCreatedEventHandler handler = new UserCreatedEventHandler();
42+
43+
// Act
44+
Void result = handler.handle(event);
45+
46+
// Assert
47+
assertNull(result, "Event handler should return null (Void)");
48+
}
49+
50+
@Test
51+
void testEventHandlerReturnsVoid() {
52+
// Arrange
53+
UserCreatedEvent event = new UserCreatedEvent(456L, "John Smith");
54+
UserCreatedEventHandler handler = new UserCreatedEventHandler();
55+
56+
// Act
57+
Void result = handler.handle(event);
58+
59+
// Assert
60+
assertNull(result, "Event handler should return null (Void)");
61+
}
62+
63+
@Test
64+
void testEventHandlerMatches() {
65+
// Arrange
66+
UserCreatedEvent event = new UserCreatedEvent(1L, "Test User");
67+
UserCreatedEventHandler handler = new UserCreatedEventHandler();
68+
69+
// Act
70+
boolean matches = handler.matches(event);
71+
72+
// Assert
73+
assertTrue(matches, "Handler should match its own event type");
74+
}
75+
76+
@Test
77+
void testEventPublishDoesNotThrow() {
78+
// Arrange
79+
UserCreatedEvent event = new UserCreatedEvent(999L, "No Exception User");
80+
81+
// Act & Assert
82+
assertDoesNotThrow(() -> mediator.publish(event), "Publishing an event should not throw an exception");
83+
}
84+
85+
@Test
86+
void testMultipleHandlersForSameEvent() {
87+
// Arrange
88+
UserCreatedEvent event = new UserCreatedEvent(100L, "Multiple Handlers User");
89+
90+
// Act
91+
mediator.publish(event);
92+
93+
// Give handlers time to process (since they run asynchronously)
94+
try {
95+
Thread.sleep(100);
96+
} catch (InterruptedException e) {
97+
Thread.currentThread().interrupt();
98+
}
99+
100+
// Assert
101+
assertTrue(userEventCounter.getCount() > 0, "Counter handler should have been invoked");
102+
}
103+
104+
@Test
105+
void testMultipleEventsHandledInOrder() {
106+
// Arrange
107+
UserCreatedEvent event1 = new UserCreatedEvent(1L, "First User");
108+
UserCreatedEvent event2 = new UserCreatedEvent(2L, "Second User");
109+
UserCreatedEvent event3 = new UserCreatedEvent(3L, "Third User");
110+
111+
// Act
112+
mediator.publish(event1);
113+
mediator.publish(event2);
114+
mediator.publish(event3);
115+
116+
// Give handlers time to process
117+
try {
118+
Thread.sleep(200);
119+
} catch (InterruptedException e) {
120+
Thread.currentThread().interrupt();
121+
}
122+
123+
// Assert
124+
assertEquals(3, userEventCounter.getCount(), "Handler should have handled 3 events");
125+
}
126+
127+
@Test
128+
void testEventHandlerWithNullParameters() {
129+
// Arrange & Act & Assert
130+
assertThrows(IllegalArgumentException.class,
131+
() -> mediator.publish(null),
132+
"Publishing null event should throw IllegalArgumentException");
133+
}
134+
135+
@Test
136+
void testUserCreatedEventImmutability() {
137+
// Arrange
138+
Long id = 42L;
139+
String name = "Test User";
140+
141+
// Act
142+
UserCreatedEvent event = new UserCreatedEvent(id, name);
143+
144+
// Assert
145+
assertEquals(id, event.id(), "Event should store the correct id");
146+
assertEquals(name, event.name(), "Event should store the correct name");
147+
}
148+
149+
@Test
150+
void testEventImplementsEventInterface() {
151+
// Arrange
152+
UserCreatedEvent event = new UserCreatedEvent(1L, "Test");
153+
154+
// Assert
155+
assertInstanceOf(Event.class, event, "UserCreatedEvent should implement Event interface");
156+
}
157+
}
158+

src/test/java/com/neroyun/mediator/PipelinedMediatorTest.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,23 @@ public PipelinedMediatorTest() {
1717
}
1818

1919
@Test
20-
public void testMediator() {
20+
void testMediator() {
2121
mediator.send(new UserCreateCommand("John Doe", "johndoe@sample.com"));
2222

2323
var users = UserStore.getInstance().getUsers();
2424
assert users.size() == 1;
2525
assert users.get(0).name().equals("John Doe");
2626
}
27+
28+
@Test
29+
void testEventPublish() {
30+
// Arrange
31+
UserCreatedEvent event = new UserCreatedEvent(1234L, "Event Test User");
32+
33+
// Act & Assert - should not throw exception
34+
mediator.publish(event);
35+
36+
// Event publishing is asynchronous, so we just verify it doesn't throw
37+
assert true;
38+
}
2739
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.neroyun.mediator;
2+
3+
import java.util.concurrent.atomic.AtomicInteger;
4+
5+
/**
6+
* A test event handler that counts how many UserCreatedEvent instances it has handled.
7+
* Uses AtomicInteger for thread-safe counting.
8+
*/
9+
public class UserEventCounterHandler implements Handler<UserCreatedEvent, Void> {
10+
private final AtomicInteger counter = new AtomicInteger(0);
11+
12+
@Override
13+
public Void handle(UserCreatedEvent message) {
14+
counter.incrementAndGet();
15+
System.out.printf("UserEventCounterHandler: Counted event for user %s (Total: %d)\n",
16+
message.name(), counter.get());
17+
return null;
18+
}
19+
20+
public int getCount() {
21+
return counter.get();
22+
}
23+
24+
public void reset() {
25+
counter.set(0);
26+
}
27+
}
28+

0 commit comments

Comments
 (0)