|
100 | 100 | 'capabilities' => [], |
101 | 101 | ] |
102 | 102 | ); |
103 | | - $this->session->shouldReceive('set')->with('client_info', Mockery::on(fn ($value) => $value->name === 'client' && $value->version === '1.0'))->once(); |
| 103 | + $this->session->shouldReceive('set')->with('client_info', Mockery::on(fn($value) => $value->name === 'client' && $value->version === '1.0'))->once(); |
104 | 104 |
|
105 | 105 | $result = $this->dispatcher->handleRequest($request, $this->session); |
106 | 106 | expect($result)->toBeInstanceOf(InitializeResult::class); |
|
143 | 143 | expect($result->capabilities)->toBeInstanceOf(ServerCapabilities::class); |
144 | 144 | }); |
145 | 145 |
|
| 146 | +it('can handle initialize request with older supported protocol version', function () { |
| 147 | + $clientInfo = Implementation::make('TestClient', '0.9.9'); |
| 148 | + $clientRequestedVersion = '2024-11-05'; |
| 149 | + $request = InitializeRequest::make(1, $clientRequestedVersion, ClientCapabilities::make(), $clientInfo, []); |
| 150 | + $this->session->shouldReceive('set')->with('client_info', $clientInfo)->once(); |
| 151 | + |
| 152 | + $result = $this->dispatcher->handleInitialize($request, $this->session); |
| 153 | + expect($result->protocolVersion)->toBe($clientRequestedVersion); |
| 154 | + expect($result->serverInfo->name)->toBe('DispatcherTestServer'); |
| 155 | + expect($result->capabilities)->toBeInstanceOf(ServerCapabilities::class); |
| 156 | +}); |
| 157 | + |
| 158 | +it('can handle initialize request with unsupported protocol version', function () { |
| 159 | + $clientInfo = Implementation::make('TestClient', '0.9.9'); |
| 160 | + $unsupportedVersion = '1999-01-01'; |
| 161 | + $request = InitializeRequest::make(1, $unsupportedVersion, ClientCapabilities::make(), $clientInfo, []); |
| 162 | + $this->session->shouldReceive('set')->with('client_info', $clientInfo)->once(); |
| 163 | + |
| 164 | + $result = $this->dispatcher->handleInitialize($request, $this->session); |
| 165 | + expect($result->protocolVersion)->toBe(Protocol::LATEST_PROTOCOL_VERSION); |
| 166 | + expect($result->serverInfo->name)->toBe('DispatcherTestServer'); |
| 167 | + expect($result->capabilities)->toBeInstanceOf(ServerCapabilities::class); |
| 168 | +}); |
| 169 | + |
146 | 170 | it('can handle tool list request and return paginated tools', function () { |
147 | 171 | $toolSchemas = [ |
148 | 172 | ToolSchema::make('tool1', ['type' => 'object', 'properties' => []]), |
|
256 | 280 | $requestP1 = ListResourcesRequest::make(1); |
257 | 281 | $resultP1 = $this->dispatcher->handleResourcesList($requestP1); |
258 | 282 | expect($resultP1->resources)->toHaveCount(DISPATCHER_PAGINATION_LIMIT); |
259 | | - expect(array_map(fn ($r) => $r->name, $resultP1->resources))->toEqual(['Resource1', 'Resource2', 'Resource3']); |
| 283 | + expect(array_map(fn($r) => $r->name, $resultP1->resources))->toEqual(['Resource1', 'Resource2', 'Resource3']); |
260 | 284 | expect($resultP1->nextCursor)->toBe(base64_encode('offset=3')); |
261 | 285 |
|
262 | 286 | // Page 2 |
263 | 287 | $requestP2 = ListResourcesRequest::make(2, $resultP1->nextCursor); |
264 | 288 | $resultP2 = $this->dispatcher->handleResourcesList($requestP2); |
265 | 289 | expect($resultP2->resources)->toHaveCount(2); |
266 | | - expect(array_map(fn ($r) => $r->name, $resultP2->resources))->toEqual(['Resource4', 'Resource5']); |
| 290 | + expect(array_map(fn($r) => $r->name, $resultP2->resources))->toEqual(['Resource4', 'Resource5']); |
267 | 291 | expect($resultP2->nextCursor)->toBeNull(); |
268 | 292 | }); |
269 | 293 |
|
|
288 | 312 | $requestP1 = ListResourceTemplatesRequest::make(1); |
289 | 313 | $resultP1 = $this->dispatcher->handleResourceTemplateList($requestP1); |
290 | 314 | expect($resultP1->resourceTemplates)->toHaveCount(DISPATCHER_PAGINATION_LIMIT); |
291 | | - expect(array_map(fn ($rt) => $rt->name, $resultP1->resourceTemplates))->toEqual(['Template1', 'Template2', 'Template3']); |
| 315 | + expect(array_map(fn($rt) => $rt->name, $resultP1->resourceTemplates))->toEqual(['Template1', 'Template2', 'Template3']); |
292 | 316 | expect($resultP1->nextCursor)->toBe(base64_encode('offset=3')); |
293 | 317 |
|
294 | 318 | // Page 2 |
295 | 319 | $requestP2 = ListResourceTemplatesRequest::make(2, $resultP1->nextCursor); |
296 | 320 | $resultP2 = $this->dispatcher->handleResourceTemplateList($requestP2); |
297 | 321 | expect($resultP2->resourceTemplates)->toHaveCount(1); |
298 | | - expect(array_map(fn ($rt) => $rt->name, $resultP2->resourceTemplates))->toEqual(['Template4']); |
| 322 | + expect(array_map(fn($rt) => $rt->name, $resultP2->resourceTemplates))->toEqual(['Template4']); |
299 | 323 | expect($resultP2->nextCursor)->toBeNull(); |
300 | 324 | }); |
301 | 325 |
|
|
345 | 369 | $requestP1 = ListPromptsRequest::make(1); |
346 | 370 | $resultP1 = $this->dispatcher->handlePromptsList($requestP1); |
347 | 371 | expect($resultP1->prompts)->toHaveCount(DISPATCHER_PAGINATION_LIMIT); |
348 | | - expect(array_map(fn ($p) => $p->name, $resultP1->prompts))->toEqual(['promptA', 'promptB', 'promptC']); |
| 372 | + expect(array_map(fn($p) => $p->name, $resultP1->prompts))->toEqual(['promptA', 'promptB', 'promptC']); |
349 | 373 | expect($resultP1->nextCursor)->toBe(base64_encode('offset=3')); |
350 | 374 |
|
351 | 375 | // Page 2 |
352 | 376 | $requestP2 = ListPromptsRequest::make(2, $resultP1->nextCursor); |
353 | 377 | $resultP2 = $this->dispatcher->handlePromptsList($requestP2); |
354 | 378 | expect($resultP2->prompts)->toHaveCount(DISPATCHER_PAGINATION_LIMIT); // 3 more |
355 | | - expect(array_map(fn ($p) => $p->name, $resultP2->prompts))->toEqual(['promptD', 'promptE', 'promptF']); |
| 379 | + expect(array_map(fn($p) => $p->name, $resultP2->prompts))->toEqual(['promptD', 'promptE', 'promptF']); |
356 | 380 | expect($resultP2->nextCursor)->toBeNull(); // End of list |
357 | 381 | }); |
358 | 382 |
|
|
0 commit comments