From f698e8e6b1dcd0703cc2b134c5d0c2f4dd09f4b5 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Thu, 13 Aug 2026 05:16:59 +0900 Subject: [PATCH] test(cdc): replay target capability RED on live develop --- .../cdc/spi/CdcTargetCapabilityTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 cdc-service/src/test/java/com/xtrmetl/cdc/spi/CdcTargetCapabilityTest.java diff --git a/cdc-service/src/test/java/com/xtrmetl/cdc/spi/CdcTargetCapabilityTest.java b/cdc-service/src/test/java/com/xtrmetl/cdc/spi/CdcTargetCapabilityTest.java new file mode 100644 index 00000000..86c379d6 --- /dev/null +++ b/cdc-service/src/test/java/com/xtrmetl/cdc/spi/CdcTargetCapabilityTest.java @@ -0,0 +1,51 @@ +package com.xtrmetl.cdc.spi; + +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Method; +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +/** + * Fail-first contract for truthful CDC target execution metadata. + * + *

The production target registry currently exposes live Kafka and JDBC-replica product paths + * through connector objects whose canonical {@code write(...)} SPI is intentionally unwired. This + * contract requires machine-readable capability metadata so discovery can distinguish the shipped + * product path from canonical-write execution authority.

+ */ +class CdcTargetCapabilityTest { + + @Test + void liveTargetsDiscloseTheirActualExecutionBoundary() throws Exception { + Method capabilitiesMethod = Arrays.stream(CdcTargetConnector.class.getMethods()) + .filter(method -> method.getName().equals("capabilities")) + .findFirst() + .orElse(null); + + assertTrue(capabilitiesMethod != null, + "CDC target SPI must expose capabilities instead of overloading scaffoldOnly"); + + assertCapabilities( + capabilitiesMethod.invoke(new KafkaCdcTargetConnector()), + "RAW_DEBEZIUM_KAFKA" + ); + assertCapabilities( + capabilitiesMethod.invoke(new JdbcReplicaCdcTargetConnector()), + "PROCESSED_DATA_JDBC_REPLICA" + ); + } + + private static void assertCapabilities(Object capabilities, String expectedDeliveryMode) throws Exception { + Method productPathLive = capabilities.getClass().getMethod("productPathLive"); + Method canonicalWriteSupported = capabilities.getClass().getMethod("canonicalWriteSupported"); + Method deliveryMode = capabilities.getClass().getMethod("deliveryMode"); + + assertTrue((Boolean) productPathLive.invoke(capabilities)); + assertFalse((Boolean) canonicalWriteSupported.invoke(capabilities)); + assertEquals(expectedDeliveryMode, ((Enum) deliveryMode.invoke(capabilities)).name()); + } +}