Volver al índice

src/main/java/ar/com/companeros/runtime/AgentConfigTests.java

package ar.com.companeros.runtime;

import ar.com.companeros.Companeros;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;
import net.minecraft.gametest.framework.GameTest;
import net.minecraft.gametest.framework.GameTestHelper;
import net.minecraft.world.level.storage.LevelResource;
import net.minecraftforge.gametest.GameTestHolder;
import net.minecraftforge.gametest.PrefixGameTestTemplate;

/** Archivos temporales dentro del mundo aislado de GameTest; sin acceder al entorno o a claves. */
@GameTestHolder(Companeros.ID)
@PrefixGameTestTemplate(false)
public final class AgentConfigTests {
    @GameTest(template = "empty")
    public void defaultConfigAndPopulationPersistWithoutCredentials(GameTestHelper helper) throws IOException {
        Path directory = testDirectory(helper);
        try {
            AgentConfig config = AgentConfig.load(directory);
            helper.assertTrue(config.populationLimit() == 2 && config.autoConnect()
                && !config.decisionConfig().enabled() && !config.decisionConfig().foundationVerified()
                && !config.decisionConfig().solEnabled() && config.decisionConfig().maxSessionUsd().signum() == 0,
                "Defaults permiten dos sesiones y mantienen proveedores desactivados y sin presupuesto");
            helper.assertTrue(!config.webEnabled() && Files.exists(directory.resolve("raps/research.json")),
                "Investigación web se crea desactivada");
            AgentInstructions.load(directory.resolve("raps"));
            Files.writeString(directory.resolve("raps/agents.md"), "Priorizar comida y colaborar con cautela", StandardCharsets.UTF_8);
            helper.assertTrue(AgentInstructions.load(directory.resolve("raps")).equals("Priorizar comida y colaborar con cautela"),
                "La configuración editable conserva instrucciones del operador");
            for (int population : new int[]{4, 6, 10, 2}) {
                config.setPopulationLimit(population);
                helper.assertTrue(AgentConfig.load(directory).populationLimit() == population,
                    "Cada escalón permitido se guarda y recarga");
            }
            String contents = Files.readString(directory.resolve("raps/agents.json"), StandardCharsets.UTF_8);
            helper.assertTrue(!contents.contains("OPENAI_API_KEY") && !Files.exists(directory.resolve("raps/agents.json.tmp")),
                "La configuración no guarda claves ni deja el archivo temporal tras el commit");
            boolean rejected = false;
            try { config.setPopulationLimit(3); } catch (IllegalArgumentException expected) { rejected = true; }
            helper.assertTrue(rejected && config.populationLimit() == 2 && AgentConfig.load(directory).populationLimit() == 2,
                "Un tamaño no permitido no modifica memoria ni archivo");
        } finally { clean(directory); }
        helper.succeed();
    }

    @GameTest(template = "empty")
    public void malformedConfigDoesNotResetOrEnableModels(GameTestHelper helper) throws IOException {
        Path directory = testDirectory(helper);
        try {
            AgentConfig.load(directory);
            Path file = directory.resolve("raps/agents.json");
            String invalid = "{\"schemaVersion\":1,\"populationLimit\":3,\"modelsEnabled\":true}";
            Files.writeString(file, invalid, StandardCharsets.UTF_8);
            boolean rejected = false;
            try { AgentConfig.load(directory); } catch (IllegalStateException expected) { rejected = true; }
            helper.assertTrue(rejected && Files.readString(file, StandardCharsets.UTF_8).equals(invalid),
                "Configuración inválida falla sin borrar el archivo ni aplicar flags parciales");
        } finally { clean(directory); }
        helper.succeed();
    }

    private static Path testDirectory(GameTestHelper helper) {
        return helper.getLevel().getServer().getWorldPath(LevelResource.ROOT)
            .resolve("config-test-" + UUID.randomUUID());
    }
    private static void clean(Path directory) throws IOException {
        // Solo destinos fijos creados por esta prueba; nunca un borrado recursivo.
        Files.deleteIfExists(directory.resolve("raps/agents.json.tmp"));
        Files.deleteIfExists(directory.resolve("raps/agents.json"));
        Files.deleteIfExists(directory.resolve("raps/research.json"));
        Files.deleteIfExists(directory.resolve("raps/agents.md"));
        Files.deleteIfExists(directory.resolve("raps")); Files.deleteIfExists(directory);
    }
}