package com.zioinfo.kintex.webhook;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

/**
 * F099 인바운드 웹훅 HMAC-SHA256 서명 서명/검증 단위테스트.
 */
class WebhookSignatureTest {

    private final WebhookSignature sig = new WebhookSignature();

    @Test
    void signThenVerifyRoundTrips() {
        String secret = "whsec_kintex_test_1234567890";
        String body = "{\"type\":\"lead.hot\",\"leadId\":\"ld-1\"}";
        String signed = sig.sign(secret, body);
        assertTrue(sig.verify(secret, body, signed), "정상 서명 검증 통과");
        assertTrue(sig.verify(secret, body, "sha256=" + signed), "sha256= 접두어 허용");
        assertTrue(sig.verify(secret, body, signed.toUpperCase()), "대문자 hex 허용");
    }

    @Test
    void rejectsTamperedBody() {
        String secret = "whsec_kintex_test_1234567890";
        String signed = sig.sign(secret, "{\"amount\":100}");
        assertFalse(sig.verify(secret, "{\"amount\":999}", signed), "본문 변조 서명 거부");
    }

    @Test
    void rejectsWrongSecret() {
        String body = "{\"type\":\"invoice.paid\"}";
        String signed = sig.sign("real-secret", body);
        assertFalse(sig.verify("attacker-secret", body, signed), "다른 시크릿 거부");
    }

    @Test
    void rejectsBlankOrNull() {
        assertFalse(sig.verify(null, "b", "s"));
        assertFalse(sig.verify("s", "b", null));
        assertFalse(sig.verify("s", "b", ""));
        assertFalse(sig.verify("", "b", "s"));
    }

    @Test
    void hashSecretIsDeterministicAndNotPlaintext() {
        String h1 = sig.hashSecret("my-secret");
        String h2 = sig.hashSecret("my-secret");
        assertEquals(h1, h2, "동일 입력 동일 해시");
        assertEquals(64, h1.length(), "SHA-256 hex 64자");
        assertNotEquals("my-secret", h1, "저장값은 평문과 다름");
    }
}
