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()); } public function testGroupsAbilitiesByIntegrationIdAndMapsNamesToGroups(): void { $guide = $this->ability('lit/guide', true); $outline = $this->ability('lit/divi-outline', true); $hidden = $this->ability('lit/pods-x', true); $divi = Mockery::mock(Integration::class); $divi->allows('id')->andReturn('divi'); $divi->allows('isAvailable')->andReturn(true); $divi->expects('abilities')->once()->andReturn([$outline]); $registry = new IntegrationRegistry( $this->integration('core', true, [$guide]), $divi, $this->integration('pods', false, [$hidden]) ); self::assertSame([$guide, $outline], $registry->abilities()); self::assertSame(['core' => [$guide], 'divi' => [$outline]], $registry->grouped()); self::assertSame(['lit/guide' => 'core', 'lit/divi-outline' => 'divi'], $registry->groupMap()); self::assertSame(['core', 'divi', 'pods'], $registry->ids()); } public function testLabelsOfTheAvailableIntegrations(): void { $core = $this->integration('core', true, []); $core->allows('label')->andReturn('Grundlagen'); $registry = new IntegrationRegistry($core, $this->integration('pods', false, [])); self::assertSame(['core' => 'Grundlagen'], $registry->labels()); } /** M9: the integrations own their admin labels (formerly hard-coded in ToolsTab). */ public function testEveryIntegrationNamesItsGroup(): void { Functions\stubTranslationFunctions(); $schema = Mockery::mock(ContentSchema::class); self::assertSame('Grundlagen', (new CoreIntegration(''))->label()); self::assertSame('WordPress', (new WordPressIntegration($schema, FakeChangeLog::forbidden()))->label()); self::assertSame('Medien', (new MediaIntegration($schema, FakeChangeLog::forbidden(), new Limits()))->label()); self::assertSame('Divi', (new DiviIntegration($schema, FakeChangeLog::forbidden()))->label()); } 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; } }