feat(journal): core:journal module — decision journal projection

This commit is contained in:
2026-06-04 00:35:11 +04:00
parent 371e0df340
commit c21bbda85f
11 changed files with 193 additions and 0 deletions
+1
View File
@@ -13,5 +13,6 @@ dependencies {
testImplementation(project(":core:kernel"))
testImplementation(project(":core:artifacts"))
testImplementation(project(":core:router"))
testImplementation(project(":core:journal"))
implementation(project(":testing:fixtures"))
}
@@ -0,0 +1,47 @@
import com.correx.core.events.events.SteeringNoteAddedEvent
import com.correx.core.events.events.TransitionExecutedEvent
import com.correx.core.events.types.SessionId
import com.correx.core.events.types.StageId
import com.correx.core.events.types.TransitionId
import com.correx.core.journal.DecisionJournalProjector
import com.correx.core.journal.DefaultDecisionJournalReducer
import com.correx.core.journal.model.DecisionKind
import com.correx.testing.fixtures.EventFixtures.stored
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class DecisionJournalProjectorTest {
private val projector = DecisionJournalProjector(DefaultDecisionJournalReducer())
@Test
fun `steering and transition each produce one ordered record`() {
var s = projector.initial()
s = projector.apply(
s,
stored(
payload = SteeringNoteAddedEvent(SessionId("x"), "use jwt", StageId("plan")),
sequence = 1L,
),
)
s = projector.apply(
s,
stored(
payload = TransitionExecutedEvent(SessionId("x"), StageId("plan"), StageId("impl"), TransitionId("t1")),
sequence = 2L,
),
)
assertEquals(2, s.records.size)
assertEquals(DecisionKind.STEERING, s.records[0].kind)
assertEquals(DecisionKind.TRANSITION, s.records[1].kind)
}
@Test
fun `unrelated events are ignored`() {
val s0 = projector.initial()
val s1 = projector.apply(
s0,
stored(payload = SteeringNoteAddedEvent(SessionId("x"), "note")),
)
assertEquals(1, s1.records.size)
}
}