Removed default referenceId - avoiding rouge events

This commit is contained in:
Brage Skjønborg 2026-02-01 19:35:23 +01:00
parent 5082571ce8
commit 85e1e805b7
4 changed files with 25 additions and 20 deletions

View File

@ -64,7 +64,7 @@ class EventDispatcherTest : TestBase() {
fun shouldProduceOneEventAndStop() { fun shouldProduceOneEventAndStop() {
ProducingListener() ProducingListener()
val trigger = TriggerEvent() val trigger = TriggerEvent().newReferenceId()
dispatcher.dispatch(trigger.referenceId, listOf(trigger)) dispatcher.dispatch(trigger.referenceId, listOf(trigger))
val produced = eventStore.all().firstOrNull() val produced = eventStore.all().firstOrNull()
@ -87,7 +87,7 @@ class EventDispatcherTest : TestBase() {
fun shouldSkipAlreadyDerivedEvents() { fun shouldSkipAlreadyDerivedEvents() {
ProducingListener() ProducingListener()
val trigger = TriggerEvent() val trigger = TriggerEvent().newReferenceId()
val derived = DerivedEvent().derivedOf(trigger).toPersisted(1L, MyTime.utcNow()) val derived = DerivedEvent().derivedOf(trigger).toPersisted(1L, MyTime.utcNow())
eventStore.persist(derived!!.toEvent()!!) // simulate prior production eventStore.persist(derived!!.toEvent()!!) // simulate prior production
@ -108,8 +108,8 @@ class EventDispatcherTest : TestBase() {
fun shouldPassFullContextToListener() { fun shouldPassFullContextToListener() {
val listener = ContextCapturingListener() val listener = ContextCapturingListener()
val e1 = TriggerEvent() val e1 = TriggerEvent().newReferenceId()
val e2 = OtherEvent() val e2 = OtherEvent().newReferenceId()
dispatcher.dispatch(e1.referenceId, listOf(e1, e2)) dispatcher.dispatch(e1.referenceId, listOf(e1, e2))
assertEquals(2, listener.context.size) assertEquals(2, listener.context.size)
@ -124,9 +124,11 @@ class EventDispatcherTest : TestBase() {
""" """
) )
fun shouldBehaveDeterministicallyAcrossReplays() { fun shouldBehaveDeterministicallyAcrossReplays() {
val referenceId = UUID.randomUUID()
ProducingListener() ProducingListener()
val trigger = TriggerEvent() val trigger = TriggerEvent().usingReferenceId(referenceId)
dispatcher.dispatch(trigger.referenceId, listOf(trigger)) dispatcher.dispatch(trigger.referenceId, listOf(trigger))
val replayContext = listOf(trigger) + eventStore.all().mapNotNull { it.toEvent() } val replayContext = listOf(trigger) + eventStore.all().mapNotNull { it.toEvent() }
@ -144,6 +146,8 @@ class EventDispatcherTest : TestBase() {
""" """
) )
fun shouldNotDeliverDeletedEventsAsCandidates() { fun shouldNotDeliverDeletedEventsAsCandidates() {
val referenceId = UUID.randomUUID()
val dispatcher = EventDispatcher(eventStore) val dispatcher = EventDispatcher(eventStore)
val received = mutableListOf<Event>() val received = mutableListOf<Event>()
@ -154,11 +158,10 @@ class EventDispatcherTest : TestBase() {
} }
} }
// Original hendelse // Original hendelse
val original = TriggerEvent() val original = TriggerEvent().usingReferenceId(referenceId)
// Slettehendelse som peker på original // Slettehendelse som peker på original
val deleted = object : DeleteEvent(original.eventId) { val deleted = object : DeleteEvent(original.eventId) {}.apply { newReferenceId() }
}
// Dispatch med begge hendelser // Dispatch med begge hendelser
dispatcher.dispatch(original.referenceId, listOf(original, deleted)) dispatcher.dispatch(original.referenceId, listOf(original, deleted))
@ -184,6 +187,8 @@ class EventDispatcherTest : TestBase() {
) )
fun shouldDeliverDeleteEventToListenersThatReactToIt() { fun shouldDeliverDeleteEventToListenersThatReactToIt() {
val received = mutableListOf<Event>() val received = mutableListOf<Event>()
val referenceId = UUID.randomUUID()
object : EventListener() { object : EventListener() {
override fun onEvent(event: Event, history: List<Event>): Event? { override fun onEvent(event: Event, history: List<Event>): Event? {
if (event is DeleteEvent) received += event if (event is DeleteEvent) received += event
@ -191,7 +196,7 @@ class EventDispatcherTest : TestBase() {
} }
} }
val deleted = object : DeleteEvent(UUID.randomUUID()) {} val deleted = object : DeleteEvent(UUID.randomUUID()) {}.apply { usingReferenceId(referenceId) }
dispatcher.dispatch(deleted.referenceId, listOf(deleted)) dispatcher.dispatch(deleted.referenceId, listOf(deleted))
assertTrue(received.contains(deleted)) assertTrue(received.contains(deleted))
@ -208,7 +213,7 @@ class EventDispatcherTest : TestBase() {
fun shouldNotRedeliverEventsThatHaveProducedDerivedEvents() { fun shouldNotRedeliverEventsThatHaveProducedDerivedEvents() {
ProducingListener() ProducingListener()
val trigger = TriggerEvent() val trigger = TriggerEvent().newReferenceId()
// Første dispatch: trigger produserer en DerivedEvent // Første dispatch: trigger produserer en DerivedEvent
dispatcher.dispatch(trigger.referenceId, listOf(trigger)) dispatcher.dispatch(trigger.referenceId, listOf(trigger))
@ -238,8 +243,8 @@ class EventDispatcherTest : TestBase() {
fun historyShouldExcludeDeletedEvents() { fun historyShouldExcludeDeletedEvents() {
val dispatcher = EventDispatcher(eventStore) val dispatcher = EventDispatcher(eventStore)
val original = TriggerEvent() val original = TriggerEvent().newReferenceId()
val deleted = object : DeleteEvent(original.eventId) {} val deleted = object : DeleteEvent(original.eventId) {}.apply { usingReferenceId(original.referenceId) }
var receivedHistory: List<Event> = emptyList() var receivedHistory: List<Event> = emptyList()
@ -266,9 +271,9 @@ class EventDispatcherTest : TestBase() {
) )
fun historyShouldKeepNonDeletedEvents() { fun historyShouldKeepNonDeletedEvents() {
val dispatcher = EventDispatcher(eventStore) val dispatcher = EventDispatcher(eventStore)
val referenceId = UUID.randomUUID()
val e1 = TriggerEvent() val e1 = TriggerEvent().usingReferenceId(referenceId)
val e2 = OtherEvent() val e2 = OtherEvent().usingReferenceId(referenceId)
val deleted = object : DeleteEvent(e1.eventId) {} val deleted = object : DeleteEvent(e1.eventId) {}
var receivedHistory: List<Event> = emptyList() var receivedHistory: List<Event> = emptyList()
@ -298,8 +303,8 @@ class EventDispatcherTest : TestBase() {
fun deleteEventShouldBeDeliveredButHistoryEmpty() { fun deleteEventShouldBeDeliveredButHistoryEmpty() {
val dispatcher = EventDispatcher(eventStore) val dispatcher = EventDispatcher(eventStore)
val original = TriggerEvent() val original = TriggerEvent().newReferenceId()
val deleted = object : DeleteEvent(original.eventId) {} val deleted = object : DeleteEvent(original.eventId) {}.apply { newReferenceId() }
var receivedEvent: Event? = null var receivedEvent: Event? = null
var receivedHistory: List<Event> = emptyList() var receivedHistory: List<Event> = emptyList()

View File

@ -39,7 +39,7 @@ class ZDSTest {
fun scenario1() { fun scenario1() {
EventTypeRegistry.register(EchoEvent::class.java) EventTypeRegistry.register(EchoEvent::class.java)
val echo = EchoEvent("hello") val echo = EchoEvent("hello").newReferenceId()
val persisted = echo.toPersisted(id = 1L) val persisted = echo.toPersisted(id = 1L)
val restored = persisted!!.toEvent() val restored = persisted!!.toEvent()

View File

@ -214,7 +214,7 @@ class EventPollerImplementationTest : TestBase() {
} }
} }
val original = EchoEvent("Hello") val original = EchoEvent("Hello").newReferenceId()
eventStore.persist(original) eventStore.persist(original)
poller.pollOnce() poller.pollOnce()

View File

@ -114,7 +114,7 @@ class TaskPollerImplementationTest : TestBase() {
val listener = EchoListener() val listener = EchoListener()
val poller = object : TaskPollerImplementation(taskStore, reporterFactory) {} val poller = object : TaskPollerImplementation(taskStore, reporterFactory) {}
val task = EchoTask("Hello").newReferenceId().derivedOf(object : Event() {}) val task = EchoTask("Hello").newReferenceId().derivedOf(object : Event() {}.apply { newReferenceId() })
taskStore.persist(task) taskStore.persist(task)
poller.pollOnce() poller.pollOnce()