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.', ]; } }