diff --git a/src/Schema/ResourceTemplate.php b/src/Schema/ResourceTemplate.php index 136b8b6e..b8c366dc 100644 --- a/src/Schema/ResourceTemplate.php +++ b/src/Schema/ResourceTemplate.php @@ -59,10 +59,10 @@ public function __construct( public readonly ?array $meta = null, ) { if (!preg_match(self::RESOURCE_NAME_PATTERN, $name)) { - throw new InvalidArgumentException('Invalid resource name: must contain only alphanumeric characters, underscores, and hyphens.'); + throw new InvalidArgumentException(\sprintf('Invalid resource name "%s": must contain only alphanumeric characters, underscores, and hyphens.', $name)); } if (!preg_match(self::URI_TEMPLATE_PATTERN, $uriTemplate)) { - throw new InvalidArgumentException('Invalid URI template: must be a valid URI template with at least one placeholder.'); + throw new InvalidArgumentException(\sprintf('Invalid URI template : "%s" must be a valid URI template with at least one placeholder.', $uriTemplate)); } } diff --git a/tests/Unit/Schema/ResourceTemplateTest.php b/tests/Unit/Schema/ResourceTemplateTest.php new file mode 100644 index 00000000..35391a12 --- /dev/null +++ b/tests/Unit/Schema/ResourceTemplateTest.php @@ -0,0 +1,88 @@ +assertInstanceOf(ResourceTemplate::class, $resource); + $this->assertSame($uri, $resource->uriTemplate); + } + + public function testConstructorInvalid(): void + { + $uri = '/list-books'; + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Invalid URI template : "/list-books" must be a valid URI template with at least one placeholder.'); + + $resource = new ResourceTemplate( + uriTemplate: $uri, + name: 'list-books', + ); + } + + public function testFromArrayValid(): void + { + $resource = ResourceTemplate::fromArray([ + 'uriTemplate' => self::VALID_URI, + 'name' => 'list-books', + ]); + + $this->assertInstanceOf(ResourceTemplate::class, $resource); + $this->assertSame(self::VALID_URI, $resource->uriTemplate); + $this->assertSame('list-books', $resource->name); + $this->assertNull($resource->description); + $this->assertNull($resource->meta); + } + + #[DataProvider('provideInvalidResources')] + public function testFromArrayInvalid(array $input, string $expectedExceptionMessage): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage($expectedExceptionMessage); + + ResourceTemplate::fromArray($input); + } + + public static function provideInvalidResources(): iterable + { + yield 'missing uri' => [[], 'Invalid or missing "uriTemplate" in ResourceTemplate data.']; + yield 'missing name' => [ + ['uriTemplate' => self::VALID_URI], + 'Invalid or missing "name" in ResourceTemplate data.', + ]; + yield 'meta' => [ + [ + 'uriTemplate' => self::VALID_URI, + 'name' => 'list-books', + '_meta' => 'foo', + ], + 'Invalid "_meta" in ResourceTemplate data.', + ]; + } +}