ability('lit/a', true); $indirect = $this->ability('lit/b', false); $hidden = $this->ability('lit/c', true); $registry = new IntegrationRegistry( $this->integration('core', true, [$direct, $indirect]), $this->integration('divi', false, [$hidden]) ); self::assertSame(['core'], array_map(static fn ($i) => $i->id(), $registry->available())); self::assertSame([$direct, $indirect], $registry->abilities()); self::assertSame(['lit/a'], $registry->directAbilityNames()); } private function ability(string $name, bool $direct): Ability { $ability = Mockery::mock(Ability::class); $ability->allows('name')->andReturn($name); $ability->allows('isDirect')->andReturn($direct); return $ability; } /** @param list $abilities */ private function integration(string $id, bool $available, array $abilities): Integration { $integration = Mockery::mock(Integration::class); $integration->allows('id')->andReturn($id); $integration->allows('isAvailable')->andReturn($available); $integration->allows('abilities')->andReturn($abilities); return $integration; } }