id()); self::assertTrue($integration->isAvailable()); self::assertSame( self::EXPECTED, array_map(static fn (Ability $ability): string => $ability->name(), $integration->abilities()) ); } public function testEveryAbilityHasAnObjectInputSchemaThatRejectsUnknownKeys(): void { $integration = new WordPressIntegration(Mockery::mock(ContentSchema::class), FakeChangeLog::forbidden()); foreach ($integration->abilities() as $ability) { $schema = $ability->inputSchema(); self::assertSame('object', $schema['type'], $ability->name()); self::assertFalse($schema['additionalProperties'], $ability->name()); self::assertMatchesRegularExpression('#^lit/[a-z]+(-[a-z]+)+$#', $ability->name()); } } public function testContentCreateGetsTheContentComposer(): void { Functions\when('get_post_type_object')->justReturn((object) ['cap' => (object) ['create_posts' => 'edit_pages']]); Functions\when('current_user_can')->justReturn(true); $schema = SchemaFixture::managed(); $composer = Mockery::mock(ContentComposer::class); $composer->expects('available')->andReturn(false); $integration = new WordPressIntegration($schema, FakeChangeLog::forbidden(), $composer); $create = array_values(array_filter( $integration->abilities(), static fn (Ability $ability): bool => $ability->name() === 'lit/content-create' ))[0]; $result = $create->execute(['post_type' => 'page', 'title' => 'Start', 'divi' => [['type' => 'section']]]); self::assertToolError($result, 'unsupported'); } }