justReturn(true); } protected function tearDown(): void { RequestContext::reset(); parent::tearDown(); } /** @param list $ids */ private function permission(array $ids): bool|WP_Error { $ability = Mockery::mock(Ability::class, DeclaresRequirements::class); $ability->allows('name')->andReturn('lit/test'); $ability->allows('label')->andReturn('Test'); $ability->allows('description')->andReturn('Test'); $ability->allows('inputSchema')->andReturn(['type' => 'object', 'properties' => []]); $ability->allows('outputSchema')->andReturn(null); $ability->allows('annotations')->andReturn(['readonly' => true]); $ability->allows('isDirect')->andReturn(true); $ability->allows('requirements')->andReturn($ids); $ability->allows('permission')->andReturn(true); $free = new Profile(id: 'fake', label: 'Fake Plugin', tier: Tier::LockOnFailure, capabilities: [FakeCapability::Read]); $compat = new Compatibility([DiviProfile::profile(), PodsCompatibility::profile(), $free]); $integration = Mockery::mock(Integration::class); $integration->allows('id')->andReturn('core'); $integration->allows('isAvailable')->andReturn(true); $integration->allows('abilities')->andReturn([$ability]); $registrar = new AbilityRegistrar( new IntegrationRegistry($integration), null, [new DiviFeatureGate(FakeChangeLog::forbidden()), new CapabilityGate($compat, FakeChangeLog::forbidden())] ); return ($registrar->argsFor($ability)['permission_callback'])([]); } public function testAFreeNonDiviIdPassesTheDiviGateAndTheCapabilityGate(): void { self::assertTrue($this->permission(['fake-read'])); } public function testALockedPodsIdPassesTheDiviGateAndIsRefusedByTheCapabilityGate(): void { DiviFeatureFixtures::useStates([]); $error = $this->permission(['pods-field-read']); self::assertToolError($error, 'compat_incompatible'); } public function testAnUnknownIdIsRefusedByTheCapabilityGate(): void { DiviFeatureFixtures::useStates([]); $payload = self::assertToolError($this->permission(['page-write', 'nobody-knows-me']), 'compat_incompatible'); self::assertSame(['nobody-knows-me'], $payload['unknown']); } public function testAReleasedDiviIdPassesBothGates(): void { DiviFeatureFixtures::useStates([]); self::assertTrue($this->permission(['page-write'])); } public function testALockedDiviIdIsRefusedByTheDiviGateAloneNotTwice(): void { DiviFeatureFixtures::lock(DiviFeature::PageWrite); self::assertToolError($this->permission(['page-write']), 'divi_untested'); } }