package com.yau.digitalrmb.institutionidentity; import com.yau.digitalrmb.institutionidentity.domain.CurrencyGenerationVerification; import org.junit.jupiter.api.Test; import java.math.BigDecimal; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; class CurrencyGenerationVerificationDomainTest { @Test void completesAllStepThreeStatesInOrder() { CurrencyGenerationVerification value = value(); assertThat(value.getStatus()).isEqualTo(CurrencyGenerationVerification.Status.RECEIVED); value.verifySignature(true); value.verifyDigest("A123456789012345678901234567890123456789012345678901234567890123", true); value.verifyQuota(new BigDecimal("500000000.00"), new BigDecimal("495000000.00"), new BigDecimal("5000000.00")); value.confirm("CENTRAL_FIRST_SM2_KEY", "3044AABB", "20260804210000", "{confirmed:true}"); value.returnResponse(); assertThat(value.getStatus()).isEqualTo(CurrencyGenerationVerification.Status.RESPONSE_RETURNED); assertThat(value.getSignatureValid()).isTrue(); assertThat(value.getDigestMatches()).isTrue(); assertThat(value.getQuotaSufficient()).isTrue(); } @Test void rejectsSkippedAndRepeatedOperations() { CurrencyGenerationVerification value = value(); assertThatThrownBy(() -> value.verifyDigest( "A123456789012345678901234567890123456789012345678901234567890123", true)) .isInstanceOf(IllegalStateException.class); value.verifySignature(true); assertThatThrownBy(() -> value.verifySignature(true)).isInstanceOf(IllegalStateException.class); } @Test void rejectsInvalidSignatureDigestAndInsufficientQuotaWithoutAdvancing() { CurrencyGenerationVerification value = value(); assertThatThrownBy(() -> value.verifySignature(false)).isInstanceOf(IllegalArgumentException.class); assertThat(value.getStatus()).isEqualTo(CurrencyGenerationVerification.Status.RECEIVED); value.verifySignature(true); assertThatThrownBy(() -> value.verifyDigest("BAD", false)).isInstanceOf(IllegalArgumentException.class); assertThat(value.getStatus()).isEqualTo(CurrencyGenerationVerification.Status.SIGNATURE_VERIFIED); value.verifyDigest("A123456789012345678901234567890123456789012345678901234567890123", true); assertThatThrownBy(() -> value.verifyQuota(new BigDecimal("500000000.00"), new BigDecimal("499999999.00"), new BigDecimal("1.00"))) .isInstanceOf(IllegalArgumentException.class); assertThat(value.getStatus()).isEqualTo(CurrencyGenerationVerification.Status.DIGEST_VERIFIED); } private CurrencyGenerationVerification value() { return CurrencyGenerationVerification.receive(1L, "message", "ORG_123456789ABC|1598.85|SYS_DC_002|20260804210000", "A123456789012345678901234567890123456789012345678901234567890123", "3044AABB", "BANK_SECOND_SM2_KEY", new BigDecimal("1598.85")); } }