once() ->with(Access::OPTION, ['administrator']) ->andReturn(['administrator']); self::assertSame(['administrator'], (new Access())->allowedRoles()); } public function testRoleListIsFilterable(): void { Functions\when('get_option')->justReturn(['administrator']); Filters\expectApplied('lit_mcp_allowed_roles') ->once() ->andReturn(['administrator', 'editor']); self::assertSame(['administrator', 'editor'], (new Access())->allowedRoles()); } public function testGrantsCapabilityToAllowedRole(): void { Functions\when('get_option')->justReturn(['editor']); $caps = (new Access())->grantCapability( [], [Access::CAPABILITY], [], new WP_User(5, ['editor']) ); self::assertTrue($caps[Access::CAPABILITY]); } public function testDoesNotGrantCapabilityToOtherRoles(): void { Functions\when('get_option')->justReturn(['administrator']); $caps = (new Access())->grantCapability( [], [Access::CAPABILITY], [], new WP_User(7, ['subscriber']) ); self::assertArrayNotHasKey(Access::CAPABILITY, $caps); } public function testCorruptOptionFallsBackToAdministrator(): void { Functions\when('get_option')->justReturn('not-an-array'); self::assertSame(['administrator'], (new Access())->allowedRoles()); } public function testRegisterRoutesAdapterMetaToolCapabilitiesToOwnCapability(): void { // Brain Monkey records add_filter() but never runs callbacks, so we // capture each registered callback and invoke it ourselves. foreach (['discover_abilities', 'get_ability_info', 'execute_ability'] as $tool) { Filters\expectAdded("mcp_adapter_{$tool}_capability") ->once() ->whenHappen(static function (callable $callback): void { self::assertSame(Access::CAPABILITY, $callback('read')); }); } $access = new Access(); $access->register(); self::assertNotFalse(has_filter('user_has_cap', [$access, 'grantCapability'])); } }