package com.superbiz.agent.service.session; import com.superbiz.agent.domain.model.SessionContext; import com.superbiz.agent.domain.model.ToolCall; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; /** * RedisSessionManager 单元测试 */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE) @EnabledIfEnvironmentVariable(named = "SUPERBIZ_REDIS_PASSWORD", matches = ".+") @TestPropertySource(properties = { "spring.data.redis.host=${SUPERBIZ_REDIS_HOST:119.29.78.52}", "spring.data.redis.port=${SUPERBIZ_REDIS_PORT:33308}", "spring.data.redis.password=${SUPERBIZ_REDIS_PASSWORD}" }) class RedisSessionManagerTest { @Autowired private SessionManager sessionManager; private String testSessionId; @BeforeEach void setUp() { testSessionId = "test-session-" + UUID.randomUUID().toString(); } @Test void testCreateAndGetSession() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-123") .businessId("order-456") .traceId("trace-789") .build(); String sessionId = sessionManager.createSession(context, 300); // 5分钟 assertNotNull(sessionId); assertEquals(testSessionId, sessionId); System.out.println("✓ 创建会话成功: " + sessionId); // 获取会话 Optional retrieved = sessionManager.getSession(testSessionId); assertTrue(retrieved.isPresent()); assertEquals("user-123", retrieved.get().getUserId()); assertEquals("ACTIVE", retrieved.get().getStatus()); assertNotNull(retrieved.get().getCreatedAt()); System.out.println("✓ 获取会话成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testUpdateSession() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-update") .status("ACTIVE") .build(); sessionManager.createSession(context, 300); // 获取并更新 Optional retrieved = sessionManager.getSession(testSessionId); assertTrue(retrieved.isPresent()); SessionContext toUpdate = retrieved.get(); toUpdate.setStatus("COMPLETED"); toUpdate.setBusinessId("updated-business-id"); sessionManager.updateSession(toUpdate); // 验证更新 Optional updated = sessionManager.getSession(testSessionId); assertTrue(updated.isPresent()); assertEquals("COMPLETED", updated.get().getStatus()); assertEquals("updated-business-id", updated.get().getBusinessId()); System.out.println("✓ 更新会话成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testDeleteSession() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-delete") .build(); sessionManager.createSession(context, 300); assertTrue(sessionManager.exists(testSessionId)); // 删除会话 sessionManager.deleteSession(testSessionId); assertFalse(sessionManager.exists(testSessionId)); System.out.println("✓ 删除会话成功"); } @Test void testExists() { assertFalse(sessionManager.exists(testSessionId)); SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-exists") .build(); sessionManager.createSession(context, 300); assertTrue(sessionManager.exists(testSessionId)); System.out.println("✓ 会话存在性检查成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testRefreshSession() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-refresh") .build(); sessionManager.createSession(context, 60); // 1分钟 // 刷新过期时间 boolean refreshed = sessionManager.refreshSession(testSessionId, 600); // 延长到10分钟 assertTrue(refreshed); assertTrue(sessionManager.exists(testSessionId)); System.out.println("✓ 刷新会话过期时间成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testAddToolCall() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-toolcall") .build(); sessionManager.createSession(context, 300); // 添加工具调用记录 Map args = new HashMap<>(); args.put("query", "test query"); args.put("limit", 10); ToolCall toolCall = ToolCall.builder() .toolName("search_documents") .arguments(args) .result("found 5 documents") .status("SUCCESS") .duration(150L) .calledAt(LocalDateTime.now()) .build(); sessionManager.addToolCall(testSessionId, toolCall); // 验证工具调用已添加 Optional retrieved = sessionManager.getSession(testSessionId); assertTrue(retrieved.isPresent()); assertFalse(retrieved.get().getToolCalls().isEmpty()); assertEquals(1, retrieved.get().getToolCalls().size()); assertEquals("search_documents", retrieved.get().getToolCalls().get(0).getToolName()); System.out.println("✓ 添加工具调用记录成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testUpdateStatus() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-status") .status("ACTIVE") .build(); sessionManager.createSession(context, 300); // 更新状态 sessionManager.updateStatus(testSessionId, "COMPLETED"); // 验证状态已更新 Optional retrieved = sessionManager.getSession(testSessionId); assertTrue(retrieved.isPresent()); assertEquals("COMPLETED", retrieved.get().getStatus()); System.out.println("✓ 更新会话状态成功"); // 清理 sessionManager.deleteSession(testSessionId); } @Test void testMultipleToolCalls() { // 创建会话 SessionContext context = SessionContext.builder() .sessionId(testSessionId) .userId("user-multi-tools") .build(); sessionManager.createSession(context, 300); // 添加多个工具调用 for (int i = 0; i < 3; i++) { ToolCall toolCall = ToolCall.builder() .toolName("tool_" + i) .status("SUCCESS") .calledAt(LocalDateTime.now()) .build(); sessionManager.addToolCall(testSessionId, toolCall); } // 验证所有工具调用 Optional retrieved = sessionManager.getSession(testSessionId); assertTrue(retrieved.isPresent()); assertEquals(3, retrieved.get().getToolCalls().size()); System.out.println("✓ 添加多个工具调用记录成功"); // 清理 sessionManager.deleteSession(testSessionId); } }