test(integration): JDBC 集成测试 Testcontainers 兜底 + 全结构回环矩阵 (ACM2-29 P3-A)

- PgTestSupport 三级解析:MSGX_PG_* 显式环境变量 → Testcontainers 自动起
  postgres:17-alpine 隔离容器(JVM 单例复用,docker 不可用才跳过)→ assumeTrue
  绝不误报通过;解决了「本机端口被占/无库则集成测试静默跳过」的验收假绿问题
- loadCollections 只输出非空属性(缺失键语义),write→read 线格式一致
- 新增 readAfterWrite 矩阵用例:16 类结构(多行/重复资源号/非连续源序号/异常
  前缀列/文本旁列)persist → findNextStateByFlid 深度等值 + wire(nextState) ==
  wire(readAfterWrite) 双断言(评审 F5 持久化侧+线格式侧闭环)

验证:MSGX_PG_PORT=5433 外接库 108 用例全绿;无环境变量 Testcontainers
自动容器路径 18/18 全绿
This commit is contained in:
windyboy
2026-09-08 16:00:26 +08:00
parent 06a1081bdd
commit 35c91c67b9
4 changed files with 113 additions and 18 deletions
@@ -136,9 +136,11 @@ internal object FlightDetailTables {
"SELECT * FROM ${spec.table} WHERE flid = ? ORDER BY ordinal ASC",
{ ps -> ps.setString(1, flid) },
) { rs ->
spec.columns.associate { (attr, col) -> attr to rs.getString(col) }.toMutableMap().apply {
put(spec.seqAttr, rs.getString("source_seq"))
}
// 只输出非空属性(缺失键语义),保证 write→read 线格式一致(评审 F5)
spec.columns.associate { (attr, col) -> attr to rs.getString(col) }
.filterValues { it != null }
.toMutableMap()
.apply { rs.getString("source_seq")?.let { put(spec.seqAttr, it) } }
}
if (rows.isNotEmpty()) {
out[spec.collectionKey] = mapper.writeValueAsString(rows)
@@ -149,12 +151,12 @@ internal object FlightDetailTables {
"SELECT source_seq, apcd, scat, scdt FROM flight_route_point WHERE flid = ? AND route_kind = ? ORDER BY ordinal ASC",
{ ps -> ps.setString(1, flid); ps.setString(2, kind) },
) { rs ->
mapOf(
"RTNO" to rs.getString("source_seq"),
"APCD" to rs.getString("apcd"),
"SCAT" to rs.getString("scat"),
"SCDT" to rs.getString("scdt"),
)
buildMap {
rs.getString("source_seq")?.let { put("RTNO", it) }
rs.getString("apcd")?.let { put("APCD", it) }
rs.getString("scat")?.let { put("SCAT", it) }
rs.getString("scdt")?.let { put("SCDT", it) }
}
}
if (rows.isNotEmpty()) {
out[key] = mapper.writeValueAsString(rows)