diff --git a/card-settlement-migration/src/test/java/com/bais/card/settlement/SettlementInvariantVerificationTest.java b/card-settlement-migration/src/test/java/com/bais/card/settlement/SettlementInvariantVerificationTest.java new file mode 100644 index 0000000..1aabfd4 --- /dev/null +++ b/card-settlement-migration/src/test/java/com/bais/card/settlement/SettlementInvariantVerificationTest.java @@ -0,0 +1,75 @@ +package com.bais.card.settlement; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.*; + +/** + * 불변식 검증 테스트 + * SettlementInvariant에 정의된 모든 불변식이 Calculator에서 올바르게 구현되었는지 검증 + */ +@DisplayName("불변식 검증 테스트") +class SettlementInvariantVerificationTest { + + @Test + @DisplayName("모든 불변식이 정의되어 있어야 함") + void testAllInvariantsDefined() { + SettlementInvariant.Invariant[] invariants = SettlementInvariant.getAllInvariants(); + assertNotNull(invariants); + assertEquals(17, invariants.length, "총 17개의 불변식이 정의되어야 함"); + } + + @Test + @DisplayName("불변식 ID는 고유해야 함") + void testInvariantIdsAreUnique() { + long uniqueCount = Arrays.stream(SettlementInvariant.getAllInvariants()) + .map(SettlementInvariant.Invariant::getId) + .distinct() + .count(); + assertEquals(17, uniqueCount, "모든 불변식 ID는 고유해야 함"); + } + + @Test + @DisplayName("주요 불변식 존재 확인") + void testKeyInvariantsExist() { + Set ids = Arrays.stream(SettlementInvariant.getAllInvariants()) + .map(SettlementInvariant.Invariant::getId) + .collect(Collectors.toSet()); + + assertTrue(ids.contains("BRAND_SETTLEMENT_NON_NEGATIVE")); + assertTrue(ids.contains("BRAND_SETTLEMENT_FORMULA")); + assertTrue(ids.contains("BRAND_COMMISSION_FORMULA")); + assertTrue(ids.contains("BRAND_COMMISSION_RATE_DEFAULT")); + assertTrue(ids.contains("IRD_NON_NEGATIVE")); + assertTrue(ids.contains("IRD_FORMULA")); + assertTrue(ids.contains("IRD_RATE_DEFAULT")); + assertTrue(ids.contains("ISSUER_FEE_NON_NEGATIVE")); + assertTrue(ids.contains("ISSUER_FEE_FORMULA")); + assertTrue(ids.contains("ISSUER_FEE_RATE_DEFAULT")); + assertTrue(ids.contains("ISSUER_SETTLEMENT_NON_NEGATIVE")); + assertTrue(ids.contains("ISSUER_SETTLEMENT_FORMULA")); + assertTrue(ids.contains("AMOUNT_NOT_NULL")); + assertTrue(ids.contains("AMOUNT_NON_NEGATIVE")); + assertTrue(ids.contains("AMOUNT_MAX_LIMIT")); + assertTrue(ids.contains("AMOUNT_SCALE")); + assertTrue(ids.contains("ROUNDING_MODE")); + } + + @Test + @DisplayName("불변식 설명과 수식이 비어있지 않아야 함") + void testInvariantMetadataNotEmpty() { + for (SettlementInvariant.Invariant inv : SettlementInvariant.getAllInvariants()) { + assertNotNull(inv.getDescription()); + assertFalse(inv.getDescription().isEmpty()); + assertNotNull(inv.getFormula()); + assertFalse(inv.getFormula().isEmpty()); + assertNotNull(inv.getAffectedClass()); + assertFalse(inv.getAffectedClass().isEmpty()); + assertNotNull(inv.getPreservationNote()); + assertFalse(inv.getPreservationNote().isEmpty()); + } + } +}