@@ -1057,17 +1057,24 @@ def test_campaign_id_none_falls_back_to_experiment_id(self):
10571057 snapshot = self ._build_impression (experiment , '111129' )
10581058 self .assertEqual (self ._decision (snapshot )['campaign_id' ], experiment .id )
10591059
1060- def test_campaign_id_non_numeric_string_falls_back_to_experiment_id (self ):
1061- experiment = self ._with_layer_id ('abc' )
1060+ def test_campaign_id_opaque_string_passes_through (self ):
1061+ # Per FR-001: any non-empty string (numeric or opaque like "default-12345"
1062+ # or "layer_abc") is valid and passes through unchanged.
1063+ experiment = self ._with_layer_id ('default-12345' )
10621064 snapshot = self ._build_impression (experiment , '111129' )
1063- self .assertEqual (self ._decision (snapshot )['campaign_id' ], experiment . id )
1065+ self .assertEqual (self ._decision (snapshot )['campaign_id' ], 'default-12345' )
10641066
1065- def test_campaign_id_whitespace_falls_back_to_experiment_id (self ):
1067+ def test_campaign_id_whitespace_string_passes_through (self ):
1068+ # Per FR-001 / spec Assumptions: a non-empty string of any character
1069+ # content is valid; whitespace-only strings are non-empty and accepted.
10661070 experiment = self ._with_layer_id (' ' )
10671071 snapshot = self ._build_impression (experiment , '111129' )
1068- self .assertEqual (self ._decision (snapshot )['campaign_id' ], experiment . id )
1072+ self .assertEqual (self ._decision (snapshot )['campaign_id' ], ' ' )
10691073
10701074 def test_campaign_id_integer_value_falls_back_to_experiment_id (self ):
1075+ # Non-string types are out of scope per spec Assumptions; the
1076+ # is_non_empty_string predicate returns False for them, so the
1077+ # fallback to experiment_id fires.
10711078 experiment = self ._with_layer_id (111182 )
10721079 snapshot = self ._build_impression (experiment , '111129' )
10731080 self .assertEqual (self ._decision (snapshot )['campaign_id' ], experiment .id )
@@ -1102,10 +1109,13 @@ def test_entity_id_empty_falls_back_to_experiment_id(self):
11021109 snapshot = self ._build_impression (experiment , '111129' )
11031110 self .assertEqual (self ._event (snapshot )['entity_id' ], experiment .id )
11041111
1105- def test_entity_id_non_numeric_falls_back_to_experiment_id (self ):
1106- experiment = self ._with_layer_id ('abc' )
1112+ def test_entity_id_opaque_layer_id_passes_through (self ):
1113+ # Per FR-009: entity_id accepts any non-empty string (numeric or opaque
1114+ # like "layer_abc") and passes through unchanged. The fallback to
1115+ # experiment_id fires only when the value is empty, null, or missing.
1116+ experiment = self ._with_layer_id ('layer_abc' )
11071117 snapshot = self ._build_impression (experiment , '111129' )
1108- self .assertEqual (self ._event (snapshot )['entity_id' ], experiment . id )
1118+ self .assertEqual (self ._event (snapshot )['entity_id' ], 'layer_abc' )
11091119
11101120 def test_entity_id_equals_campaign_id_when_layer_invalid (self ):
11111121 experiment = self ._with_layer_id ('' )
0 commit comments