From 14eadc106a1ecdc2f381a5eee83b4f111cca3f3c Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Tue, 5 Dec 2023 14:19:05 -0500 Subject: [PATCH] feat: add tests for config edge cases (#85) Signed-off-by: Todd Baert --- flagd/Dockerfile | 3 +- flagd/Dockerfile.unstable | 2 +- flags/custom-ops.json | 18 +++++++++-- flags/edge-case-flags.json | 48 ++++++++++++++++++++++++++++ flags/testing-flags.json | 25 +++++++++++++++ gherkin/flagd-json-evaluator.feature | 25 +++++++++++++-- sync/Dockerfile | 1 + 7 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 flags/edge-case-flags.json diff --git a/flagd/Dockerfile b/flagd/Dockerfile index a2c8846..81a88da 100644 --- a/flagd/Dockerfile +++ b/flagd/Dockerfile @@ -1,5 +1,5 @@ # we NEED flagd v0.6.4 as a minimum -FROM ghcr.io/open-feature/flagd:v0.7.0 as flagd +FROM ghcr.io/open-feature/flagd:v0.7.2 as flagd FROM busybox:1.36 @@ -13,4 +13,5 @@ ENTRYPOINT ["sh", "change-flag-wrapper.sh", "./flagd", "start", \ "-f", "file:changing-flag.json", \ "-f", "file:custom-ops.json", \ "-f", "file:evaluator-refs.json", \ + "-f", "file:edge-case-flags.json", \ "-f", "file:zero-flags.json"] diff --git a/flagd/Dockerfile.unstable b/flagd/Dockerfile.unstable index 661b3dd..c86ffd3 100644 --- a/flagd/Dockerfile.unstable +++ b/flagd/Dockerfile.unstable @@ -1,5 +1,5 @@ # we NEED flagd v0.6.4 as a minimum -FROM ghcr.io/open-feature/flagd:v0.6.6 as flagd +FROM ghcr.io/open-feature/flagd:v0.7.2 as flagd FROM busybox:1.36 diff --git a/flags/custom-ops.json b/flags/custom-ops.json index 773da02..45a8fe1 100644 --- a/flags/custom-ops.json +++ b/flags/custom-ops.json @@ -38,7 +38,14 @@ { "ends_with": [{"var": "id"}, "xyz"] }, - "postfix", "none" + "postfix", { + "if": [ + { + "ends_with": [{"var": "id"}, 3] + }, + "fail", "none" + ] + } ] } ] @@ -68,7 +75,14 @@ { "sem_ver": [{"var": "version"}, "<", "2.0.0"] }, - "lesser", "none" + "lesser", { + "if": [ + { + "sem_ver": [{"var": "version"}, "=", "2.0.0.0"] + }, + "fail", "none" + ] + } ] } ] diff --git a/flags/edge-case-flags.json b/flags/edge-case-flags.json new file mode 100644 index 0000000..771e750 --- /dev/null +++ b/flags/edge-case-flags.json @@ -0,0 +1,48 @@ +{ + "flags": { + "targeting-null-variant-flag": { + "state": "ENABLED", + "variants": { + "one": 1, + "two": 2 + }, + "defaultVariant": "two", + "targeting": { + "if": [true, null, "one"] + } + }, + "error-targeting-flag": { + "state": "ENABLED", + "variants": { + "one": 1, + "two": 2 + }, + "defaultVariant": "two", + "targeting": { + "invalid": ["this is not valid targeting"] + } + }, + "missing-variant-targeting-flag": { + "state": "ENABLED", + "variants": { + "one": 1, + "two": 2 + }, + "defaultVariant": "two", + "targeting": { + "if": [true, "three", "one"] + } + }, + "non-string-variant-targeting-flag": { + "state": "ENABLED", + "variants": { + "false": 1, + "true": 2 + }, + "defaultVariant": "false", + "targeting": { + "if": [true, true, false] + } + } + } +} diff --git a/flags/testing-flags.json b/flags/testing-flags.json index 200140d..981bb04 100644 --- a/flags/testing-flags.json +++ b/flags/testing-flags.json @@ -102,6 +102,31 @@ ] } }, + "timestamp-flag": { + "state": "ENABLED", + "variants": { + "past": -1, + "future": 1, + "none": 0 + }, + "defaultVariant": "none", + "targeting": { + "if": [ + { + ">": [ { "var": "$flagd.timestamp" }, { "var": "time" } ] + }, + "past", + { + "if": [ + { + "<": [ { "var": "$flagd.timestamp" }, { "var": "time" } ] + }, + "future", "none" + ] + } + ] + } + }, "wrong-flag": { "state": "ENABLED", "variants": { diff --git a/gherkin/flagd-json-evaluator.feature b/gherkin/flagd-json-evaluator.feature index 769825e..01e1c65 100644 --- a/gherkin/flagd-json-evaluator.feature +++ b/gherkin/flagd-json-evaluator.feature @@ -28,6 +28,7 @@ Feature: flagd json evaluation | "queen" | "clubs" | | "ten" | "diamonds" | | "nine" | "hearts" | + | 3 | "wild" | Scenario Outline: Substring operators When a string flag with key "starts-ends-flag" is evaluated with default value "fallback" @@ -38,7 +39,8 @@ Feature: flagd json evaluation | "abcdef" | "prefix" | | "uvwxyz" | "postfix" | | "abcxyz" | "prefix" | - | "lmnopq" | "none" | + | "lmnopq" | "none" | + | 3 | "none" | Scenario Outline: Semantic version operator numeric comparision When a string flag with key "equal-greater-lesser-version-flag" is evaluated with default value "fallback" @@ -50,7 +52,7 @@ Feature: flagd json evaluation | "2.1.0" | "greater" | | "1.9.0" | "lesser" | | "2.0.0-alpha" | "lesser" | - | "2.0.0.0" | "none" | + | "2.0.0.0" | "none" | Scenario Outline: Semantic version operator semantic comparision When a string flag with key "major-minor-version-flag" is evaluated with default value "fallback" @@ -61,3 +63,22 @@ Feature: flagd json evaluation | "3.0.1" | "minor" | | "3.1.0" | "major" | | "4.0.0" | "none" | + + Scenario Outline: Time-based operations + When an integer flag with key "timestamp-flag" is evaluated with default value 0 + And a context containing a key "time", with value