registry = $this->createMock(RegistryInterface::class); $this->session = $this->createMock(SessionInterface::class); $this->handler = new CompletionCompleteHandler($this->registry); } public function testReturnsEmptyCompletionForResourceWithoutTemplate(): void { $uri = 'file://static/readme.txt'; $request = $this->createCompletionRequest($uri, ['name' => 'arg', 'value' => 'a']); $this->registry ->expects($this->once()) ->method('getResource') ->with($uri) ->willReturn($this->createMock(ResourceReference::class)); $response = $this->handler->handle($request, $this->session); $this->assertInstanceOf(Response::class, $response); $this->assertEquals($request->getId(), $response->id); $this->assertEquals(new CompletionCompleteResult([]), $response->result); } public function testReturnsCompletionsForResourceTemplate(): void { $uri = 'file://users/alice'; $request = $this->createCompletionRequest($uri, ['name' => 'id', 'value' => 'al']); $templateReference = new ResourceTemplateReference( new ResourceTemplate('file://users/{id}', 'user'), static fn () => null, ['id' => new CompletionProviderFixture()], ); $this->registry ->expects($this->once()) ->method('getResource') ->with($uri) ->willReturn($templateReference); $response = $this->handler->handle($request, $this->session); $this->assertInstanceOf(Response::class, $response); $this->assertEquals(new CompletionCompleteResult(['alpha'], 1, false), $response->result); } /** * @param array{ name: string, value: string } $argument */ private function createCompletionRequest(string $uri, array $argument): CompletionCompleteRequest { return CompletionCompleteRequest::fromArray([ 'jsonrpc' => '2.0', 'method' => CompletionCompleteRequest::getMethod(), 'id' => 'test-completion-'.uniqid(), 'params' => [ 'ref' => ['type' => 'ref/resource', 'uri' => $uri], 'argument' => $argument, ], ]); } }