Skip to content

Commit aafac3d

Browse files
authored
Feat: Improve invalid resource template messages (#245)
1 parent 0b1d038 commit aafac3d

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

src/Schema/ResourceTemplate.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ public function __construct(
5959
public readonly ?array $meta = null,
6060
) {
6161
if (!preg_match(self::RESOURCE_NAME_PATTERN, $name)) {
62-
throw new InvalidArgumentException('Invalid resource name: must contain only alphanumeric characters, underscores, and hyphens.');
62+
throw new InvalidArgumentException(\sprintf('Invalid resource name "%s": must contain only alphanumeric characters, underscores, and hyphens.', $name));
6363
}
6464
if (!preg_match(self::URI_TEMPLATE_PATTERN, $uriTemplate)) {
65-
throw new InvalidArgumentException('Invalid URI template: must be a valid URI template with at least one placeholder.');
65+
throw new InvalidArgumentException(\sprintf('Invalid URI template : "%s" must be a valid URI template with at least one placeholder.', $uriTemplate));
6666
}
6767
}
6868

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the official PHP MCP SDK.
5+
*
6+
* A collaboration between Symfony and the PHP Foundation.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Mcp\Tests\Unit\Schema;
13+
14+
use Mcp\Exception\InvalidArgumentException;
15+
use Mcp\Schema\ResourceTemplate;
16+
use PHPUnit\Framework\Attributes\DataProvider;
17+
use PHPUnit\Framework\TestCase;
18+
19+
class ResourceTemplateTest extends TestCase
20+
{
21+
private const VALID_URI = 'https://example.com/list-books/{id}';
22+
23+
public function testConstructorValid(): void
24+
{
25+
$uri = self::VALID_URI;
26+
27+
$resource = new ResourceTemplate(
28+
uriTemplate: $uri,
29+
name: 'list-books',
30+
);
31+
32+
$this->assertInstanceOf(ResourceTemplate::class, $resource);
33+
$this->assertSame($uri, $resource->uriTemplate);
34+
}
35+
36+
public function testConstructorInvalid(): void
37+
{
38+
$uri = '/list-books';
39+
40+
$this->expectException(InvalidArgumentException::class);
41+
$this->expectExceptionMessage('Invalid URI template : "/list-books" must be a valid URI template with at least one placeholder.');
42+
43+
$resource = new ResourceTemplate(
44+
uriTemplate: $uri,
45+
name: 'list-books',
46+
);
47+
}
48+
49+
public function testFromArrayValid(): void
50+
{
51+
$resource = ResourceTemplate::fromArray([
52+
'uriTemplate' => self::VALID_URI,
53+
'name' => 'list-books',
54+
]);
55+
56+
$this->assertInstanceOf(ResourceTemplate::class, $resource);
57+
$this->assertSame(self::VALID_URI, $resource->uriTemplate);
58+
$this->assertSame('list-books', $resource->name);
59+
$this->assertNull($resource->description);
60+
$this->assertNull($resource->meta);
61+
}
62+
63+
#[DataProvider('provideInvalidResources')]
64+
public function testFromArrayInvalid(array $input, string $expectedExceptionMessage): void
65+
{
66+
$this->expectException(InvalidArgumentException::class);
67+
$this->expectExceptionMessage($expectedExceptionMessage);
68+
69+
ResourceTemplate::fromArray($input);
70+
}
71+
72+
public static function provideInvalidResources(): iterable
73+
{
74+
yield 'missing uri' => [[], 'Invalid or missing "uriTemplate" in ResourceTemplate data.'];
75+
yield 'missing name' => [
76+
['uriTemplate' => self::VALID_URI],
77+
'Invalid or missing "name" in ResourceTemplate data.',
78+
];
79+
yield 'meta' => [
80+
[
81+
'uriTemplate' => self::VALID_URI,
82+
'name' => 'list-books',
83+
'_meta' => 'foo',
84+
],
85+
'Invalid "_meta" in ResourceTemplate data.',
86+
];
87+
}
88+
}

0 commit comments

Comments
 (0)