diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 94a25f7..35eb1dd 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt b/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt
index 6d4099a..07f05fd 100644
--- a/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt
+++ b/src/main/kotlin/no/iktdev/eventi/ListenerRegistryImplementation.kt
@@ -7,5 +7,5 @@ abstract class ListenerRegistryImplementation {
listeners.add(listener)
}
- fun getListeners(): List = listeners.toList()
+ open fun getListeners(): List = listeners.toList()
}
\ No newline at end of file
diff --git a/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt b/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt
index 042fb5b..cf2623f 100644
--- a/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt
+++ b/src/main/kotlin/no/iktdev/eventi/events/EventListenerRegistry.kt
@@ -1,6 +1,11 @@
package no.iktdev.eventi.events
+import no.iktdev.eventi.ListenerOrder
import no.iktdev.eventi.ListenerRegistryImplementation
-object EventListenerRegistry: ListenerRegistryImplementation() {
+object EventListenerRegistry : ListenerRegistryImplementation() {
+ override fun getListeners(): List {
+ return super.getListeners()
+ .sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt b/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt
index d0d4481..a1d0ba8 100644
--- a/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt
+++ b/src/main/kotlin/no/iktdev/eventi/tasks/TaskListenerRegistry.kt
@@ -1,7 +1,11 @@
package no.iktdev.eventi.tasks
+import no.iktdev.eventi.ListenerOrder
import no.iktdev.eventi.ListenerRegistryImplementation
object TaskListenerRegistry: ListenerRegistryImplementation() {
-
+ override fun getListeners(): List {
+ return super.getListeners()
+ .sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
+ }
}
\ No newline at end of file
diff --git a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt
index 5e3f8d1..9d366c2 100644
--- a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt
+++ b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt
@@ -8,6 +8,7 @@ import no.iktdev.eventi.events.EventListenerRegistry
import no.iktdev.eventi.events.EventTypeRegistry
import no.iktdev.eventi.models.DeleteEvent
import no.iktdev.eventi.models.Event
+import no.iktdev.eventi.models.Metadata
import no.iktdev.eventi.testUtil.wipe
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Assertions.assertEquals
@@ -15,6 +16,7 @@ import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test
import java.time.LocalDateTime
import java.util.UUID
@@ -26,6 +28,11 @@ class EventDispatcherTest: TestBase() {
class TriggerEvent(): Event() {
}
class OtherEvent(): Event()
+ class DummyEvent(): Event() {
+ fun putMetadata(metadata: Metadata) {
+ this.metadata = metadata
+ }
+ }
@BeforeEach
@@ -37,7 +44,8 @@ class EventDispatcherTest: TestBase() {
EventTypeRegistry.register(listOf(
DerivedEvent::class.java,
TriggerEvent::class.java,
- OtherEvent::class.java
+ OtherEvent::class.java,
+ DummyEvent::class.java
))
}
@@ -146,6 +154,30 @@ class EventDispatcherTest: TestBase() {
assertTrue(received.contains(deleted))
}
+ @Test
+ @DisplayName("Replay skal ikke levere en event som allerede har avledet en ny")
+ fun `should not re-deliver events that have produced derived events`() {
+ val listener = ProducingListener()
+
+ val trigger = TriggerEvent()
+ // Første dispatch: trigger produserer en DerivedEvent
+ dispatcher.dispatch(trigger.referenceId, listOf(trigger))
+
+ val produced = eventStore.all().mapNotNull { it.toEvent() }
+ assertEquals(1, produced.size)
+ val derived = produced.first()
+ assertTrue(derived is DerivedEvent)
+
+ // Replay: nå har vi både trigger og derived i konteksten
+ val replayContext = listOf(trigger, derived)
+ dispatcher.dispatch(trigger.referenceId, replayContext)
+
+ // Verifiser at ingen nye events ble produsert
+ assertEquals(1, eventStore.all().size) {
+ "TriggerEvent skal ikke leveres som kandidat igjen når den allerede har avledet en DerivedEvent"
+ }
+ }
+
// --- Test helpers ---