test_settings.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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(Settings, EmbeddingTimeoutDefaults) {
  16. Settings s = Settings::fromJson(nlohmann::json::object());
  17. EXPECT_EQ(s.embeddingConnectTimeoutSec, 10u);
  18. EXPECT_EQ(s.embeddingReadTimeoutSec, 60u);
  19. }
  20. TEST(Settings, EmbeddingTimeoutRoundTrip) {
  21. nlohmann::json j{{"embedding_connect_timeout_sec", 30}, {"embedding_read_timeout_sec", 120}};
  22. Settings s = Settings::fromJson(j);
  23. EXPECT_EQ(s.embeddingConnectTimeoutSec, 30u);
  24. EXPECT_EQ(s.embeddingReadTimeoutSec, 120u);
  25. // round-trip: toJson → fromJson preserves values
  26. Settings s2 = Settings::fromJson(s.toJson());
  27. EXPECT_EQ(s2.embeddingConnectTimeoutSec, 30u);
  28. EXPECT_EQ(s2.embeddingReadTimeoutSec, 120u);
  29. }
  30. TEST(ApiKey, JsonRoundTripAndPublicMasks) {
  31. ApiKey k = ApiKey::fromJson(nlohmann::json::parse(
  32. R"({"key":"abcdef0123456789","label":"n8n","projects":["p1","p2"],"admin":false,"created_at":7})"));
  33. EXPECT_EQ(k.key, "abcdef0123456789");
  34. EXPECT_EQ(k.projects.size(), 2u);
  35. EXPECT_FALSE(k.admin);
  36. EXPECT_EQ(k.createdAt, 7u);
  37. EXPECT_EQ(ApiKey::fromJson(k.toJson()).toJson(), k.toJson());
  38. auto pub = k.toPublicJson();
  39. EXPECT_FALSE(pub.contains("key")); // secret not exposed
  40. EXPECT_EQ(pub["label"], "n8n");
  41. EXPECT_EQ(pub["projects"].size(), 2u);
  42. EXPECT_TRUE(pub.contains("key_prefix")); // short hint only
  43. }
  44. TEST(ApiKey, CanAccess) {
  45. ApiKey adminK; adminK.admin = true;
  46. EXPECT_TRUE(adminK.canAccess("anything"));
  47. ApiKey star; star.projects = {"*"};
  48. EXPECT_TRUE(star.canAccess("anything"));
  49. ApiKey scoped; scoped.projects = {"p1", "p2"};
  50. EXPECT_TRUE(scoped.canAccess("p1"));
  51. EXPECT_FALSE(scoped.canAccess("p3"));
  52. }
  53. TEST(ApiKey, GenerateIsHexAndUnique) {
  54. std::string a = generateApiKey(), b = generateApiKey();
  55. EXPECT_GE(a.size(), 32u);
  56. EXPECT_NE(a, b);
  57. for (char c : a) EXPECT_TRUE(std::isxdigit(static_cast<unsigned char>(c)));
  58. }