package com.pandoli365.bibimbap.util;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

class TagSanitizerTest {

    // --- toSlug ---

    @Test
    void toSlugLowercases() {
        assertThat(TagSanitizer.toSlug("RPG")).isEqualTo("rpg");
    }

    @Test
    void toSlugReplacesSpacesWithHyphen() {
        assertThat(TagSanitizer.toSlug("Open World")).isEqualTo("open-world");
    }

    @Test
    void toSlugTrimsSurroundingWhitespace() {
        assertThat(TagSanitizer.toSlug("  trim me  ")).isEqualTo("trim-me");
    }

    @Test
    void toSlugReturnsEmptyForNull() {
        assertThat(TagSanitizer.toSlug(null)).isEmpty();
    }

    @Test
    void toSlugStripsSpecialChars() {
        assertThat(TagSanitizer.toSlug("rpg!!!")).isEqualTo("rpg");
        assertThat(TagSanitizer.toSlug("tag@#$%")).isEqualTo("tag");
    }

    @Test
    void toSlugStripsXssChars() {
        // <,>,/ 등 화이트리스트 외 문자를 제거하여 <script> 페이로드를 무력화한다.
        assertThat(TagSanitizer.toSlug("a<script>b")).isEqualTo("ascriptb");
    }

    @Test
    void toSlugCollapsesAndTrimsHyphens() {
        assertThat(TagSanitizer.toSlug("--rpg--")).isEqualTo("rpg");
        assertThat(TagSanitizer.toSlug("a---b")).isEqualTo("a-b");
    }

    @Test
    void toSlugPreservesKorean() {
        assertThat(TagSanitizer.toSlug("액션")).isEqualTo("액션");
        assertThat(TagSanitizer.toSlug("로그 라이크")).isEqualTo("로그-라이크");
    }

    // --- isAllowed: 길이 경계 ---

    @Test
    void isAllowedRejectsTooShort() {
        assertThat(TagSanitizer.isAllowed("a")).isFalse();
    }

    @Test
    void isAllowedAcceptsMinLength() {
        assertThat(TagSanitizer.isAllowed("액션")).isTrue();
    }

    @Test
    void isAllowedAcceptsMaxLength() {
        assertThat(TagSanitizer.isAllowed("a".repeat(20))).isTrue();
    }

    @Test
    void isAllowedRejectsTooLong() {
        assertThat(TagSanitizer.isAllowed("a".repeat(21))).isFalse();
    }

    // --- isAllowed: 화이트리스트 거부 ---

    @Test
    void isAllowedRejectsWhitespace() {
        assertThat(TagSanitizer.isAllowed("rpg game")).isFalse();
    }

    @Test
    void isAllowedRejectsSpecialChars() {
        assertThat(TagSanitizer.isAllowed("rpg!")).isFalse();
    }

    // --- isAllowed: 금칙어 매치 ---

    @Test
    void isAllowedRejectsBannedWord() {
        // banned-words.txt 시드의 영문/한글 금칙어를 toSlug 후 isAllowed 가 거부한다.
        assertThat(TagSanitizer.isAllowed(TagSanitizer.toSlug("fuck"))).isFalse();
        assertThat(TagSanitizer.isAllowed(TagSanitizer.toSlug("시발"))).isFalse();
    }

    // --- isAllowed: 정상 통과 ---

    @Test
    void isAllowedAcceptsNormalSlug() {
        assertThat(TagSanitizer.isAllowed(TagSanitizer.toSlug("RPG"))).isTrue();
        assertThat(TagSanitizer.isAllowed(TagSanitizer.toSlug("호러"))).isTrue();
        assertThat(TagSanitizer.isAllowed(TagSanitizer.toSlug("퍼즐"))).isTrue();
    }
}
