From 7839edc488f60e1bb675652ac6e971254f3e96ac Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Wed, 4 Nov 2026 20:44:38 +0100 Subject: [PATCH] feat: Add test case for a flag dependency on a feature with a non-ASCII name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flagsmith writes a dependency's condition as `$.flags[].enabled`, which escapes non-ASCII characters, so a dependency on `été` reads `$.flags["\u00e9t\u00e9"].enabled`. Engines that look the escaped name up verbatim never match the dependency's segment. --- ...scaped_feature_name__should_override.jsonc | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 test_cases/test_flag_dependency__unicode_escaped_feature_name__should_override.jsonc diff --git a/test_cases/test_flag_dependency__unicode_escaped_feature_name__should_override.jsonc b/test_cases/test_flag_dependency__unicode_escaped_feature_name__should_override.jsonc new file mode 100644 index 0000000..704803c --- /dev/null +++ b/test_cases/test_flag_dependency__unicode_escaped_feature_name__should_override.jsonc @@ -0,0 +1,85 @@ +{ + // Given: A feature `été`, and a segment overriding `dependent` whose only + // condition is on `été` not being enabled, its name selector holding + // `\u` escapes + // When: A context is evaluated in which `été` is disabled + // Then: The escapes resolve to `été`, so the dependency is not satisfied, + // `dependent` takes the override, and the segment matches + // + // NOTE: Flagsmith writes a dependency's condition as + // `$.flags[].enabled`, which escapes every non-ASCII + // character, e.g. `$.flags["\u00e9t\u00e9"].enabled`. RFC 9535 allows + // such escapes in name selectors. An implementation that looks up + // `\u00e9t\u00e9` verbatim reads no value, so the segment never + // matches and `dependent` keeps its default. + "$schema": "https://raw.githubusercontent.com/Flagsmith/engine-test-data/refs/tags/v2.0.0/schema.json", + "context": { + "environment": { + "key": "key", + "name": "Environment" + }, + "features": { + "été": { + "enabled": false, + "key": "1", + "name": "été", + "value": null + }, + "dependent": { + "enabled": true, + "key": "2", + "name": "dependent", + "value": "on" + } + }, + "segments": { + "1": { + "key": "1", + "name": "dependent-depends-on-été", + "rules": [ + { + "type": "ANY", + "conditions": [ + { + "operator": "NOT_EQUAL", + "property": "$.flags[\"\\u00e9t\\u00e9\"].enabled", + "value": "true" + } + ] + } + ], + "overrides": [ + { + "enabled": false, + "key": "2", + "name": "dependent", + "value": "off" + } + ] + } + } + }, + "result": { + "flags": { + "été": { + "enabled": false, + "name": "été", + "reason": "STATIC", + "value": null, + "variant": null + }, + "dependent": { + "enabled": false, + "name": "dependent", + "reason": "TARGETING_MATCH; segment=dependent-depends-on-été", + "value": "off", + "variant": null + } + }, + "segments": [ + { + "name": "dependent-depends-on-été" + } + ] + } +}