package com.cf.imes.module.system.util.redis;

import com.cf.imes.framework.common.util.json.JsonUtils;
import com.cf.imes.framework.test.core.ut.BaseRedisUnitTest;
import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

import static com.cf.imes.module.system.dal.redis.RedisKeyConstants.OAUTH2_ACCESS_TOKEN;
import static org.junit.jupiter.api.Assertions.*;

/**
 * {@link SystemRedisUtils} 的单元测试
 * 
 * 使用 BaseRedisUnitTest 基类，利用真实的 Redis 环境进行测试
 */
 class SystemRedisUtilsTest extends BaseRedisUnitTest {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Test
     void testScanAndCompareDeptAndDelTokenWithMatchingDeptId() {
        // 准备测试数据
        Long deptId = 100L;
        
        // 创建OAuth2AccessTokenDO对象
        OAuth2AccessTokenDO token1 = new OAuth2AccessTokenDO();
        token1.setDeptId(100L); // 匹配的部门ID
        
        OAuth2AccessTokenDO token2 = new OAuth2AccessTokenDO();
        token2.setDeptId(200L); // 不匹配的部门ID
        
        // 构造Redis key
        String key1 = String.format(OAUTH2_ACCESS_TOKEN, "token1");
        String key2 = String.format(OAUTH2_ACCESS_TOKEN, "token2");
        
        // 将数据存入Redis
        stringRedisTemplate.opsForValue().set(key1, JsonUtils.toJsonString(token1), 3600, TimeUnit.SECONDS);
        stringRedisTemplate.opsForValue().set(key2, JsonUtils.toJsonString(token2), 3600, TimeUnit.SECONDS);
        
        // 创建SystemRedisUtils实例
        SystemRedisUtils systemRedisUtils = new SystemRedisUtils(stringRedisTemplate);
        
        // 执行方法
        systemRedisUtils.scanAndCompareDeptAndDelToken(deptId);
        
        // 验证匹配的token已被删除
        Boolean hasKey1 = stringRedisTemplate.hasKey(key1);
        Boolean hasKey2 = stringRedisTemplate.hasKey(key2);
        
        assertFalse(hasKey1, "匹配部门ID的token应该被删除");
        assertTrue(hasKey2, "不匹配部门ID的token不应该被删除");
    }

    @Test
     void testScanAndCompareDeptAndDelTokenWithNoMatchingDeptId() {
        // 准备测试数据
        Long deptId = 100L;
        
        // 创建OAuth2AccessTokenDO对象，都不匹配
        OAuth2AccessTokenDO token1 = new OAuth2AccessTokenDO();
        token1.setDeptId(200L);
        
        OAuth2AccessTokenDO token2 = new OAuth2AccessTokenDO();
        token2.setDeptId(300L);
        
        // 构造Redis key
        String key1 = String.format(OAUTH2_ACCESS_TOKEN, "token1");
        String key2 = String.format(OAUTH2_ACCESS_TOKEN, "token2");
        
        // 将数据存入Redis
        stringRedisTemplate.opsForValue().set(key1, JsonUtils.toJsonString(token1), 3600, TimeUnit.SECONDS);
        stringRedisTemplate.opsForValue().set(key2, JsonUtils.toJsonString(token2), 3600, TimeUnit.SECONDS);
        
        // 创建SystemRedisUtils实例
        SystemRedisUtils systemRedisUtils = new SystemRedisUtils(stringRedisTemplate);
        
        // 执行方法
        systemRedisUtils.scanAndCompareDeptAndDelToken(deptId);
        
        // 验证所有token都未被删除
        Boolean hasKey1 = stringRedisTemplate.hasKey(key1);
        Boolean hasKey2 = stringRedisTemplate.hasKey(key2);
        
        assertTrue(hasKey1, "不匹配部门ID的token不应该被删除");
        assertTrue(hasKey2, "不匹配部门ID的token不应该被删除");
    }

    @Test
     void testScanAndCompareDeptAndDelTokenWithEmptyKeys() {
        // 准备测试数据
        Long deptId = 100L;
        
        // 确保Redis中没有任何匹配的key
        // 清理可能存在的相关key
        stringRedisTemplate.getConnectionFactory().getConnection().flushAll();
        
        // 创建SystemRedisUtils实例
        SystemRedisUtils systemRedisUtils = new SystemRedisUtils(stringRedisTemplate);
        
        // 执行方法
        systemRedisUtils.scanAndCompareDeptAndDelToken(deptId);
        
        // 验证没有异常抛出，方法正常执行完毕
        assertTrue(true, "方法应该正常执行完毕，即使没有匹配的key");
    }
}