test_apikey.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <gtest/gtest.h>
  2. #include "apikey.hpp"
  3. using namespace svapi;
  4. TEST(KeyOp, StringRoundTrip) {
  5. EXPECT_EQ(keyOpToString(KeyOp::Search), "search");
  6. EXPECT_EQ(*keyOpFromString("insert"), KeyOp::Insert);
  7. EXPECT_FALSE(keyOpFromString("bogus").has_value());
  8. }
  9. TEST(KeyScope, ExactAndGlobRuleMatch) {
  10. KeyScope s;
  11. s.rules.push_back({"catalog_*", {KeyOp::Read, KeyOp::List}, false});
  12. s.rules.push_back({"quotes", {KeyOp::Insert}, false});
  13. EXPECT_NE(s.findRule("catalog_doors", KeyOp::Read), nullptr);
  14. EXPECT_EQ(s.findRule("catalog_doors", KeyOp::Insert), nullptr);
  15. EXPECT_NE(s.findRule("quotes", KeyOp::Insert), nullptr);
  16. EXPECT_EQ(s.findRule("designs", KeyOp::Read), nullptr);
  17. EXPECT_EQ(s.findRule("catalogX", KeyOp::Read), nullptr);
  18. }
  19. TEST(KeyScope, OriginAllowlist) {
  20. KeyScope s; EXPECT_TRUE(s.originAllowed("https://anything"));
  21. s.origins = {"https://konfig.megatoloajto.hu"};
  22. EXPECT_TRUE(s.originAllowed("https://konfig.megatoloajto.hu"));
  23. EXPECT_FALSE(s.originAllowed("https://evil.example"));
  24. EXPECT_FALSE(s.originAllowed(""));
  25. }
  26. TEST(KeyScope, Expiry) {
  27. KeyScope s; EXPECT_FALSE(s.expired(1000));
  28. s.expiresAt = 500; EXPECT_TRUE(s.expired(1000)); EXPECT_FALSE(s.expired(499));
  29. }
  30. TEST(ApiKey, ScopeRoundTripsThroughJson) {
  31. ApiKey k; k.id = "k1"; k.key = "secretvalue"; k.projects = {"megatoloajto"};
  32. KeyScope s; s.rules.push_back({"quotes", {KeyOp::Insert}, true});
  33. s.origins = {"https://x"}; s.rateLimitPerMin = 120; s.expiresAt = 0;
  34. k.scope = s;
  35. ApiKey back = ApiKey::fromJson(k.toJson());
  36. ASSERT_TRUE(back.scope.has_value());
  37. ASSERT_NE(back.scope->findRule("quotes", KeyOp::Insert), nullptr);
  38. EXPECT_TRUE(back.scope->findRule("quotes", KeyOp::Insert)->requireHumanToken);
  39. EXPECT_EQ(back.scope->rateLimitPerMin, 120u);
  40. auto pub = k.toPublicJson();
  41. EXPECT_TRUE(pub.contains("scope"));
  42. EXPECT_FALSE(pub.contains("key"));
  43. }
  44. TEST(ApiKey, NoScopeStaysAbsent) {
  45. ApiKey k; k.id = "k2";
  46. EXPECT_FALSE(ApiKey::fromJson(k.toJson()).scope.has_value());
  47. EXPECT_FALSE(k.toPublicJson().contains("scope"));
  48. }