Files
SuperBizAgent-java/src/test/java/com/superbiz/agent/config/HarnessChatConfigurationTest.java
T

92 lines
4.9 KiB
Java

package com.superbiz.agent.config;
import com.superbiz.agent.harness.core.DiagnosisHarnessCore;
import com.superbiz.agent.harness.application.persistence.ChatRunStore;
import com.superbiz.agent.harness.tool.contract.MysqlToolRequest;
import com.superbiz.agent.harness.tool.mysql.MysqlSqlValidator;
import com.superbiz.agent.harness.tool.mysql.MysqlSecurityException;
import com.superbiz.agent.tool.LookupKnowledgeTool;
import com.superbiz.agent.tool.RetrievedDocTracker;
import com.superbiz.agent.service.KnowledgeContextPacker;
import com.superbiz.agent.service.KnowledgeDocumentRetriever;
import com.superbiz.agent.service.KnowledgeEvidencePostProcessor;
import com.superbiz.agent.service.KnowledgeQueryTransformer;
import com.superbiz.agent.service.LookupResultAssembler;
import com.superbiz.agent.service.ToolInvocationRecorder;
import com.superbiz.agent.repository.AgentStepRepository;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.data.redis.core.RedisTemplate;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.util.Map;
import java.util.concurrent.ThreadPoolExecutor;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.mock;
class HarnessChatConfigurationTest {
@Test
void defaultsArePositiveAndExecutorsAreBounded() {
ChatHarnessProperties properties = new ChatHarnessProperties();
properties.validate();
HarnessChatConfiguration configuration = new HarnessChatConfiguration();
ThreadPoolExecutor worker = configuration.chatWorkerExecutor(properties);
ThreadPoolExecutor model = configuration.harnessModelExecutor(properties);
try {
assertTrue(worker.getQueue().remainingCapacity() > 0);
assertTrue(model.getQueue().remainingCapacity() > 0);
assertEquals(properties.getWorkerMaxPoolSize(), worker.getMaximumPoolSize());
assertEquals(properties.getModelMaxPoolSize(), model.getMaximumPoolSize());
} finally {
worker.shutdownNow();
model.shutdownNow();
}
}
@Test
void emptyMysqlConfigurationFailsClosedWithoutApplicationDatasource() {
MysqlToolProperties properties = new MysqlToolProperties();
HarnessChatConfiguration configuration = new HarnessChatConfiguration();
assertTrue(configuration.harnessMysqlDataSources(properties).isEmpty());
Map<String, com.superbiz.agent.harness.tool.mysql.MysqlDataSourceDefinition> definitions =
configuration.harnessMysqlDefinitions(properties);
MysqlSqlValidator validator = configuration.mysqlSqlValidator(definitions);
assertThrows(MysqlSecurityException.class, () -> validator.validate(
new MysqlToolRequest("application", "SELECT id FROM users", java.util.List.of())));
}
@Test
void harnessConfigurationBuildsOneApplicationGraphWithControlledDependencies() {
new ApplicationContextRunner()
.withUserConfiguration(HarnessChatConfiguration.class)
.withBean(ObjectMapper.class, ObjectMapper::new)
.withBean(ChatModel.class, () -> mock(ChatModel.class))
.withBean(RedisTemplate.class, () -> mock(RedisTemplate.class))
.withBean(LookupKnowledgeTool.class, () -> mock(LookupKnowledgeTool.class))
.withBean(KnowledgeQueryTransformer.class, () -> mock(KnowledgeQueryTransformer.class))
.withBean(KnowledgeDocumentRetriever.class, () -> mock(KnowledgeDocumentRetriever.class))
.withBean(KnowledgeEvidencePostProcessor.class, () -> mock(KnowledgeEvidencePostProcessor.class))
.withBean(KnowledgeContextPacker.class, () -> mock(KnowledgeContextPacker.class))
.withBean(LookupResultAssembler.class, () -> mock(LookupResultAssembler.class))
.withBean(ToolInvocationRecorder.class, () -> mock(ToolInvocationRecorder.class))
.withBean(RetrievedDocTracker.class, () -> mock(RetrievedDocTracker.class))
.withBean(AgentStepRepository.class, () -> mock(AgentStepRepository.class))
.withBean(ChatRunStore.class, () -> mock(ChatRunStore.class))
.withBean(MysqlToolProperties.class, MysqlToolProperties::new)
.run(context -> {
assertTrue(context.isRunning());
assertEquals(1, context.getBeansOfType(
com.superbiz.agent.harness.application.ChatApplicationUseCase.class).size());
assertTrue(context.containsBean("harnessModelExecutor"));
assertTrue(context.containsBean("chatWorkerExecutor"));
});
}
}