package com.zioinfo.cms;

import com.zioinfo.cms.common.CryptoUtil;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/** CryptoUtil AES-256-GCM 암복호화 + PII 마스킹 테스트. */
class CryptoUtilTest {

    private final CryptoUtil crypto = new CryptoUtil("test-secret-key-32bytes-minimum-len!!");

    @Test
    void encryptDecrypt_roundTrips() {
        String plain = "user@zioinfo.co.kr";
        String enc = crypto.encrypt(plain);
        assertNotEquals(plain, enc, "암호문은 평문과 달라야 한다");
        assertEquals(plain, crypto.decrypt(enc), "복호화 결과는 원문과 같아야 한다");
    }

    @Test
    void encrypt_isNonDeterministic() {
        String plain = "same-input";
        assertNotEquals(crypto.encrypt(plain), crypto.encrypt(plain),
            "IV 무작위화로 동일 입력도 매번 다른 암호문이어야 한다");
    }

    @Test
    void nullAndEmpty_passThrough() {
        assertNull(crypto.encrypt(null));
        assertEquals("", crypto.encrypt(""));
    }

    @Test
    void decrypt_invalidInput_returnsEmpty() {
        assertEquals("", crypto.decrypt("not-valid-base64-cipher!!!"));
    }

    @Test
    void mask_email_and_phone() {
        assertEquals("us***@zioinfo.co.kr", CryptoUtil.mask("user@zioinfo.co.kr"));
        // 전화: 마지막 4자리만 노출, 앞부분은 마스킹
        String masked = CryptoUtil.mask("01012345678");
        assertTrue(masked.endsWith("5678"), "마지막 4자리는 노출");
        assertTrue(masked.startsWith("*"), "앞부분은 마스킹");
        assertFalse(masked.contains("0101234"), "앞부분 원문 미노출");
    }
}
