diff --git a/src/main/kotlin/no/iktdev/eventi/events/EventDispatcher.kt b/src/main/kotlin/no/iktdev/eventi/events/EventDispatcher.kt index 3f1dfdf..98f7c12 100644 --- a/src/main/kotlin/no/iktdev/eventi/events/EventDispatcher.kt +++ b/src/main/kotlin/no/iktdev/eventi/events/EventDispatcher.kt @@ -8,7 +8,7 @@ import java.util.UUID class EventDispatcher(val eventStore: EventStore) { fun dispatch(referenceId: UUID, events: List) { - val derivedFromIds = events.mapNotNull { it.metadata.derivedFromId }.toSet() + val derivedFromIds = events.mapNotNull { it.metadata.derivedFromId }.flatten().toSet() val deletedEventIds = events.filterIsInstance().map { it.deletedEventId } val candidates = events .filter { it.eventId !in derivedFromIds } diff --git a/src/main/kotlin/no/iktdev/eventi/models/Event.kt b/src/main/kotlin/no/iktdev/eventi/models/Event.kt index 9c8b0da..e605491 100644 --- a/src/main/kotlin/no/iktdev/eventi/models/Event.kt +++ b/src/main/kotlin/no/iktdev/eventi/models/Event.kt @@ -15,12 +15,12 @@ abstract class Event { fun producedFrom(task: Task): Event = self().apply { referenceId = task.referenceId - metadata = Metadata(derivedFromId = task.taskId) + metadata = Metadata().derivedFromEventId(task.taskId) } - fun derivedOf(event: Event) = self().apply { - referenceId = event.referenceId - metadata = Metadata(derivedFromId = event.eventId) + fun derivedOf(vararg event: Event) = self().apply { + referenceId = event.first().referenceId + metadata = Metadata().derivedFromEventId(*event.map { it.eventId }.toTypedArray()) } fun newReferenceId() = self().apply { diff --git a/src/main/kotlin/no/iktdev/eventi/models/Metadata.kt b/src/main/kotlin/no/iktdev/eventi/models/Metadata.kt index 641b096..5c9e8d4 100644 --- a/src/main/kotlin/no/iktdev/eventi/models/Metadata.kt +++ b/src/main/kotlin/no/iktdev/eventi/models/Metadata.kt @@ -3,7 +3,11 @@ package no.iktdev.eventi.models import java.time.LocalDateTime import java.util.UUID -open class Metadata( - val created: LocalDateTime = LocalDateTime.now(), - val derivedFromId: UUID? = null -) {} +class Metadata { + val created: LocalDateTime = LocalDateTime.now() + var derivedFromId: Set? = null + private set + fun derivedFromEventId(vararg id: UUID) = apply { + derivedFromId = id.toSet() + } +} diff --git a/src/main/kotlin/no/iktdev/eventi/models/Task.kt b/src/main/kotlin/no/iktdev/eventi/models/Task.kt index 3357c87..8370407 100644 --- a/src/main/kotlin/no/iktdev/eventi/models/Task.kt +++ b/src/main/kotlin/no/iktdev/eventi/models/Task.kt @@ -20,7 +20,7 @@ abstract class Task { fun derivedOf(event: Event) = self().apply { referenceId = event.referenceId - metadata = Metadata(derivedFromId = event.eventId) + metadata = Metadata().derivedFromEventId(event.eventId) } } diff --git a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt index a9e9018..5e3f8d1 100644 --- a/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt +++ b/src/test/kotlin/no/iktdev/eventi/EventDispatcherTest.kt @@ -9,6 +9,7 @@ import no.iktdev.eventi.events.EventTypeRegistry import no.iktdev.eventi.models.DeleteEvent import no.iktdev.eventi.models.Event import no.iktdev.eventi.testUtil.wipe +import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertNotNull @@ -52,7 +53,8 @@ class EventDispatcherTest: TestBase() { assertNotNull(produced) val event = produced!!.toEvent() - assertEquals(trigger.eventId, event!!.metadata.derivedFromId) + assertThat(event!!.metadata.derivedFromId).hasSize(1) + assertThat(event!!.metadata.derivedFromId).contains(trigger.eventId) assertTrue(event is DerivedEvent) } diff --git a/src/test/kotlin/no/iktdev/eventi/tasks/AbstractTaskPollerTest.kt b/src/test/kotlin/no/iktdev/eventi/tasks/AbstractTaskPollerTest.kt index 815a0f6..e19ca5f 100644 --- a/src/test/kotlin/no/iktdev/eventi/tasks/AbstractTaskPollerTest.kt +++ b/src/test/kotlin/no/iktdev/eventi/tasks/AbstractTaskPollerTest.kt @@ -1,11 +1,13 @@ package no.iktdev.eventi.tasks +import io.mockk.mockk import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest import no.iktdev.eventi.InMemoryTaskStore import no.iktdev.eventi.TestBase +import no.iktdev.eventi.events.EventListener import no.iktdev.eventi.events.EventTypeRegistry import no.iktdev.eventi.models.Event import no.iktdev.eventi.models.Task @@ -58,8 +60,6 @@ class AbstractTaskPollerTest : TestBase() { open class EchoListener : TaskListener(TaskType.MIXED) { var result: Event? = null - override var reporter: TaskReporter? = null - override fun getWorkerId() = this.javaClass.simpleName override fun supports(task: Task): Boolean { @@ -98,7 +98,8 @@ class AbstractTaskPollerTest : TestBase() { advanceUntilIdle() val producedEvent = eventDeferred.await() assertThat(producedEvent).isNotNull - assertThat(producedEvent.metadata.derivedFromId).isEqualTo(task.taskId) + assertThat(producedEvent.metadata.derivedFromId).hasSize(1) + assertThat(producedEvent.metadata.derivedFromId).contains(task.taskId) assertThat((listener.result as EchoEvent).data).isEqualTo("Hello Potetmos") }