package com.dora.service;

import com.dora.config.OssConfig;
import com.dora.util.OssUtil;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;

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

/**
 * OSS服务测试类
 */
@ExtendWith(MockitoExtension.class)
class OssServiceTest {

    @Mock
    private OssConfig ossConfig;

    @InjectMocks
    private OssService ossService;

    @Test
    void testGenerateUniqueFileName() {
        String fileName = "test.jpg";
        Long userId = 123L;
        
        String result = OssUtil.generateUniqueFileName(fileName, userId);
        
        assertNotNull(result);
        assertTrue(result.startsWith("123_"));
        assertTrue(result.endsWith(".jpg"));
        assertTrue(result.contains("_"));
    }

    @Test
    void testIsAllowedFileType() {
        // 测试允许的文件类型
        assertTrue(OssUtil.isAllowedFileType("test.jpg"));
        assertTrue(OssUtil.isAllowedFileType("test.jpeg"));
        assertTrue(OssUtil.isAllowedFileType("test.png"));
        assertTrue(OssUtil.isAllowedFileType("test.gif"));
        assertTrue(OssUtil.isAllowedFileType("test.bmp"));
        assertTrue(OssUtil.isAllowedFileType("test.webp"));
        assertTrue(OssUtil.isAllowedFileType("test.txt"));  // txt文件是被允许的
        assertTrue(OssUtil.isAllowedFileType("test.pdf"));  // pdf文件是被允许的
        assertTrue(OssUtil.isAllowedFileType("test.zip"));  // 压缩包是被允许的
        
        // 测试不允许的文件类型
        assertFalse(OssUtil.isAllowedFileType("test.doc"));  // doc文件不被允许
        assertFalse(OssUtil.isAllowedFileType("test.exe"));  // exe文件不被允许
        assertFalse(OssUtil.isAllowedFileType(""));
        assertFalse(OssUtil.isAllowedFileType(null));
    }

    @Test
    void testFileSizeValidation() {
        // 测试有效的文件大小
        assertTrue(OssUtil.isFileSizeValid(1024)); // 1KB
        assertTrue(OssUtil.isFileSizeValid(10 * 1024 * 1024)); // 10MB
        
        // 测试无效的文件大小
        assertFalse(OssUtil.isFileSizeValid(0));
        assertFalse(OssUtil.isFileSizeValid(-1));
        assertFalse(OssUtil.isFileSizeValid(11 * 1024 * 1024)); // 11MB
    }

    @Test
    void testFormatFileSize() {
        assertEquals("1023 B", OssUtil.formatFileSize(1023));
        assertEquals("1.00 KB", OssUtil.formatFileSize(1024));
        assertEquals("1.00 MB", OssUtil.formatFileSize(1024 * 1024));
        assertEquals("1.00 GB", OssUtil.formatFileSize(1024 * 1024 * 1024));
    }
} 