package com.eactive.eai.common.security.keyderiv;

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

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class DerivedKeyTest {

    @Test
    @DisplayName("1-1. encKey/decKey 모두 지정 — 각각 독립적으로 반환")
    void testBothKeysProvided() {
        byte[] encKey = {1, 2, 3};
        byte[] decKey = {4, 5, 6};
        DerivedKey dk = new DerivedKey(encKey, decKey);

        assertArrayEquals(encKey, dk.getEncKey());
        assertArrayEquals(decKey, dk.getDecKey());
    }

    @Test
    @DisplayName("1-2. decKey null — encKey로 대체")
    void testNullDecKey_fallsBackToEncKey() {
        byte[] encKey = {1, 2, 3};
        DerivedKey dk = new DerivedKey(encKey, null);

        assertArrayEquals(encKey, dk.getEncKey());
        assertArrayEquals(encKey, dk.getDecKey(), "decKey가 null이면 encKey와 동일해야 한다");
    }

    @Test
    @DisplayName("1-3. 대칭 알고리즘 — encKey == decKey 동일 참조 허용")
    void testSymmetricKey_sameReference() {
        byte[] key = {0x10, 0x20, 0x30};
        DerivedKey dk = new DerivedKey(key, key);

        assertSame(dk.getEncKey(), dk.getDecKey());
    }

    @Test
    @DisplayName("1-4. 2-arg 생성자 — iv는 null")
    void testTwoArgConstructor_ivIsNull() {
        DerivedKey dk = new DerivedKey(new byte[]{1}, new byte[]{2});

        assertNull(dk.getIv(), "2-arg 생성자로 생성 시 iv는 null이어야 한다");
    }

    @Test
    @DisplayName("1-5. 3-arg 생성자 — iv 반환")
    void testThreeArgConstructor_ivReturned() {
        byte[] iv = {0x01, 0x02, 0x03};
        DerivedKey dk = new DerivedKey(new byte[]{1}, new byte[]{2}, iv);

        assertArrayEquals(iv, dk.getIv());
    }

    @Test
    @DisplayName("1-6. 3-arg 생성자 — iv null 허용")
    void testThreeArgConstructor_nullIv() {
        DerivedKey dk = new DerivedKey(new byte[]{1}, new byte[]{2}, null);

        assertNull(dk.getIv());
    }
}
