1 package com.github.jonasrutishauser.transactional.event.cdi.test;
2
3 import static org.awaitility.Awaitility.await;
4
5 import java.io.Serializable;
6 import java.util.Set;
7 import java.util.concurrent.ConcurrentSkipListSet;
8
9 import javax.sql.DataSource;
10
11 import org.junit.jupiter.api.Test;
12 import org.junit.jupiter.api.extension.ExtendWith;
13
14 import com.github.jonasrutishauser.cdi.test.api.context.TestScoped;
15 import com.github.jonasrutishauser.cdi.test.core.junit.CdiTestJunitExtension;
16 import com.github.jonasrutishauser.transactional.event.api.EventPublisher;
17 import com.github.jonasrutishauser.transactional.event.api.Events;
18 import com.github.jonasrutishauser.transactional.event.api.handler.AbstractHandler;
19 import com.github.jonasrutishauser.transactional.event.api.handler.EventHandler;
20 import com.github.jonasrutishauser.transactional.event.api.store.EventStore;
21
22 import jakarta.inject.Inject;
23 import jakarta.transaction.UserTransaction;
24
25 @ExtendWith(CdiTestJunitExtension.class)
26 class TransactionalEventTest {
27
28 @Inject
29 EventPublisher publisher;
30
31 @Inject
32 UserTransaction transaction;
33
34 @Inject
35 @Events
36 DataSource dataSource;
37
38 @Inject
39 ReceivedMessages messages;
40
41 @Inject
42 EventStore store;
43
44 @Test
45 void testPublish() throws Exception {
46 transaction.begin();
47 publisher.publish(new TestSerializableEvent("test"));
48 transaction.commit();
49
50 await().until(() -> messages.contains("test"));
51 }
52
53 @TestScoped
54 static class ReceivedMessages {
55 private Set<String> messages = new ConcurrentSkipListSet<>();
56
57 public void add(String message) {
58 messages.add(message);
59 }
60
61 public boolean contains(String message) {
62 return messages.contains(message);
63 }
64 }
65
66 abstract static class AbstractTestHandler<T> extends AbstractHandler<T> {
67 @Inject
68 ReceivedMessages messages;
69
70 protected void gotMessage(String message) {
71 this.messages.add(message);
72 }
73 }
74
75 @TestScoped
76 @EventHandler
77 static class TestSerializableHandler extends AbstractTestHandler<TestSerializableEvent> {
78 int tries = 0;
79
80 @Override
81 protected void handle(TestSerializableEvent event) {
82 gotMessage(event.message);
83 }
84 }
85
86 static class TestSerializableEvent implements Serializable {
87 private static final long serialVersionUID = 1L;
88
89 private final String message;
90
91 public TestSerializableEvent(String message) {
92 this.message = message;
93 }
94 }
95
96 }