package com.gxwebsoft.shop;

import com.gxwebsoft.common.core.utils.WechatPayUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.nio.charset.StandardCharsets;

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

/**
 * 微信支付商品描述字段测试
 * 验证字节长度限制处理
 */
@SpringBootTest
public class WechatPayDescriptionTest {

    @Test
    public void testTruncateToByteLimit() {
        // 测试正常情况 - 字符串长度在限制内
        String shortText = "正常商品描述";
        String result1 = WechatPayUtils.truncateToByteLimit(shortText, 127);
        assertEquals(shortText, result1);
        assertTrue(result1.getBytes(StandardCharsets.UTF_8).length <= 127);

        // 测试超长中文字符串
        String longText = "【湾区认证】【百千万工程帮扶产品 通过远方320项检测 湾区认证 丰江桥佛手瓜面】独特风味低脂轻食便捷速食非油炸 720g/袋";
        String result2 = WechatPayUtils.truncateToByteLimit(longText, 127);
        assertNotNull(result2);
        assertTrue(result2.getBytes(StandardCharsets.UTF_8).length <= 127);
        System.out.println("原始文本字节数: " + longText.getBytes(StandardCharsets.UTF_8).length);
        System.out.println("截断后文本: " + result2);
        System.out.println("截断后字节数: " + result2.getBytes(StandardCharsets.UTF_8).length);

        // 测试null和空字符串
        assertNull(WechatPayUtils.truncateToByteLimit(null, 127));
        assertEquals("", WechatPayUtils.truncateToByteLimit("", 127));

        // 测试英文字符串
        String englishText = "This is a very long English description that might exceed the byte limit for WeChat Pay description field";
        String result3 = WechatPayUtils.truncateToByteLimit(englishText, 127);
        assertNotNull(result3);
        assertTrue(result3.getBytes(StandardCharsets.UTF_8).length <= 127);

        // 测试混合字符串
        String mixedText = "Product Name 产品名称 with special characters @#$%^&*()";
        String result4 = WechatPayUtils.truncateToByteLimit(mixedText, 50);
        assertNotNull(result4);
        assertTrue(result4.getBytes(StandardCharsets.UTF_8).length <= 50);
    }

    @Test
    public void testSpecificErrorCase() {
        // 测试错误信息中的具体案例
        String errorText = "【湾区认证】【百千万工程帮扶产品 通过远方320项检测 湾区认证 丰江桥佛手瓜面】独特风味低脂轻食便捷速食非油炸 720g/袋";

        // 验证原始文本确实超过127字节
        int originalBytes = errorText.getBytes(StandardCharsets.UTF_8).length;
        System.out.println("原始文本: " + errorText);
        System.out.println("原始字节数: " + originalBytes);
        assertTrue(originalBytes > 127, "原始文本应该超过127字节");

        // 测试截断
        String truncated = WechatPayUtils.processDescription(errorText);
        int truncatedBytes = truncated.getBytes(StandardCharsets.UTF_8).length;

        System.out.println("截断后文本: " + truncated);
        System.out.println("截断后字节数: " + truncatedBytes);

        // 验证截断后的文本符合要求
        assertNotNull(truncated);
        assertTrue(truncatedBytes <= 127, "截断后字节数应该不超过127");
        assertFalse(truncated.contains("\uFFFD"), "截断后的文本不应包含无效字符");
    }
}
