@@ -48,7 +48,7 @@ public function testResolveAppliesGroupValueWhenSystemAllowsOverride(): void {
4848
4949 $ this ->assertSame ('ordered_numeric ' , $ resolved ->getEffectiveValue ());
5050 $ this ->assertSame ('group ' , $ resolved ->getSourceScope ());
51- $ this ->assertTrue ($ resolved ->isEditableByCurrentActor ());
51+ $ this ->assertFalse ($ resolved ->isEditableByCurrentActor ());
5252 $ this ->assertTrue ($ resolved ->canSaveAsUserDefault ());
5353 $ this ->assertTrue ($ resolved ->canUseAsRequestOverride ());
5454 }
@@ -140,7 +140,7 @@ public function testResolveValueChoiceUnionsConflictingGroupValues(): void {
140140 $ this ->assertSame ('parallel ' , $ resolved ->getEffectiveValue ());
141141 $ this ->assertSame ('group ' , $ resolved ->getSourceScope ());
142142 $ this ->assertSame (['parallel ' , 'ordered_numeric ' ], $ resolved ->getAllowedValues ());
143- $ this ->assertTrue ($ resolved ->isEditableByCurrentActor ());
143+ $ this ->assertFalse ($ resolved ->isEditableByCurrentActor ());
144144 $ this ->assertTrue ($ resolved ->canSaveAsUserDefault ());
145145 $ this ->assertTrue ($ resolved ->canUseAsRequestOverride ());
146146 }
@@ -198,6 +198,53 @@ public function testResolveDoesNotApplyGroupValueWhenSystemBlocksOverride(): voi
198198 $ this ->assertSame ('ordered_numeric ' , $ resolved ->getEffectiveValue ());
199199 $ this ->assertSame ('system ' , $ resolved ->getSourceScope ());
200200 $ this ->assertSame (['ordered_numeric ' ], $ resolved ->getAllowedValues ());
201+ $ this ->assertFalse ($ resolved ->isEditableByCurrentActor ());
202+ $ this ->assertFalse ($ resolved ->canUseAsRequestOverride ());
203+ }
204+
205+ public function testResolveMarksPolicyEditableForSystemAdminEvenWhenChildrenCannotOverride (): void {
206+ $ source = new InMemoryPolicySource ();
207+ $ source ->systemLayer = (new PolicyLayer ())
208+ ->setScope ('system ' )
209+ ->setValue ('ordered_numeric ' )
210+ ->setAllowChildOverride (false )
211+ ->setVisibleToChild (true )
212+ ->setAllowedValues (['ordered_numeric ' ]);
213+
214+ $ context = PolicyContext::fromUserId ('admin ' )
215+ ->setActorCapabilities ([
216+ 'canManageSystemPolicies ' => true ,
217+ 'canManageGroupPolicies ' => true ,
218+ ]);
219+
220+ $ resolver = new DefaultPolicyResolver ($ source );
221+ $ resolved = $ resolver ->resolve ($ this ->getDefinition (), $ context );
222+
223+ $ this ->assertTrue ($ resolved ->isEditableByCurrentActor ());
224+ $ this ->assertFalse ($ resolved ->canSaveAsUserDefault ());
225+ $ this ->assertFalse ($ resolved ->canUseAsRequestOverride ());
226+ }
227+
228+ public function testResolveMarksPolicyEditableForGroupAdminEvenWhenChildrenCannotOverride (): void {
229+ $ source = new InMemoryPolicySource ();
230+ $ source ->systemLayer = (new PolicyLayer ())
231+ ->setScope ('system ' )
232+ ->setValue ('ordered_numeric ' )
233+ ->setAllowChildOverride (false )
234+ ->setVisibleToChild (true )
235+ ->setAllowedValues (['ordered_numeric ' ]);
236+
237+ $ context = PolicyContext::fromUserId ('manager ' )
238+ ->setActorCapabilities ([
239+ 'canManageSystemPolicies ' => false ,
240+ 'canManageGroupPolicies ' => true ,
241+ ]);
242+
243+ $ resolver = new DefaultPolicyResolver ($ source );
244+ $ resolved = $ resolver ->resolve ($ this ->getDefinition (), $ context );
245+
246+ $ this ->assertTrue ($ resolved ->isEditableByCurrentActor ());
247+ $ this ->assertFalse ($ resolved ->canSaveAsUserDefault ());
201248 $ this ->assertFalse ($ resolved ->canUseAsRequestOverride ());
202249 }
203250
0 commit comments