diff --git a/evaluator/flags/testkit-flags.json b/evaluator/flags/testkit-flags.json index ce24194..fc696d4 100644 --- a/evaluator/flags/testkit-flags.json +++ b/evaluator/flags/testkit-flags.json @@ -511,6 +511,78 @@ "targeting": { "if": [{"sem_ver": [{"var": "version"}, "=", "1.0.0+build"]}, "match", "no-match"] } + }, + "ref-whitespace-compact-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref":"is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-whitespace-space-after-colon-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref": "is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-whitespace-space-around-colon-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref" : "is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-to-nonexistent-evaluator-flag": { + "state": "ENABLED", + "variants": { + "hit": "hit", + "miss": "miss", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref": "nonexistent_evaluator" + }, + "hit", + "miss" + ] + } } }, "$evaluators": { diff --git a/evaluator/gherkin/evaluator-refs.feature b/evaluator/gherkin/evaluator-refs.feature index 0d8467d..1e2ffd4 100644 --- a/evaluator/gherkin/evaluator-refs.feature +++ b/evaluator/gherkin/evaluator-refs.feature @@ -13,3 +13,28 @@ Feature: Evaluator evaluator refs | key | value | | some-email-targeted-flag | hi | | some-other-email-targeted-flag | yes | + + @evaluator-refs @evaluator-refs-whitespace + Scenario Outline: Evaluator $ref resolves regardless of whitespace around the colon + Given an evaluator + And a String-flag with key "" and a fallback value "fallback" + And a context containing a key "email", with type "String" and with value "" + When the flag was evaluated with details + Then the resolved details value should be "" + And the reason should be "TARGETING_MATCH" + Examples: + | key | email | value | + | ref-whitespace-compact-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-space-after-colon-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-space-around-colon-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-compact-flag | user@example.com | bye | + | ref-whitespace-space-after-colon-flag | user@example.com | bye | + | ref-whitespace-space-around-colon-flag | user@example.com | bye | + + @evaluator-refs @non-existent-evaluator-ref + Scenario: Ref to nonexistent evaluator yields parse error + Given an evaluator + And a String-flag with key "ref-to-nonexistent-evaluator-flag" and a fallback value "fallback" + When the flag was evaluated with details + Then the resolved details value should be "fallback" + And the error-code should be "PARSE_ERROR" diff --git a/flags/evaluator-refs.json b/flags/evaluator-refs.json index faad954..b2ca516 100644 --- a/flags/evaluator-refs.json +++ b/flags/evaluator-refs.json @@ -35,6 +35,78 @@ "no" ] } + }, + "ref-whitespace-compact-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref":"is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-whitespace-space-after-colon-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref": "is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-whitespace-space-around-colon-flag": { + "state": "ENABLED", + "variants": { + "hi": "hi", + "bye": "bye", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref" : "is_ballmer" + }, + "hi", + "bye" + ] + } + }, + "ref-to-nonexistent-evaluator-flag": { + "state": "ENABLED", + "variants": { + "hit": "hit", + "miss": "miss", + "fallback": "fallback" + }, + "defaultVariant": "fallback", + "targeting": { + "if": [ + { + "$ref": "nonexistent_evaluator" + }, + "hit", + "miss" + ] + } } }, "$evaluators": { diff --git a/gherkin/targeting.feature b/gherkin/targeting.feature index 71fb8b0..8a193b9 100644 --- a/gherkin/targeting.feature +++ b/gherkin/targeting.feature @@ -20,6 +20,29 @@ Feature: Targeting rules | some-email-targeted-flag | hi | | some-other-email-targeted-flag | yes | + @evaluator-refs @evaluator-refs-whitespace + Scenario Outline: Evaluator $ref resolves regardless of whitespace around the colon + Given a String-flag with key "" and a default value "fallback" + And a context containing a key "email", with type "String" and with value "" + When the flag was evaluated with details + Then the resolved details value should be "" + And the reason should be "TARGETING_MATCH" + Examples: + | key | email | value | + | ref-whitespace-compact-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-space-after-colon-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-space-around-colon-flag | ballmer@macrosoft.com | hi | + | ref-whitespace-compact-flag | user@example.com | bye | + | ref-whitespace-space-after-colon-flag | user@example.com | bye | + | ref-whitespace-space-around-colon-flag | user@example.com | bye | + + @evaluator-refs @non-existent-evaluator-ref + Scenario: Ref to nonexistent evaluator yields parse error + Given a String-flag with key "ref-to-nonexistent-evaluator-flag" and a default value "fallback" + When the flag was evaluated with details + Then the resolved details value should be "fallback" + And the error-code should be "PARSE_ERROR" + # custom operators # @fractional-v1: legacy float-based bucketing (abs(hash) / i32::MAX * 100) # @fractional-v2: high-precision integer bucketing ((hash * totalWeight) >> 32)