@@ -131,6 +131,7 @@ struct SpecResolvedFlag {
131131 variant : String ,
132132 value : Option < serde_json:: Value > ,
133133 should_apply : Option < bool > ,
134+ assignment_id : Option < String > ,
134135}
135136
136137// ---------------------------------------------------------------------------
@@ -459,6 +460,37 @@ fn run_spec_test(state: &ResolverState, test_case: &SpecTestCase) {
459460 test_case. name, expected_flag. flag, expected_should_apply, actual_should_apply,
460461 ) ;
461462 }
463+
464+ // assignmentId assertion (from resolve token)
465+ if let Some ( expected_assignment_id) = & expected_flag. assignment_id {
466+ let token = resolver
467+ . decrypt_resolve_token ( & resolve_response. resolve_token )
468+ . unwrap_or_else ( |e| {
469+ panic ! (
470+ "[{}] Failed to decrypt resolve token: {}" ,
471+ test_case. name, e,
472+ )
473+ } ) ;
474+ match token. resolve_token {
475+ Some ( flags_resolver:: resolve_token:: ResolveToken :: TokenV1 ( token_v1) ) => {
476+ let assigned = token_v1
477+ . assignments
478+ . get ( & expected_flag. flag )
479+ . unwrap_or_else ( || {
480+ panic ! (
481+ "[{}] Flag '{}' not found in resolve token assignments" ,
482+ test_case. name, expected_flag. flag,
483+ )
484+ } ) ;
485+ assert_eq ! (
486+ & assigned. assignment_id, expected_assignment_id,
487+ "[{}] assignmentId mismatch for flag '{}'" ,
488+ test_case. name, expected_flag. flag,
489+ ) ;
490+ }
491+ _ => panic ! ( "[{}] Expected TokenV1 in resolve token" , test_case. name, ) ,
492+ }
493+ }
462494 }
463495}
464496
@@ -685,3 +717,6 @@ spec_test!(combined_both_match);
685717spec_test ! ( combined_only_attr) ;
686718spec_test ! ( combined_only_mat) ;
687719spec_test ! ( combined_neither) ;
720+
721+ // Materialization: duplicate variant assignments
722+ spec_test ! ( mat_same_variant_two_assignments_returns_correct_assignment_id) ;
0 commit comments