fix: full-form internal links follow the {{link:}} target rules (ruling P10)
One PostIdParser for {{link:}} and select_post; post_link_url_<type> needs a
living, readable, non-attachment target of exactly that type.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,9 @@ final class WpLinkTargetsTest extends TestCase
|
||||
842 => new WP_Post(['ID' => 842, 'post_type' => 'page', 'post_status' => 'private']),
|
||||
843 => new WP_Post(['ID' => 843, 'post_type' => 'revision', 'post_status' => 'inherit']),
|
||||
844 => new WP_Post(['ID' => 844, 'post_type' => 'page', 'post_status' => 'auto-draft']),
|
||||
845 => new WP_Post(['ID' => 845, 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_parent' => 0]),
|
||||
846 => new WP_Post(['ID' => 846, 'post_type' => 'attachment', 'post_status' => 'trash']),
|
||||
847 => new WP_Post(['ID' => 847, 'post_type' => 'attachment', 'post_status' => 'private']),
|
||||
];
|
||||
Functions\when('get_post')->alias(static fn (int $id): ?WP_Post => $posts[$id] ?? null);
|
||||
Functions\when('current_user_can')->alias(
|
||||
@@ -33,5 +36,8 @@ final class WpLinkTargetsTest extends TestCase
|
||||
self::assertNull($links->postTypeOf(843), 'revision');
|
||||
self::assertNull($links->postTypeOf(844), 'auto-draft');
|
||||
self::assertNull($links->postTypeOf(900), 'missing');
|
||||
self::assertNull($links->postTypeOf(845), 'unattached attachment');
|
||||
self::assertNull($links->postTypeOf(846), 'trashed attachment');
|
||||
self::assertNull($links->postTypeOf(847), 'attachment with an own status (ruling P10: no attachment)');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ namespace LIT\MCP\Tests\Unit\Integrations\Divi\Pages;
|
||||
use Brain\Monkey\Functions;
|
||||
use LIT\MCP\Integrations\Divi\Pages\WpValueSanitizer;
|
||||
use LIT\MCP\Tests\Unit\TestCase;
|
||||
use WP_Post;
|
||||
|
||||
final class WpValueSanitizerTest extends TestCase
|
||||
{
|
||||
@@ -55,5 +56,32 @@ final class WpValueSanitizerTest extends TestCase
|
||||
self::assertTrue($sanitizer->canReadPost(12));
|
||||
self::assertFalse($sanitizer->canReadPost(13));
|
||||
}
|
||||
}
|
||||
|
||||
/** Ruling P10: the full form uses the {{link:}} targets – attachments, trash and unreadable entries are none. */
|
||||
public function testLinkTargetTypeFollowsTheLinkTargets(): void
|
||||
{
|
||||
Functions\when('get_post')->alias(static fn (int $id): ?WP_Post => match ($id) {
|
||||
12 => new WP_Post(['ID' => 12, 'post_type' => 'page', 'post_status' => 'draft']),
|
||||
13 => new WP_Post(['ID' => 13, 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_parent' => 12]),
|
||||
14 => new WP_Post(['ID' => 14, 'post_type' => 'page', 'post_status' => 'trash']),
|
||||
16 => new WP_Post(['ID' => 16, 'post_type' => 'page', 'post_status' => 'private']),
|
||||
17 => new WP_Post(['ID' => 17, 'post_type' => 'attachment', 'post_status' => 'inherit', 'post_parent' => 0]),
|
||||
18 => new WP_Post(['ID' => 18, 'post_type' => 'attachment', 'post_status' => 'trash', 'post_parent' => 0]),
|
||||
19 => new WP_Post(['ID' => 19, 'post_type' => 'attachment', 'post_status' => 'private', 'post_parent' => 0]),
|
||||
20 => new WP_Post(['ID' => 20, 'post_type' => 'post', 'post_status' => 'publish']),
|
||||
default => null,
|
||||
});
|
||||
Functions\when('current_user_can')->alias(static fn (string $cap, int $id): bool => $id !== 16);
|
||||
$sanitizer = new WpValueSanitizer();
|
||||
|
||||
self::assertSame('page', $sanitizer->linkTargetType(12));
|
||||
self::assertSame('post', $sanitizer->linkTargetType(20));
|
||||
self::assertNull($sanitizer->linkTargetType(13), 'attached attachment');
|
||||
self::assertNull($sanitizer->linkTargetType(14), 'trashed');
|
||||
self::assertNull($sanitizer->linkTargetType(15), 'missing');
|
||||
self::assertNull($sanitizer->linkTargetType(16), 'unreadable');
|
||||
self::assertNull($sanitizer->linkTargetType(17), 'unattached attachment');
|
||||
self::assertNull($sanitizer->linkTargetType(18), 'trashed attachment');
|
||||
self::assertNull($sanitizer->linkTargetType(19), 'attachment with an own status');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user