package com.zsElectric.boot.common.util;

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

/**
 * SecurityUtils 测试类
 */
class SecurityUtilsTest {

    @Test
    void testContainsXss() {
        // 测试明显的 XSS 攻击
        assertTrue(SecurityUtils.containsXss("<script>alert('XSS')</script>"));
        assertTrue(SecurityUtils.containsXss("javascript:alert('XSS')"));
        assertTrue(SecurityUtils.containsXss("onerror=alert('XSS')"));
        
        // 测试正常输入不应该被误判
        assertFalse(SecurityUtils.containsXss("username"));
        assertFalse(SecurityUtils.containsXss("select-user"));
        assertFalse(SecurityUtils.containsXss("user selection"));
    }

    @Test
    void testContainsSqlInjection() {
        // 测试宽松模式下的 SQL 注入检测
        SecurityUtils.setSqlStrictMode(false);
        
        // 明显的 SQL 注入应该被检测到
        assertTrue(SecurityUtils.containsSqlInjection("select * from users"));
        assertTrue(SecurityUtils.containsSqlInjection("insert into users"));
        assertTrue(SecurityUtils.containsSqlInjection("delete from users"));
        assertTrue(SecurityUtils.containsSqlInjection("union select"));
        
        // 包含 SQL 关键词但不是攻击的正常输入不应该被误判
        assertFalse(SecurityUtils.containsSqlInjection("username")); // 包含 "select" 的用户名
        assertFalse(SecurityUtils.containsSqlInjection("user selection")); // 包含 "select" 的正常文本
        assertFalse(SecurityUtils.containsSqlInjection("inserted value")); // 包含 "insert" 的正常文本
        assertFalse(SecurityUtils.containsSqlInjection("deleted item")); // 包含 "delete" 的正常文本
        
        // 测试严格模式下的 SQL 注入检测
        SecurityUtils.setSqlStrictMode(true);
        
        // 在严格模式下，即使是正常输入也可能被误判
        // 但我们主要关注的是默认的宽松模式能正常工作
        SecurityUtils.setSqlStrictMode(false);
    }

    @Test
    void testIsSafeInput() {
        // 安全的输入
        assertTrue(SecurityUtils.isSafeInput("normal_username"));
        assertTrue(SecurityUtils.isSafeInput("user123"));
        assertTrue(SecurityUtils.isSafeInput("test@example.com"));
        
        // 不安全的输入
        assertFalse(SecurityUtils.isSafeInput("<script>alert('XSS')</script>"));
        assertFalse(SecurityUtils.isSafeInput("select * from users"));
    }
}
