fields();
$this->assertCount(2, $fields);
$this->assertSame('label', $fields[0]['key']);
$this->assertSame('text', $fields[0]['control']);
$this->assertSame('url', $fields[1]['key']);
$this->assertSame('link', $fields[1]['control']);
}
public function test_apply_label_strips_tags_and_sets_attr()
{
$block = $this->navLinkBlock(['label' => 'old']);
$result = (new NavigationLink())->apply($block, 'label', ' About us ');
$this->assertSame('About us', $result['attrs']['label']);
}
public function test_apply_label_with_non_string_becomes_empty()
{
$block = $this->navLinkBlock(['label' => 'old']);
$result = (new NavigationLink())->apply($block, 'label', null);
$this->assertSame('', $result['attrs']['label']);
}
public function test_apply_url_sets_attr()
{
$block = $this->navLinkBlock([]);
$result = (new NavigationLink())->apply($block, 'url', 'https://example.test/about');
$this->assertSame('https://example.test/about', $result['attrs']['url']);
}
public function test_apply_url_strips_dangerous_schemes()
{
foreach (['javascript:alert(1)', 'data:text/html,', 'vbscript:msgbox(1)'] as $url) {
$block = $this->navLinkBlock([]);
// esc_url_raw rejects the scheme → empty → attr left unset.
$result = (new NavigationLink())->apply($block, 'url', $url);
$this->assertArrayNotHasKey('url', $result['attrs'], "url: {$url}");
}
}
public function test_apply_label_strips_script_tags()
{
$block = $this->navLinkBlock([]);
$result = (new NavigationLink())->apply($block, 'label', 'Home');
$this->assertSame('Home', $result['attrs']['label']);
}
public function test_apply_url_empty_string_unsets_attr()
{
$block = $this->navLinkBlock(['url' => 'https://example.test/old']);
$result = (new NavigationLink())->apply($block, 'url', '');
$this->assertArrayNotHasKey('url', $result['attrs']);
}
public function test_apply_with_unknown_field_returns_block_unchanged()
{
$block = $this->navLinkBlock(['label' => 'About']);
$this->assertSame($block, (new NavigationLink())->apply($block, 'kind', 'post'));
}
private function navLinkBlock(array $attrs): array
{
return [
'blockName' => 'core/navigation-link',
'attrs' => $attrs,
'innerBlocks' => [],
'innerHTML' => '',
'innerContent' => [],
];
}
}