feat(ingress): 实现 JDBC 信箱轮询、入站持久化与对拍测试 (U05)

This commit is contained in:
windyboy
2026-09-07 15:11:33 +08:00
parent dc68f1e1f8
commit c7b4b527ef
51 changed files with 1005 additions and 235 deletions
@@ -0,0 +1,45 @@
package com.gzzn.omms.msgexchange.ingress
import com.gzzn.omms.msgexchange.domain.ProcStatus
import com.gzzn.omms.msgexchange.infra.stub.StubInbox
import com.gzzn.omms.msgexchange.infra.stub.StubProcState
import com.gzzn.omms.msgexchange.processing.Pump
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
import jakarta.inject.Inject
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
/** 主路径:JDBC 轮询语义(stub 下 InboxPoller + 外部写信箱模拟)。 */
@MicronautTest
class InboxPollerTest {
@Inject lateinit var poller: InboxPoller
@Inject lateinit var pump: Pump
@Inject lateinit var stubInbox: StubInbox
@Inject lateinit var stubProc: StubProcState
@BeforeEach
fun clean() {
stubInbox.clear()
stubProc.clear()
}
@Test
fun `poller enqueues externally written mailbox rows`() {
val id = stubInbox.simulateExternalWrite("<MSG/>")
assertEquals(1, poller.pollOnce())
assertNotNull(stubProc.snapshotOf(id))
assertEquals(ProcStatus.PENDING, stubProc.snapshotOf(id)!!.state)
}
@Test
fun `poller is idempotent for already enqueued rows`() {
val id = stubInbox.simulateExternalWrite("<MSG/>")
poller.pollOnce()
assertEquals(0, poller.pollOnce())
pump.tick()
assertEquals(ProcStatus.FAILED, stubProc.snapshotOf(id)!!.state)
}
}