test_registry.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "db_test_util.hpp"
  2. #include "collection_registry.hpp"
  3. using namespace svapi;
  4. TEST(CollectionMeta, JsonRoundTrip) {
  5. CollectionMeta m{"docs", "vector", 1536, "text-embedding-3-small", 123};
  6. CollectionMeta r = CollectionMeta::fromJson(m.toJson());
  7. EXPECT_EQ(r.name, "docs"); EXPECT_EQ(r.kind, "vector");
  8. EXPECT_EQ(r.vectorDimension, 1536u); EXPECT_EQ(r.embeddingModel, "text-embedding-3-small");
  9. }
  10. TEST(CollectionRegistry, IsolatedPerProject) {
  11. SVAPI_REQUIRE_DB(db);
  12. const std::string pa = testutil::tmpName("rega"), pb = testutil::tmpName("regb");
  13. db->ensureProject(pa); db->ensureProject(pb);
  14. CollectionRegistry reg(*db);
  15. reg.ensure(pa); reg.ensure(pb);
  16. EXPECT_TRUE(reg.add(pa, {"users", "json", 0, "", 0}));
  17. EXPECT_TRUE(reg.get(pa, "users").has_value());
  18. EXPECT_FALSE(reg.get(pb, "users").has_value()); // isolation across projects
  19. EXPECT_EQ(reg.list(pa).size(), 1u);
  20. EXPECT_EQ(reg.list(pb).size(), 0u);
  21. EXPECT_TRUE(reg.remove(pa, "users"));
  22. EXPECT_FALSE(reg.get(pa, "users").has_value());
  23. db->dropProject(pa); db->dropProject(pb);
  24. }
  25. // Regression guard for issue #1: a freshly-constructed registry (as on a new
  26. // server process) must surface previously-stored entries for every project once
  27. // bootstrap() has re-opened them. The startup path warmed only the default
  28. // project before the fix, so named projects' collections went missing on restart.
  29. TEST(CollectionRegistry, BootstrapWarmsAllProjects) {
  30. SVAPI_REQUIRE_DB(db);
  31. const std::string pa = testutil::tmpName("bootA"), pb = testutil::tmpName("bootB");
  32. db->ensureProject(pa); db->ensureProject(pb);
  33. {
  34. CollectionRegistry seed(*db);
  35. seed.ensure(pa); seed.ensure(pb);
  36. EXPECT_TRUE(seed.add(pa, {"alpha", "json", 0, "", 0}));
  37. EXPECT_TRUE(seed.add(pb, {"beta", "vector", 8, "m", 0}));
  38. }
  39. CollectionRegistry fresh(*db);
  40. fresh.bootstrap({pa, pb}); // the startup warm-up that fixes issue #1
  41. EXPECT_EQ(fresh.list(pa).size(), 1u);
  42. EXPECT_EQ(fresh.list(pb).size(), 1u);
  43. EXPECT_TRUE(fresh.get(pa, "alpha").has_value());
  44. EXPECT_TRUE(fresh.get(pb, "beta").has_value());
  45. db->dropProject(pa); db->dropProject(pb);
  46. }