Skip to content

Commit ac3e1e1

Browse files
author
larry.sulebalogun
committed
10 - Add the list resource handler, and it's test as well
1 parent ffc132c commit ac3e1e1

File tree

2 files changed

+45
-30
lines changed

2 files changed

+45
-30
lines changed

src/Server/RequestHandler/ListResourcesHandler.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
namespace Mcp\Server\RequestHandler;
1313

1414
use Mcp\Capability\Registry;
15+
use Mcp\Exception\InvalidCursorException;
1516
use Mcp\Schema\JsonRpc\HasMethodInterface;
1617
use Mcp\Schema\JsonRpc\Response;
1718
use Mcp\Schema\Request\ListResourcesRequest;
19+
use Mcp\Schema\Resource;
1820
use Mcp\Schema\Result\ListResourcesResult;
1921
use Mcp\Server\MethodHandlerInterface;
2022

@@ -34,6 +36,9 @@ public function supports(HasMethodInterface $message): bool
3436
return $message instanceof ListResourcesRequest;
3537
}
3638

39+
/**
40+
* @throws InvalidCursorException
41+
*/
3742
public function handle(ListResourcesRequest|HasMethodInterface $message): Response
3843
{
3944
\assert($message instanceof ListResourcesRequest);

tests/Server/RequestHandler/ListResourcesHandlerTest.php

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,15 @@ public function testReturnsFirstPageWhenNoCursorProvided(): void
4242
$response = $this->handler->handle($request);
4343

4444
// Assert
45-
$this->assertInstanceOf(ListResourcesResult::class, $response->result);
46-
$this->assertCount(3, $response->result->resources);
47-
$this->assertNotNull($response->result->nextCursor);
48-
49-
$this->assertEquals('resource://test/resource_0', $response->result->resources[0]->uri);
50-
$this->assertEquals('resource://test/resource_1', $response->result->resources[1]->uri);
51-
$this->assertEquals('resource://test/resource_2', $response->result->resources[2]->uri);
45+
/** @var ListResourcesResult $result */
46+
$result = $response->result;
47+
$this->assertInstanceOf(ListResourcesResult::class, $result);
48+
$this->assertCount(3, $result->resources);
49+
$this->assertNotNull($result->nextCursor);
50+
51+
$this->assertEquals('resource://test/resource_0', $result->resources[0]->uri);
52+
$this->assertEquals('resource://test/resource_1', $result->resources[1]->uri);
53+
$this->assertEquals('resource://test/resource_2', $result->resources[2]->uri);
5254
}
5355

5456
#[TestDox('Returns paginated resources with cursor')]
@@ -62,13 +64,15 @@ public function testReturnsPaginatedResourcesWithCursor(): void
6264
$response = $this->handler->handle($request);
6365

6466
// Assert
65-
$this->assertInstanceOf(ListResourcesResult::class, $response->result);
66-
$this->assertCount(3, $response->result->resources);
67-
$this->assertNotNull($response->result->nextCursor);
68-
69-
$this->assertEquals('resource://test/resource_0', $response->result->resources[0]->uri);
70-
$this->assertEquals('resource://test/resource_1', $response->result->resources[1]->uri);
71-
$this->assertEquals('resource://test/resource_2', $response->result->resources[2]->uri);
67+
/** @var ListResourcesResult $result */
68+
$result = $response->result;
69+
$this->assertInstanceOf(ListResourcesResult::class, $result);
70+
$this->assertCount(3, $result->resources);
71+
$this->assertNotNull($result->nextCursor);
72+
73+
$this->assertEquals('resource://test/resource_0', $result->resources[0]->uri);
74+
$this->assertEquals('resource://test/resource_1', $result->resources[1]->uri);
75+
$this->assertEquals('resource://test/resource_2', $result->resources[2]->uri);
7276
}
7377

7478
#[TestDox('Returns second page with cursor')]
@@ -85,13 +89,15 @@ public function testReturnsSecondPageWithCursor(): void
8589
$response = $this->handler->handle($secondPageRequest);
8690

8791
// Assert
88-
$this->assertInstanceOf(ListResourcesResult::class, $response->result);
89-
$this->assertCount(3, $response->result->resources);
90-
$this->assertNotNull($response->result->nextCursor);
91-
92-
$this->assertEquals('resource://test/resource_3', $response->result->resources[0]->uri);
93-
$this->assertEquals('resource://test/resource_4', $response->result->resources[1]->uri);
94-
$this->assertEquals('resource://test/resource_5', $response->result->resources[2]->uri);
92+
/** @var ListResourcesResult $result */
93+
$result = $response->result;
94+
$this->assertInstanceOf(ListResourcesResult::class, $result);
95+
$this->assertCount(3, $result->resources);
96+
$this->assertNotNull($result->nextCursor);
97+
98+
$this->assertEquals('resource://test/resource_3', $result->resources[0]->uri);
99+
$this->assertEquals('resource://test/resource_4', $result->resources[1]->uri);
100+
$this->assertEquals('resource://test/resource_5', $result->resources[2]->uri);
95101
}
96102

97103
#[TestDox('Returns last page with null cursor')]
@@ -108,12 +114,14 @@ public function testReturnsLastPageWithNullCursor(): void
108114
$response = $this->handler->handle($secondPageRequest);
109115

110116
// Assert
111-
$this->assertInstanceOf(ListResourcesResult::class, $response->result);
112-
$this->assertCount(2, $response->result->resources);
113-
$this->assertNull($response->result->nextCursor);
114-
115-
$this->assertEquals('resource://test/resource_3', $response->result->resources[0]->uri);
116-
$this->assertEquals('resource://test/resource_4', $response->result->resources[1]->uri);
117+
/** @var ListResourcesResult $result */
118+
$result = $response->result;
119+
$this->assertInstanceOf(ListResourcesResult::class, $result);
120+
$this->assertCount(2, $result->resources);
121+
$this->assertNull($result->nextCursor);
122+
123+
$this->assertEquals('resource://test/resource_3', $result->resources[0]->uri);
124+
$this->assertEquals('resource://test/resource_4', $result->resources[1]->uri);
117125
}
118126

119127
#[TestDox('Handles empty registry')]
@@ -126,9 +134,11 @@ public function testHandlesEmptyRegistry(): void
126134
$response = $this->handler->handle($request);
127135

128136
// Assert
129-
$this->assertInstanceOf(ListResourcesResult::class, $response->result);
130-
$this->assertCount(0, $response->result->resources);
131-
$this->assertNull($response->result->nextCursor);
137+
/** @var ListResourcesResult $result */
138+
$result = $response->result;
139+
$this->assertInstanceOf(ListResourcesResult::class, $result);
140+
$this->assertCount(0, $result->resources);
141+
$this->assertNull($result->nextCursor);
132142
}
133143

134144
#[TestDox('Throws exception for invalid cursor')]

0 commit comments

Comments
 (0)