refactor(action-context): remove unused fragment aggregator + building block
actionFragmentContext was built spec-driven in step 1 to handle the anticipated drawer-fragment pattern: authorize + finder → status DTO. The action-context rollout (steps 2-11) found that none of the three real drawer fragments (users/view-fragment, addressbook/view-fragment, helpdesk/ticket-fragment) match that pattern — all three delegate to domain services that own their own status models. Step 11 declared them structural exceptions; the helper code remained unused. This commit removes the dead spec: * core/Support/helpers/action_context.php drops actionFragmentContext (~9 LOC) and its building block actionFragmentResolveOrStatus (~30 LOC) plus their docblocks. The MUST-call-actionRequireCsrf warning, present in three aggregator docblocks before, now appears twice (one per remaining aggregator). * tests/Support/Helpers/ActionContextHelperTest.php drops the six unit tests that exercised these functions (~83 LOC). * tests/Architecture/ActionContextHelperContractTest.php drops the fragment building block from the buildingBlocks() data provider (5 entries instead of 6) and removes testFragmentResolveReturnDocblockIsFrozen. The CSRF-warning expectation is updated from 3 to 2 with a code comment explaining the rollback. Verified: * No production caller exists in pages/ or modules/. * All 9 aggregator callers (5 actionEditContext + 4 actionCreateContext) remain unchanged. * ActionContextCsrfPairingContractTest and DetailDrawerFragmentContractTest are deliberately left untouched: their allowlists/recognizer regexes still mention actionFragmentContext, but the patterns now match an empty set — harmless dead text. Documented as open items in the run report; future cleanup is optional and orthogonal to this removal. * QGs all green (PHPUnit 2088 tests, PHPStan level 5, CS-fixer 0 diffs). Net: 3 files, +31/-198 LOC, behavior unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -234,57 +234,6 @@ class ActionContextHelperTest extends TestCase
|
||||
$this->assertSame(['page' => ['can_view_page' => true]], $result);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* actionFragmentResolveOrStatus
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
public function testFragmentResolveReturnsOkWithModelAndCapabilities(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::allow([
|
||||
'capabilities' => ['can_view' => true],
|
||||
]));
|
||||
$finder = static fn (string $id): array => ['id' => $id];
|
||||
|
||||
$r = actionFragmentResolveOrStatus($finder, 'abc-123', 'ABILITY_VIEW', []);
|
||||
|
||||
$this->assertSame('ok', $r['status']);
|
||||
$this->assertSame(['id' => 'abc-123'], $r['model'] ?? null);
|
||||
$this->assertSame(['can_view' => true], $r['capabilities'] ?? null);
|
||||
}
|
||||
|
||||
public function testFragmentResolveReturnsForbidden(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::deny());
|
||||
$finder = static fn (string $id): array => ['id' => $id];
|
||||
|
||||
$r = actionFragmentResolveOrStatus($finder, 'abc', 'ABILITY_VIEW', []);
|
||||
|
||||
$this->assertSame('forbidden', $r['status']);
|
||||
$this->assertSame(403, $r['http_code'] ?? null);
|
||||
}
|
||||
|
||||
public function testFragmentResolveReturnsNotFound(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::allow());
|
||||
$finder = static fn (): mixed => null;
|
||||
|
||||
$r = actionFragmentResolveOrStatus($finder, 'abc', 'ABILITY_VIEW', []);
|
||||
|
||||
$this->assertSame('not_found', $r['status']);
|
||||
$this->assertSame(404, $r['http_code'] ?? null);
|
||||
}
|
||||
|
||||
public function testFragmentResolveReturnsInvalidIdForBlankRawId(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::allow());
|
||||
$finder = static fn (): mixed => null;
|
||||
|
||||
$r = actionFragmentResolveOrStatus($finder, ' ', 'ABILITY_VIEW', []);
|
||||
|
||||
$this->assertSame('invalid_id', $r['status']);
|
||||
$this->assertSame(400, $r['http_code'] ?? null);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Aggregator: actionEditContext
|
||||
* ---------------------------------------------------------------- */
|
||||
@@ -449,42 +398,6 @@ class ActionContextHelperTest extends TestCase
|
||||
$this->assertStringContainsString('error/forbidden', $this->capturedRedirect());
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* Aggregator: actionFragmentContext
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
public function testFragmentContextOk(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::allow([
|
||||
'capabilities' => ['can_view' => true],
|
||||
]));
|
||||
|
||||
$result = actionFragmentContext([
|
||||
'finder' => static fn (string $id): array => ['uuid' => $id],
|
||||
'rawId' => 'u-1',
|
||||
'abilityKey' => 'ABILITY_VIEW',
|
||||
'context' => [],
|
||||
]);
|
||||
|
||||
$this->assertSame('ok', $result['status']);
|
||||
$this->assertSame(['uuid' => 'u-1'], $result['model'] ?? null);
|
||||
}
|
||||
|
||||
public function testFragmentContextForbidden(): void
|
||||
{
|
||||
$this->stubAuthorizationService(static fn (): AuthorizationDecision => AuthorizationDecision::deny());
|
||||
|
||||
$result = actionFragmentContext([
|
||||
'finder' => static fn (string $id): array => ['uuid' => $id],
|
||||
'rawId' => 'u-1',
|
||||
'abilityKey' => 'ABILITY_VIEW',
|
||||
'context' => [],
|
||||
]);
|
||||
|
||||
$this->assertSame('forbidden', $result['status']);
|
||||
$this->assertSame(403, $result['http_code'] ?? null);
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------
|
||||
* helpers
|
||||
* ---------------------------------------------------------------- */
|
||||
|
||||
Reference in New Issue
Block a user