justReturn('test-secret'); $token = JWT::encode([ 'sub' => '3', 'app_pass_id' => 'uuid-unknown', 'client_id' => 'https://claude.ai/oauth/mcp-oauth-client-metadata', 'exp' => time() + 60, ], 'test-secret'); RequestContext::recordRoute( null, [], new WP_REST_Request(self::ROUTE, ['authorization' => 'Bearer ' . $token]) ); self::assertSame('https://claude.ai/oauth/mcp-oauth-client-metadata', RequestContext::clientName()); } public function testClientNameIsEmptyForAnInvalidToken(): void { Functions\when('get_option')->justReturn('test-secret'); RequestContext::recordRoute(null, [], new WP_REST_Request(self::ROUTE, ['authorization' => 'Bearer garbage'])); self::assertSame('', RequestContext::clientName()); } public function testResetCanForceAClientName(): void { RequestContext::reset(true, 'Claude'); self::assertTrue(RequestContext::isOAuthServerRequest()); self::assertSame('Claude', RequestContext::clientName()); } public function testRegisterHooksBeforeAndAfterCallbacks(): void { Functions\expect('add_filter') ->once() ->with('rest_request_before_callbacks', [RequestContext::class, 'recordRoute'], 10, 3); Functions\expect('add_filter') ->once() ->with('rest_request_after_callbacks', [RequestContext::class, 'clearRoute'], 10, 3); (new RequestContext())->register(); } }