@@ -143,6 +143,48 @@ public async Task ExecuteApproved_requires_renewed_approval_before_execution_whe
143143 Assert . Equal ( MutationRequestVersionResolutionOutcome . RequiresRenewedApproval , result . Resolution . Outcome ) ;
144144 }
145145
146+ [ Fact ]
147+ public async Task ExecuteApproved_revalidates_and_executes_against_latest_state_when_strategy_demands_it ( )
148+ {
149+ var services = new ServiceCollection ( ) ;
150+ services . AddMutators ( MutationEngineOptions . Strict ) ;
151+ await using var provider = services . BuildServiceProvider ( ) ;
152+
153+ var engine = provider . GetRequiredService < IMutationEngine > ( ) ;
154+ var requestStore = new InMemoryMutationRequestStore ( ) ;
155+ var resolutionManager = new MutationRequestVersionResolutionManager ( requestStore , new MutationRequestVersionResolver ( ) ) ;
156+ var executionManager = new GovernanceExecutionManager ( requestStore , resolutionManager , engine ) ;
157+
158+ var request = await requestStore . Create ( MutationRequestTestFactory . CreateApprovedSecurityRequest ( "v10" ) ) ;
159+ var mutation = new PromoteRoleMutation (
160+ MutationContext . User ( "operator-1" , "Operator One" , "Execute approved role promotion" ) ,
161+ nextVersion : "v16" ) ;
162+ var state = RoleState . Create ( "tenant-42:roles" , role : "Reader" , version : "v15" ) ;
163+
164+ var result = await executionManager . ExecuteApproved (
165+ request . RequestId ,
166+ mutation ,
167+ state ,
168+ currentStateVersion : state . Version ,
169+ resultingStateVersionProvider : updated => updated . Version ,
170+ governanceContext : MutationContext . Service ( "governance-runtime" , "Revalidate and execute" ) ,
171+ strategy : VersionedRequestResolutionStrategy . RevalidateOnLatestState ) ;
172+
173+ Assert . True ( result . WasExecuted ) ;
174+ Assert . NotNull ( result . MutationResult ) ;
175+ Assert . Equal ( MutationRequestVersionResolutionOutcome . RevalidateOnLatestState , result . Resolution . Outcome ) ;
176+ Assert . Equal ( MutationRequestStatus . Executed , result . Request . Status ) ;
177+ Assert . Equal ( "v16" , result . ResultingStateVersion ) ;
178+ Assert . Equal ( "v16" , result . Request . ResultingStateVersion ) ;
179+ Assert . Equal ( "v16" , result . Request . ExpectedStateVersion ) ;
180+ Assert . Equal (
181+ MutationRequestDecisionType . Lifecycle ( MutationRequestLifecycleDecisionType . Executed ) ,
182+ result . Request . Decisions [ ^ 1 ] . Type ) ;
183+ Assert . Contains (
184+ result . Request . Decisions ,
185+ decision => decision . Type == MutationRequestDecisionType . VersionResolution ( MutationRequestVersionResolutionDecisionType . RevalidationRequired ) ) ;
186+ }
187+
146188 private sealed record RoleState ( string StateId , string Role , string Version )
147189 {
148190 public static RoleState Create ( string stateId , string role , string version ) => new ( stateId , role , version ) ;
0 commit comments