#include "db_test_util.hpp" #include "collection_registry.hpp" using namespace svapi; TEST(CollectionMeta, JsonRoundTrip) { CollectionMeta m{"docs", "vector", 1536, "text-embedding-3-small", 123}; CollectionMeta r = CollectionMeta::fromJson(m.toJson()); EXPECT_EQ(r.name, "docs"); EXPECT_EQ(r.kind, "vector"); EXPECT_EQ(r.vectorDimension, 1536u); EXPECT_EQ(r.embeddingModel, "text-embedding-3-small"); } TEST(CollectionRegistry, IsolatedPerProject) { SVAPI_REQUIRE_DB(db); const std::string pa = testutil::tmpName("rega"), pb = testutil::tmpName("regb"); db->ensureProject(pa); db->ensureProject(pb); CollectionRegistry reg(*db); reg.ensure(pa); reg.ensure(pb); EXPECT_TRUE(reg.add(pa, {"users", "json", 0, "", 0})); EXPECT_TRUE(reg.get(pa, "users").has_value()); EXPECT_FALSE(reg.get(pb, "users").has_value()); // isolation across projects EXPECT_EQ(reg.list(pa).size(), 1u); EXPECT_EQ(reg.list(pb).size(), 0u); EXPECT_TRUE(reg.remove(pa, "users")); EXPECT_FALSE(reg.get(pa, "users").has_value()); db->dropProject(pa); db->dropProject(pb); } // Regression guard for issue #1: a freshly-constructed registry (as on a new // server process) must surface previously-stored entries for every project once // bootstrap() has re-opened them. The startup path warmed only the default // project before the fix, so named projects' collections went missing on restart. TEST(CollectionRegistry, BootstrapWarmsAllProjects) { SVAPI_REQUIRE_DB(db); const std::string pa = testutil::tmpName("bootA"), pb = testutil::tmpName("bootB"); db->ensureProject(pa); db->ensureProject(pb); { CollectionRegistry seed(*db); seed.ensure(pa); seed.ensure(pb); EXPECT_TRUE(seed.add(pa, {"alpha", "json", 0, "", 0})); EXPECT_TRUE(seed.add(pb, {"beta", "vector", 8, "m", 0})); } CollectionRegistry fresh(*db); fresh.bootstrap({pa, pb}); // the startup warm-up that fixes issue #1 EXPECT_EQ(fresh.list(pa).size(), 1u); EXPECT_EQ(fresh.list(pb).size(), 1u); EXPECT_TRUE(fresh.get(pa, "alpha").has_value()); EXPECT_TRUE(fresh.get(pb, "beta").has_value()); db->dropProject(pa); db->dropProject(pb); }