test_settings.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <gtest/gtest.h>
  2. #include "settings.hpp"
  3. #include "apikey.hpp"
  4. #include <cctype>
  5. using namespace svapi;
  6. TEST(Settings, DefaultsAndRoundTrip) {
  7. Settings s = Settings::fromJson(nlohmann::json::object());
  8. EXPECT_EQ(s.openaiApiBase, "https://api.openai.com");
  9. EXPECT_EQ(s.defaultEmbeddingModel, "text-embedding-3-small");
  10. EXPECT_EQ(s.sessionTtlMinutes, 720u);
  11. EXPECT_TRUE(s.webuiEnabled);
  12. EXPECT_EQ(s.defaultProject, "default");
  13. EXPECT_EQ(Settings::fromJson(s.toJson()).toJson(), s.toJson());
  14. }
  15. TEST(ApiKey, JsonRoundTripAndPublicMasks) {
  16. ApiKey k = ApiKey::fromJson(nlohmann::json::parse(
  17. R"({"key":"abcdef0123456789","label":"n8n","projects":["p1","p2"],"admin":false,"created_at":7})"));
  18. EXPECT_EQ(k.key, "abcdef0123456789");
  19. EXPECT_EQ(k.projects.size(), 2u);
  20. EXPECT_FALSE(k.admin);
  21. EXPECT_EQ(k.createdAt, 7u);
  22. EXPECT_EQ(ApiKey::fromJson(k.toJson()).toJson(), k.toJson());
  23. auto pub = k.toPublicJson();
  24. EXPECT_FALSE(pub.contains("key")); // secret not exposed
  25. EXPECT_EQ(pub["label"], "n8n");
  26. EXPECT_EQ(pub["projects"].size(), 2u);
  27. EXPECT_TRUE(pub.contains("key_prefix")); // short hint only
  28. }
  29. TEST(ApiKey, CanAccess) {
  30. ApiKey adminK; adminK.admin = true;
  31. EXPECT_TRUE(adminK.canAccess("anything"));
  32. ApiKey star; star.projects = {"*"};
  33. EXPECT_TRUE(star.canAccess("anything"));
  34. ApiKey scoped; scoped.projects = {"p1", "p2"};
  35. EXPECT_TRUE(scoped.canAccess("p1"));
  36. EXPECT_FALSE(scoped.canAccess("p3"));
  37. }
  38. TEST(ApiKey, GenerateIsHexAndUnique) {
  39. std::string a = generateApiKey(), b = generateApiKey();
  40. EXPECT_GE(a.size(), 32u);
  41. EXPECT_NE(a, b);
  42. for (char c : a) EXPECT_TRUE(std::isxdigit(static_cast<unsigned char>(c)));
  43. }