id()); self::assertFalse($integration->isAvailable(), 'no Divi classes in unit tests'); self::assertSame( self::EXPECTED, array_map(static fn (Ability $ability): string => $ability->name(), $integration->abilities()) ); foreach ($integration->abilities() as $ability) { self::assertSame('object', $ability->inputSchema()['type'], $ability->name()); self::assertFalse($ability->inputSchema()['additionalProperties'], $ability->name()); self::assertNotNull($ability->outputSchema(), $ability->name()); } } public function testGivesContentCreateTheDiviShortForm(): void { $integration = new DiviIntegration(Mockery::mock(ContentSchema::class), FakeChangeLog::forbidden()); $composer = $integration->contentComposer(); self::assertInstanceOf(DiviContentComposer::class, $composer); self::assertFalse($composer->available(), 'no Divi classes in unit tests'); } /** E1/E3: the Divi read tools reach library entries; ruling P9: a hidden library leaves them not found. */ public function testTheReadToolsReachTheLibraryUnlessItIsHidden(): void { LibraryFixtures::given([LibraryFixtures::item(1055)]); $schema = Mockery::mock(ContentSchema::class); $schema->allows('isManaged')->andReturn(false); $outline = static fn (DiviIntegration $divi): mixed => $divi->abilities()[0]->permission(['post_id' => 1055]); // No Divi in unit tests: DiviRoles allows nothing, so a reachable entry is refused, not missing. $visible = new DiviIntegration($schema, FakeChangeLog::forbidden(), null, static fn (): bool => true); self::assertToolError($outline($visible), 'forbidden'); self::assertToolError($outline(new DiviIntegration($schema, FakeChangeLog::forbidden())), 'forbidden'); $hidden = new DiviIntegration($schema, FakeChangeLog::forbidden(), libraryVisible: static fn (): bool => false); $refusal = $outline($hidden); self::assertInstanceOf(WP_Error::class, $refusal); self::assertToolError($refusal, 'not_found'); } }