yams/tests/unit/cli/doctor/dim_consistency_catch2_test.cpp

124 lines
3.8 KiB
C++

// Unit tests for DimConsistencyCheck
#include <catch2/catch_test_macros.hpp>
#include <yams/cli/doctor/checks/dim_consistency.h>
#include <yams/cli/doctor/doctor_context.h>
#include <yams/cli/yams_cli.h>
#include <yams/daemon/ipc/ipc_protocol.h>
#include <filesystem>
#include <fstream>
#include <memory>
#include <sstream>
#include "../../../common/test_helpers_catch2.h"
namespace fs = std::filesystem;
using namespace yams::cli::doctor;
namespace {
struct DimTestEnv {
fs::path dataDir;
yams::test::ScopedEnvVar dataEnv;
yams::test::ScopedEnvVar homeEnv;
DimTestEnv()
: dataDir(yams::test::make_temp_dir("yams_dim_test_")),
dataEnv("YAMS_DATA_DIR", dataDir.string()), homeEnv("HOME", dataDir.string()) {
fs::create_directories(dataDir);
}
std::unique_ptr<yams::cli::YamsCLI> makeCli() { return std::make_unique<yams::cli::YamsCLI>(); }
};
} // namespace
TEST_CASE("DimConsistencyCheck - no daemon status returns empty result",
"[doctor][dim_consistency]") {
DimTestEnv env;
auto cli = env.makeCli();
DoctorContext ctx(cli.get());
DimConsistencyCheck check;
auto result = check.execute(ctx, nullptr);
CHECK((result.dbDim == 0));
CHECK((result.targetDim == 0));
CHECK_FALSE(result.mismatch);
CHECK_FALSE(result.configInconsistent);
}
TEST_CASE("DimConsistencyCheck uses effective preferred model policy",
"[doctor][dim_consistency][config][snapshot]") {
DimTestEnv env;
const auto configPath = yams::test::write_file(env.dataDir / "config.toml", R"toml(
[embeddings]
backend = "onnxruntime"
preferred_model = "all-MiniLM-L6-v2"
[embeddings.runtime]
preferred_model = "bge-base-en-v1.5"
)toml");
yams::test::ScopedEnvVar configPathEnvironment{"YAMS_CONFIG_PATH", configPath.string()};
yams::test::ScopedEnvVar configEnvironment{"YAMS_CONFIG", std::nullopt};
yams::test::ScopedEnvVar backendEnvironment{"YAMS_EMBED_BACKEND", std::nullopt};
yams::test::ScopedEnvVar modelEnvironment{"YAMS_PREFERRED_MODEL", std::nullopt};
yams::test::ScopedEnvVar dimensionEnvironment{"YAMS_EMBED_DIM", std::nullopt};
auto cli = env.makeCli();
DoctorContext ctx(cli.get());
yams::daemon::StatusResponse status;
status.vectorDbDim = 768;
DimConsistencyCheck check;
const auto result = check.execute(ctx, &status);
CHECK((result.dbDim == 768U));
CHECK((result.targetDim == 384U));
CHECK((result.targetSource == "model_heuristic(all-MiniLM-L6-v2)"));
CHECK(result.mismatch);
CHECK_FALSE(result.configInconsistent);
}
TEST_CASE("DimConsistencyCheck - renders without daemon status", "[doctor][dim_consistency]") {
DimConsistencyCheck::Result r;
r.dbDim = 0;
r.targetDim = 0;
std::ostringstream os;
DimConsistencyCheck::render(os, r);
auto output = os.str();
CHECK_FALSE(output.empty());
CHECK((output.find("not ready") != std::string::npos));
}
TEST_CASE("DimConsistencyCheck - renders mismatch", "[doctor][dim_consistency]") {
DimConsistencyCheck::Result r;
r.dbDim = 384;
r.targetDim = 1024;
r.targetSource = "daemon_provider";
r.mismatch = true;
std::ostringstream os;
DimConsistencyCheck::render(os, r);
auto output = os.str();
CHECK_FALSE(output.empty());
CHECK((output.find("384") != std::string::npos));
CHECK((output.find("1024") != std::string::npos));
CHECK((output.find("mismatch") != std::string::npos));
}
TEST_CASE("DimConsistencyCheck - renders match", "[doctor][dim_consistency]") {
DimConsistencyCheck::Result r;
r.dbDim = 384;
r.targetDim = 384;
r.targetSource = "config";
r.mismatch = false;
std::ostringstream os;
DimConsistencyCheck::render(os, r);
auto output = os.str();
CHECK_FALSE(output.empty());
CHECK((output.find("matches") != std::string::npos));
}