Skip to content

Commit 4e5b459

Browse files
committed
Added missing sync unit tests
Signed-off-by: Marcin Olko <molko@google.com>
1 parent c3f8bd3 commit 4e5b459

2 files changed

Lines changed: 143 additions & 0 deletions

File tree

providers/flagd/tests/BUILD

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,13 @@ cc_test(
1010
"@nlohmann_json//:json",
1111
],
1212
)
13+
14+
cc_test(
15+
name = "sync_test",
16+
srcs = ["sync_test.cpp"],
17+
deps = [
18+
"//providers/flagd/src:sync",
19+
"@googletest//:gtest_main",
20+
"@nlohmann_json//:json",
21+
],
22+
)
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
#include "flagd/sync.h"
2+
3+
#include <gtest/gtest.h>
4+
5+
#include <nlohmann/json.hpp>
6+
7+
namespace flagd {
8+
9+
class TestableSync : public FlagSync {
10+
public:
11+
using FlagSync::FlagSync;
12+
13+
absl::Status Init(const openfeature::EvaluationContext& /*ctx*/) override {
14+
return absl::OkStatus();
15+
}
16+
absl::Status Shutdown() override { return absl::OkStatus(); }
17+
18+
void TriggerUpdate(const nlohmann::json& new_json) {
19+
this->UpdateFlags(new_json);
20+
}
21+
};
22+
23+
TEST(SyncTest, ValidatorAcceptsValidJson) {
24+
TestableSync sync;
25+
nlohmann::json valid_json = R"({
26+
"flags": {
27+
"my-flag": {
28+
"state": "ENABLED",
29+
"variants": {
30+
"on": true,
31+
"off": false
32+
},
33+
"defaultVariant": "on"
34+
}
35+
}
36+
})"_json;
37+
38+
sync.TriggerUpdate(valid_json);
39+
40+
auto flags = sync.GetFlags();
41+
EXPECT_TRUE(flags->contains("my-flag"));
42+
}
43+
44+
TEST(SyncTest, ValidatorRejectsInvalidJson) {
45+
TestableSync sync;
46+
// Missing 'flags' field
47+
nlohmann::json invalid_json = R"({
48+
"something": "else"
49+
})"_json;
50+
51+
sync.TriggerUpdate(invalid_json);
52+
53+
auto flags = sync.GetFlags();
54+
EXPECT_TRUE(flags->empty());
55+
}
56+
57+
TEST(SyncTest, ValidatorRejectsInvalidType) {
58+
TestableSync sync;
59+
// 'state' should be a string, not an integer
60+
nlohmann::json invalid_json = R"({
61+
"flags": {
62+
"my-flag": {
63+
"state": 123,
64+
"variants": {
65+
"on": true,
66+
"off": false
67+
},
68+
"defaultVariant": "on"
69+
}
70+
}
71+
})"_json;
72+
73+
sync.TriggerUpdate(invalid_json);
74+
75+
auto flags = sync.GetFlags();
76+
EXPECT_TRUE(flags->empty());
77+
}
78+
79+
TEST(SyncTest, ValidatorRejectsMissingVariants) {
80+
TestableSync sync;
81+
// Missing 'variants' field
82+
nlohmann::json invalid_json = R"({
83+
"flags": {
84+
"my-flag": {
85+
"state": "ENABLED",
86+
"defaultVariant": "on"
87+
}
88+
}
89+
})"_json;
90+
91+
sync.TriggerUpdate(invalid_json);
92+
93+
auto flags = sync.GetFlags();
94+
EXPECT_TRUE(flags->empty());
95+
}
96+
97+
TEST(SyncTest, ValidatorRejectsMalformedFlag) {
98+
TestableSync sync;
99+
// 'state' has invalid value
100+
nlohmann::json invalid_json = R"({
101+
"flags": {
102+
"my-flag": {
103+
"state": "INVALID_STATE",
104+
"variants": {
105+
"on": true
106+
},
107+
"defaultVariant": "on"
108+
}
109+
}
110+
})"_json;
111+
112+
sync.TriggerUpdate(invalid_json);
113+
114+
auto flags = sync.GetFlags();
115+
EXPECT_TRUE(flags->empty());
116+
}
117+
118+
TEST(SyncTest, MetadataIsExtracted) {
119+
TestableSync sync;
120+
nlohmann::json json_with_metadata = R"({
121+
"flags": {},
122+
"metadata": {
123+
"foo": "bar"
124+
}
125+
})"_json;
126+
127+
sync.TriggerUpdate(json_with_metadata);
128+
129+
auto metadata = sync.GetMetadata();
130+
EXPECT_EQ((*metadata)["foo"], "bar");
131+
}
132+
133+
} // namespace flagd

0 commit comments

Comments
 (0)