Added order for listeners
This commit is contained in:
parent
1e179e32a5
commit
c2f0c24a8f
2
.idea/vcs.xml
generated
2
.idea/vcs.xml
generated
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="VcsDirectoryMappings">
|
<component name="VcsDirectoryMappings">
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
<mapping directory="" vcs="Git" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
@ -7,5 +7,5 @@ abstract class ListenerRegistryImplementation<T> {
|
|||||||
listeners.add(listener)
|
listeners.add(listener)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getListeners(): List<T> = listeners.toList()
|
open fun getListeners(): List<T> = listeners.toList()
|
||||||
}
|
}
|
||||||
@ -1,6 +1,11 @@
|
|||||||
package no.iktdev.eventi.events
|
package no.iktdev.eventi.events
|
||||||
|
|
||||||
|
import no.iktdev.eventi.ListenerOrder
|
||||||
import no.iktdev.eventi.ListenerRegistryImplementation
|
import no.iktdev.eventi.ListenerRegistryImplementation
|
||||||
|
|
||||||
object EventListenerRegistry: ListenerRegistryImplementation<EventListener>() {
|
object EventListenerRegistry : ListenerRegistryImplementation<EventListener>() {
|
||||||
|
override fun getListeners(): List<EventListener> {
|
||||||
|
return super.getListeners()
|
||||||
|
.sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -1,7 +1,11 @@
|
|||||||
package no.iktdev.eventi.tasks
|
package no.iktdev.eventi.tasks
|
||||||
|
|
||||||
|
import no.iktdev.eventi.ListenerOrder
|
||||||
import no.iktdev.eventi.ListenerRegistryImplementation
|
import no.iktdev.eventi.ListenerRegistryImplementation
|
||||||
|
|
||||||
object TaskListenerRegistry: ListenerRegistryImplementation<TaskListener>() {
|
object TaskListenerRegistry: ListenerRegistryImplementation<TaskListener>() {
|
||||||
|
override fun getListeners(): List<TaskListener> {
|
||||||
|
return super.getListeners()
|
||||||
|
.sortedBy { it::class.java.getAnnotation(ListenerOrder::class.java)?.value ?: Int.MAX_VALUE }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -8,6 +8,7 @@ import no.iktdev.eventi.events.EventListenerRegistry
|
|||||||
import no.iktdev.eventi.events.EventTypeRegistry
|
import no.iktdev.eventi.events.EventTypeRegistry
|
||||||
import no.iktdev.eventi.models.DeleteEvent
|
import no.iktdev.eventi.models.DeleteEvent
|
||||||
import no.iktdev.eventi.models.Event
|
import no.iktdev.eventi.models.Event
|
||||||
|
import no.iktdev.eventi.models.Metadata
|
||||||
import no.iktdev.eventi.testUtil.wipe
|
import no.iktdev.eventi.testUtil.wipe
|
||||||
import org.assertj.core.api.Assertions.assertThat
|
import org.assertj.core.api.Assertions.assertThat
|
||||||
import org.junit.jupiter.api.Assertions.assertEquals
|
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.assertNotNull
|
||||||
import org.junit.jupiter.api.Assertions.assertTrue
|
import org.junit.jupiter.api.Assertions.assertTrue
|
||||||
import org.junit.jupiter.api.BeforeEach
|
import org.junit.jupiter.api.BeforeEach
|
||||||
|
import org.junit.jupiter.api.DisplayName
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
@ -26,6 +28,11 @@ class EventDispatcherTest: TestBase() {
|
|||||||
class TriggerEvent(): Event() {
|
class TriggerEvent(): Event() {
|
||||||
}
|
}
|
||||||
class OtherEvent(): Event()
|
class OtherEvent(): Event()
|
||||||
|
class DummyEvent(): Event() {
|
||||||
|
fun putMetadata(metadata: Metadata) {
|
||||||
|
this.metadata = metadata
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
@ -37,7 +44,8 @@ class EventDispatcherTest: TestBase() {
|
|||||||
EventTypeRegistry.register(listOf(
|
EventTypeRegistry.register(listOf(
|
||||||
DerivedEvent::class.java,
|
DerivedEvent::class.java,
|
||||||
TriggerEvent::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))
|
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 ---
|
// --- Test helpers ---
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user