View Javadoc
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  }