package com.superbiz.agent.eval; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.superbiz.agent.Main; import com.superbiz.agent.dto.LookupResult; import com.superbiz.agent.tool.LookupKnowledgeTool; import com.superbiz.agent.util.SessionContextHolder; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfSystemProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; import static org.junit.jupiter.api.Assertions.assertTrue; /** * Generates RAG retrieval fixtures from the real LookupKnowledgeTool bean. * *

This class is disabled by default because it writes repository files and * depends on the configured runtime retrieval stack.

*/ @SpringBootTest( classes = Main.class, webEnvironment = SpringBootTest.WebEnvironment.NONE, properties = "spring.main.web-application-type=none" ) @EnabledIfSystemProperty(named = "rag.snapshot.enabled", matches = "true") class RagLookupSnapshotGeneratorTest { private static final Path DEFAULT_CASES = Path.of("eval/rag-retrieval/cases/golden-cases.json"); private static final Path DEFAULT_FIXTURES = Path.of("eval/rag-retrieval/fixtures"); @Autowired private LookupKnowledgeTool lookupKnowledgeTool; @Autowired private ObjectMapper objectMapper; @Test void generateLookupResultFixtures() throws Exception { Path casesPath = Path.of(System.getProperty("rag.snapshot.cases", DEFAULT_CASES.toString())); Path fixturesDir = Path.of(System.getProperty("rag.snapshot.fixtures", DEFAULT_FIXTURES.toString())); String retrievedAt = System.getProperty("rag.snapshot.retrievedAt", Instant.now().toString()); JsonNode root = objectMapper.readTree(casesPath.toFile()); JsonNode cases = root.path("cases"); assertTrue(cases.isArray(), "golden cases file must contain a cases array"); Files.createDirectories(fixturesDir); for (JsonNode testCase : cases) { String caseId = requiredText(testCase, "caseId"); String query = requiredText(testCase, "query"); SessionContextHolder.clear(); LookupResult lookupResult; try { lookupResult = lookupKnowledgeTool.lookupKnowledge(query); } finally { SessionContextHolder.clear(); } ObjectNode fixture = objectMapper.createObjectNode(); fixture.put("caseId", caseId); fixture.put("query", query); fixture.put("retrievedAt", retrievedAt); fixture.set("lookupResult", objectMapper.valueToTree(lookupResult)); Path output = fixturesDir.resolve(caseId + ".json"); objectMapper.writerWithDefaultPrettyPrinter().writeValue(output.toFile(), fixture); } } private String requiredText(JsonNode node, String fieldName) { JsonNode value = node.get(fieldName); if (value == null || value.asText().isBlank()) { throw new IllegalArgumentException("golden case is missing required field: " + fieldName); } return value.asText(); } }