diff --git a/examples/shared/test/demoInMemoryOAuthProvider.test.ts b/examples/shared/test/demoInMemoryOAuthProvider.test.ts index 4018dddbe..52b2dda82 100644 --- a/examples/shared/test/demoInMemoryOAuthProvider.test.ts +++ b/examples/shared/test/demoInMemoryOAuthProvider.test.ts @@ -159,7 +159,7 @@ describe('DemoInMemoryAuthProvider', () => { const tokens = await provider.exchangeAuthorizationCode(validClient, code); - expect(tokens).toEqual({ + expect(tokens).toStrictEqual({ access_token: expect.any(String), token_type: 'bearer', expires_in: 3600, @@ -253,7 +253,7 @@ describe('DemoInMemoryAuthProvider', () => { await store.registerClient(client); const retrieved = await store.getClient('test-client'); - expect(retrieved).toEqual(client); + expect(retrieved).toStrictEqual(client); }); it('should return undefined for non-existent client', async () => { diff --git a/packages/client/test/client/auth.test.ts b/packages/client/test/client/auth.test.ts index cb01d37d5..7ef3655ff 100644 --- a/packages/client/test/client/auth.test.ts +++ b/packages/client/test/client/auth.test.ts @@ -45,7 +45,11 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({ resourceMetadataUrl: new URL(resourceUrl) }); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({ + error: undefined, + resourceMetadataUrl: new URL(resourceUrl), + scope: undefined + }); }); it('returns scope when present', async () => { @@ -56,7 +60,11 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({ scope: scope }); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({ + error: undefined, + resourceMetadataUrl: undefined, + scope: scope + }); }); it('returns empty object if not bearer', async () => { @@ -70,7 +78,7 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({}); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({}); }); it('returns empty object if resource_metadata and scope not present', async () => { @@ -80,7 +88,11 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({}); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({ + error: undefined, + resourceMetadataUrl: undefined, + scope: undefined + }); }); it('returns undefined resourceMetadataUrl on invalid url', async () => { @@ -94,7 +106,11 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({ scope: scope }); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({ + error: undefined, + resourceMetadataUrl: undefined, + scope: scope + }); }); it('returns error when present', async () => { @@ -104,7 +120,11 @@ describe('OAuth Authorization', () => { } } as unknown as Response; - expect(extractWWWAuthenticateParams(mockResponse)).toEqual({ error: 'insufficient_scope', scope: 'admin' }); + expect(extractWWWAuthenticateParams(mockResponse)).toStrictEqual({ + error: 'insufficient_scope', + resourceMetadataUrl: undefined, + scope: 'admin' + }); }); }); @@ -122,7 +142,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(1); const [url] = calls[0]!; @@ -153,7 +173,7 @@ describe('OAuth Authorization', () => { // Should succeed with the second call const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); // Verify both calls were made expect(mockFetch).toHaveBeenCalledTimes(2); @@ -227,7 +247,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com/path/name'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(1); const [url] = calls[0]!; @@ -242,7 +262,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com/path?param=value'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(1); const [url] = calls[0]!; @@ -266,7 +286,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com/path/name'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(2); @@ -274,14 +294,14 @@ describe('OAuth Authorization', () => { // First call should be path-aware const [firstUrl, firstOptions] = calls[0]!; expect(firstUrl.toString()).toBe('https://resource.example.com/.well-known/oauth-protected-resource/path/name'); - expect(firstOptions.headers).toEqual({ + expect(firstOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); // Second call should be root fallback const [secondUrl, secondOptions] = calls[1]!; expect(secondUrl.toString()).toBe('https://resource.example.com/.well-known/oauth-protected-resource'); - expect(secondOptions.headers).toEqual({ + expect(secondOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); } @@ -375,7 +395,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com/deep/path'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(3); @@ -383,7 +403,7 @@ describe('OAuth Authorization', () => { // Final call should be root fallback const [lastUrl, lastOptions] = calls[2]!; expect(lastUrl.toString()).toBe('https://resource.example.com/.well-known/oauth-protected-resource'); - expect(lastOptions.headers).toEqual({ + expect(lastOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -422,13 +442,13 @@ describe('OAuth Authorization', () => { const metadata = await discoverOAuthProtectedResourceMetadata('https://resource.example.com', undefined, customFetch); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); expect(customFetch).toHaveBeenCalledTimes(1); expect(mockFetch).not.toHaveBeenCalled(); const [url, options] = customFetch.mock.calls[0]!; expect(url.toString()).toBe('https://resource.example.com/.well-known/oauth-protected-resource'); - expect(options.headers).toEqual({ + expect(options.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -452,12 +472,12 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthMetadata('https://auth.example.com'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(1); const [url, options] = calls[0]!; expect(url.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server'); - expect(options.headers).toEqual({ + expect(options.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -470,12 +490,12 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthMetadata('https://auth.example.com/path/name'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(1); const [url, options] = calls[0]!; expect(url.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server/path/name'); - expect(options.headers).toEqual({ + expect(options.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -495,7 +515,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthMetadata('https://auth.example.com/path/name'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(2); @@ -503,14 +523,14 @@ describe('OAuth Authorization', () => { // First call should be path-aware const [firstUrl, firstOptions] = calls[0]!; expect(firstUrl.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server/path/name'); - expect(firstOptions.headers).toEqual({ + expect(firstOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); // Second call should be root fallback const [secondUrl, secondOptions] = calls[1]!; expect(secondUrl.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server'); - expect(secondOptions.headers).toEqual({ + expect(secondOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -587,7 +607,7 @@ describe('OAuth Authorization', () => { }); const metadata = await discoverOAuthMetadata('https://auth.example.com/deep/path'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(3); @@ -595,7 +615,7 @@ describe('OAuth Authorization', () => { // Final call should be root fallback const [lastUrl, lastOptions] = calls[2]!; expect(lastUrl.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server'); - expect(lastOptions.headers).toEqual({ + expect(lastOptions.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -624,7 +644,7 @@ describe('OAuth Authorization', () => { // Should succeed with the second call const metadata = await discoverOAuthMetadata('https://auth.example.com'); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); // Verify both calls were made expect(mockFetch).toHaveBeenCalledTimes(2); @@ -718,13 +738,13 @@ describe('OAuth Authorization', () => { const metadata = await discoverOAuthMetadata('https://auth.example.com', {}, customFetch); - expect(metadata).toEqual(validMetadata); + expect(metadata).toStrictEqual(validMetadata); expect(customFetch).toHaveBeenCalledTimes(1); expect(mockFetch).not.toHaveBeenCalled(); const [url, options] = customFetch.mock.calls[0]!; expect(url.toString()).toBe('https://auth.example.com/.well-known/oauth-authorization-server'); - expect(options.headers).toEqual({ + expect(options.headers).toStrictEqual({ 'MCP-Protocol-Version': LATEST_PROTOCOL_VERSION }); }); @@ -735,7 +755,7 @@ describe('OAuth Authorization', () => { const urls = buildDiscoveryUrls('https://auth.example.com'); expect(urls).toHaveLength(2); - expect(urls.map(u => ({ url: u.url.toString(), type: u.type }))).toEqual([ + expect(urls.map(u => ({ url: u.url.toString(), type: u.type }))).toStrictEqual([ { url: 'https://auth.example.com/.well-known/oauth-authorization-server', type: 'oauth' @@ -751,7 +771,7 @@ describe('OAuth Authorization', () => { const urls = buildDiscoveryUrls('https://auth.example.com/tenant1'); expect(urls).toHaveLength(3); - expect(urls.map(u => ({ url: u.url.toString(), type: u.type }))).toEqual([ + expect(urls.map(u => ({ url: u.url.toString(), type: u.type }))).toStrictEqual([ { url: 'https://auth.example.com/.well-known/oauth-authorization-server/tenant1', type: 'oauth' @@ -812,7 +832,7 @@ describe('OAuth Authorization', () => { const metadata = await discoverAuthorizationServerMetadata('https://auth.example.com/tenant1'); - expect(metadata).toEqual(validOpenIdMetadata); + expect(metadata).toStrictEqual(validOpenIdMetadata); // Verify it tried the URLs in the correct order const calls = mockFetch.mock.calls; @@ -835,7 +855,7 @@ describe('OAuth Authorization', () => { const metadata = await discoverAuthorizationServerMetadata('https://mcp.example.com'); - expect(metadata).toEqual(validOpenIdMetadata); + expect(metadata).toStrictEqual(validOpenIdMetadata); }); it('throws on non-4xx errors', async () => { @@ -860,7 +880,7 @@ describe('OAuth Authorization', () => { const metadata = await discoverAuthorizationServerMetadata('https://auth.example.com'); - expect(metadata).toEqual(validOAuthMetadata); + expect(metadata).toStrictEqual(validOAuthMetadata); const calls = mockFetch.mock.calls; expect(calls.length).toBe(2); @@ -880,7 +900,7 @@ describe('OAuth Authorization', () => { const metadata = await discoverAuthorizationServerMetadata('https://auth.example.com', { fetchFn: customFetch }); - expect(metadata).toEqual(validOAuthMetadata); + expect(metadata).toStrictEqual(validOAuthMetadata); expect(customFetch).toHaveBeenCalledTimes(1); expect(mockFetch).not.toHaveBeenCalled(); }); @@ -894,10 +914,10 @@ describe('OAuth Authorization', () => { const metadata = await discoverAuthorizationServerMetadata('https://auth.example.com', { protocolVersion: '2025-01-01' }); - expect(metadata).toEqual(validOAuthMetadata); + expect(metadata).toStrictEqual(validOAuthMetadata); const calls = mockFetch.mock.calls; const [, options] = calls[0]!; - expect(options.headers).toEqual({ + expect(options.headers).toStrictEqual({ 'MCP-Protocol-Version': '2025-01-01', Accept: 'application/json' }); @@ -1130,7 +1150,7 @@ describe('OAuth Authorization', () => { resource: new URL('https://api.example.com/mcp-server') }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/token' @@ -1170,7 +1190,7 @@ describe('OAuth Authorization', () => { resource: new URL('https://api.example.com/mcp-server') }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/token' @@ -1219,7 +1239,7 @@ describe('OAuth Authorization', () => { } }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/token' @@ -1293,13 +1313,13 @@ describe('OAuth Authorization', () => { fetchFn: customFetch }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); expect(customFetch).toHaveBeenCalledTimes(1); expect(mockFetch).not.toHaveBeenCalled(); const [url, options] = customFetch.mock.calls[0]!; expect(url.toString()).toBe('https://auth.example.com/token'); - expect(options).toEqual( + expect(options).toStrictEqual( expect.objectContaining({ method: 'POST', headers: expect.any(Headers), @@ -1356,7 +1376,7 @@ describe('OAuth Authorization', () => { resource: new URL('https://api.example.com/mcp-server') }); - expect(tokens).toEqual(validTokensWithNewRefreshToken); + expect(tokens).toStrictEqual(validTokensWithNewRefreshToken); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/token' @@ -1400,7 +1420,7 @@ describe('OAuth Authorization', () => { } }); - expect(tokens).toEqual(validTokensWithNewRefreshToken); + expect(tokens).toStrictEqual(validTokensWithNewRefreshToken); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/token' @@ -1436,7 +1456,7 @@ describe('OAuth Authorization', () => { refreshToken }); - expect(tokens).toEqual({ refresh_token: refreshToken, ...validTokens }); + expect(tokens).toStrictEqual({ refresh_token: refreshToken, ...validTokens }); }); it('validates token response schema', async () => { @@ -1494,7 +1514,7 @@ describe('OAuth Authorization', () => { clientMetadata: validClientMetadata }); - expect(clientInfo).toEqual(validClientInfo); + expect(clientInfo).toStrictEqual(validClientInfo); expect(mockFetch).toHaveBeenCalledWith( expect.objectContaining({ href: 'https://auth.example.com/register' @@ -2626,7 +2646,7 @@ describe('OAuth Authorization', () => { codeVerifier: 'verifier123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check Authorization header @@ -2654,7 +2674,7 @@ describe('OAuth Authorization', () => { codeVerifier: 'verifier123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check no Authorization header @@ -2680,7 +2700,7 @@ describe('OAuth Authorization', () => { codeVerifier: 'verifier123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check Authorization header - should use Basic auth as it's the most secure @@ -2715,7 +2735,7 @@ describe('OAuth Authorization', () => { codeVerifier: 'verifier123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check no Authorization header @@ -2740,7 +2760,7 @@ describe('OAuth Authorization', () => { codeVerifier: 'verifier123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check headers @@ -2794,7 +2814,7 @@ describe('OAuth Authorization', () => { refreshToken: 'refresh123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check Authorization header @@ -2821,7 +2841,7 @@ describe('OAuth Authorization', () => { refreshToken: 'refresh123' }); - expect(tokens).toEqual(validTokens); + expect(tokens).toStrictEqual(validTokens); const request = mockFetch.mock.calls[0]![1]; // Check no Authorization header diff --git a/packages/client/test/client/middleware.test.ts b/packages/client/test/client/middleware.test.ts index 451715423..58b10ecaf 100644 --- a/packages/client/test/client/middleware.test.ts +++ b/packages/client/test/client/middleware.test.ts @@ -1034,7 +1034,7 @@ describe('createMiddleware', () => { const response = await enhancedFetch('https://api.example.com/data'); const result = await response.json(); - expect(result).toEqual({ + expect(result).toStrictEqual({ data: 'original', timestamp: 123456789 }); diff --git a/packages/client/test/client/sse.test.ts b/packages/client/test/client/sse.test.ts index 94e12c652..d31118e9c 100644 --- a/packages/client/test/client/sse.test.ts +++ b/packages/client/test/client/sse.test.ts @@ -156,7 +156,7 @@ describe('SSEClientTransport', () => { await new Promise(resolve => setTimeout(resolve, 50)); expect(receivedMessages).toHaveLength(1); - expect(receivedMessages[0]).toEqual(testMessage); + expect(receivedMessages[0]).toStrictEqual(testMessage); }); it('handles malformed JSON messages', async () => { @@ -193,7 +193,7 @@ describe('SSEClientTransport', () => { expect(lastServerRequest.method).toBe('POST'); expect(lastServerRequest.headers['content-type']).toBe('application/json'); - expect(JSON.parse((lastServerRequest as IncomingMessage & { body: string }).body)).toEqual(testMessage); + expect(JSON.parse((lastServerRequest as IncomingMessage & { body: string }).body)).toStrictEqual(testMessage); }); it('handles POST request failures', async () => { diff --git a/packages/client/test/client/stdio.test.ts b/packages/client/test/client/stdio.test.ts index 28a7834bc..877f60997 100644 --- a/packages/client/test/client/stdio.test.ts +++ b/packages/client/test/client/stdio.test.ts @@ -64,7 +64,7 @@ test('should read messages', async () => { await client.send(messages[0]!); await client.send(messages[1]!); await finished; - expect(readMessages).toEqual(messages); + expect(readMessages).toStrictEqual(messages); await client.close(); }); diff --git a/packages/core/test/inMemory.test.ts b/packages/core/test/inMemory.test.ts index 72f28240b..bb8747f15 100644 --- a/packages/core/test/inMemory.test.ts +++ b/packages/core/test/inMemory.test.ts @@ -32,7 +32,7 @@ describe('InMemoryTransport', () => { }; await clientTransport.send(message); - expect(receivedMessage).toEqual(message); + expect(receivedMessage).toStrictEqual(message); }); test('should send message with auth info from client to server', async () => { @@ -57,8 +57,8 @@ describe('InMemoryTransport', () => { }; await clientTransport.send(message, { authInfo }); - expect(receivedMessage).toEqual(message); - expect(receivedAuthInfo).toEqual(authInfo); + expect(receivedMessage).toStrictEqual(message); + expect(receivedAuthInfo).toStrictEqual(authInfo); }); test('should send message from server to client', async () => { @@ -74,7 +74,7 @@ describe('InMemoryTransport', () => { }; await serverTransport.send(message); - expect(receivedMessage).toEqual(message); + expect(receivedMessage).toStrictEqual(message); }); test('should handle close', async () => { @@ -113,6 +113,6 @@ describe('InMemoryTransport', () => { await clientTransport.send(message); await serverTransport.start(); - expect(receivedMessage).toEqual(message); + expect(receivedMessage).toStrictEqual(message); }); }); diff --git a/packages/core/test/shared/protocol.test.ts b/packages/core/test/shared/protocol.test.ts index b16a4453d..2f0c54a38 100644 --- a/packages/core/test/shared/protocol.test.ts +++ b/packages/core/test/shared/protocol.test.ts @@ -444,7 +444,7 @@ describe('protocol tests', () => { }); } await Promise.resolve(); - await expect(requestPromise).resolves.toEqual({ result: 'success' }); + await expect(requestPromise).resolves.toStrictEqual({ result: 'success' }); }); test('should respect maxTotalTimeout', async () => { @@ -550,7 +550,7 @@ describe('protocol tests', () => { }); } await Promise.resolve(); - await expect(requestPromise).resolves.toEqual({ result: 'success' }); + await expect(requestPromise).resolves.toStrictEqual({ result: 'success' }); }); test('should handle progress notifications with message field', async () => { @@ -618,7 +618,7 @@ describe('protocol tests', () => { }); } await Promise.resolve(); - await expect(requestPromise).resolves.toEqual({ result: 'success' }); + await expect(requestPromise).resolves.toStrictEqual({ result: 'success' }); }); }); @@ -850,9 +850,9 @@ describe('InMemoryTaskMessageQueue', () => { await queue.enqueue(taskId, msg2); await queue.enqueue(taskId, msg3); - expect(await queue.dequeue(taskId)).toEqual(msg1); - expect(await queue.dequeue(taskId)).toEqual(msg2); - expect(await queue.dequeue(taskId)).toEqual(msg3); + expect(await queue.dequeue(taskId)).toStrictEqual(msg1); + expect(await queue.dequeue(taskId)).toStrictEqual(msg2); + expect(await queue.dequeue(taskId)).toStrictEqual(msg3); }); it('should return undefined when dequeuing from empty queue', async () => { @@ -884,12 +884,12 @@ describe('InMemoryTaskMessageQueue', () => { const allMessages = await queue.dequeueAll(taskId); - expect(allMessages).toEqual([msg1, msg2, msg3]); + expect(allMessages).toStrictEqual([msg1, msg2, msg3]); }); it('should return empty array for empty queue', async () => { const allMessages = await queue.dequeueAll(taskId); - expect(allMessages).toEqual([]); + expect(allMessages).toStrictEqual([]); }); it('should clear queue after dequeueAll', async () => { @@ -933,7 +933,7 @@ describe('mergeCapabilities', () => { }; const merged = mergeCapabilities(base, additional); - expect(merged).toEqual({ + expect(merged).toStrictEqual({ sampling: {}, elicitation: {}, roots: { @@ -965,7 +965,7 @@ describe('mergeCapabilities', () => { }; const merged = mergeCapabilities(base, additional); - expect(merged).toEqual({ + expect(merged).toStrictEqual({ logging: {}, prompts: { listChanged: true @@ -997,7 +997,7 @@ describe('mergeCapabilities', () => { const base = {}; const additional = {}; const merged = mergeCapabilities(base, additional); - expect(merged).toEqual({}); + expect(merged).toStrictEqual({}); }); }); @@ -1183,7 +1183,7 @@ describe('Task-based execution', () => { const queuedMessage = await queue!.dequeue('parent-task-456'); assertQueuedNotification(queuedMessage); expect(queuedMessage.message.method).toBe('notifications/message'); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual({ taskId: 'parent-task-456' }); + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual({ taskId: 'parent-task-456' }); }); }); @@ -1268,7 +1268,7 @@ describe('Task-based execution', () => { protocol.setRequestHandler(CallToolRequestSchema, async request => { // Tool implementor can access task creation parameters from request.params.task - expect(request.params.task).toEqual({ + expect(request.params.task).toStrictEqual({ ttl: 60000, pollInterval: 1000 }); @@ -1349,10 +1349,11 @@ describe('Task-based execution', () => { const sentMessage = sendSpy.mock.calls[0]![0]; expect(sentMessage.jsonrpc).toBe('2.0'); expect(sentMessage.id).toBe(3); - expect(sentMessage.result.tasks).toEqual([ + expect(sentMessage.result.tasks).toStrictEqual([ { taskId: task1.taskId, status: 'completed', + statusMessage: undefined, ttl: null, createdAt: expect.any(String), lastUpdatedAt: expect.any(String), @@ -1367,7 +1368,7 @@ describe('Task-based execution', () => { pollInterval: 1000 } ]); - expect(sentMessage.result._meta).toEqual({}); + expect(sentMessage.result._meta).toStrictEqual({}); }); it('should handle tasks/list requests with cursor for pagination', async () => { @@ -1412,7 +1413,7 @@ describe('Task-based execution', () => { const sentMessage = sendSpy.mock.calls[0]![0]; expect(sentMessage.jsonrpc).toBe('2.0'); expect(sentMessage.id).toBe(2); - expect(sentMessage.result.tasks).toEqual([ + expect(sentMessage.result.tasks).toStrictEqual([ { taskId: task3.taskId, status: 'working', @@ -1423,7 +1424,7 @@ describe('Task-based execution', () => { } ]); expect(sentMessage.result.nextCursor).toBeUndefined(); - expect(sentMessage.result._meta).toEqual({}); + expect(sentMessage.result._meta).toStrictEqual({}); }); it('should handle tasks/list requests with empty results', async () => { @@ -1456,9 +1457,9 @@ describe('Task-based execution', () => { const sentMessage = sendSpy.mock.calls[0]![0]; expect(sentMessage.jsonrpc).toBe('2.0'); expect(sentMessage.id).toBe(3); - expect(sentMessage.result.tasks).toEqual([]); + expect(sentMessage.result.tasks).toStrictEqual([]); expect(sentMessage.result.nextCursor).toBeUndefined(); - expect(sentMessage.result._meta).toEqual({}); + expect(sentMessage.result._meta).toStrictEqual({}); }); it('should return error for invalid cursor', async () => { @@ -1895,7 +1896,7 @@ describe('Task-based execution', () => { // Verify response does NOT include related-task metadata const response = sendSpy.mock.calls[0]![0] as { result?: { _meta?: Record } }; - expect(response.result?._meta).toEqual({}); + expect(response.result?._meta).toStrictEqual({}); }); it('should NOT include related-task metadata in tasks/cancel response', async () => { @@ -1934,7 +1935,7 @@ describe('Task-based execution', () => { // Verify response does NOT include related-task metadata const response = sendSpy.mock.calls[0]![0] as { result?: { _meta?: Record } }; - expect(response.result?._meta).toEqual({}); + expect(response.result?._meta).toStrictEqual({}); }); it('should include related-task metadata in tasks/result response', async () => { @@ -2059,7 +2060,7 @@ describe('Task-based execution', () => { const queuedMessage = await queue!.dequeue('parent-task-123'); assertQueuedNotification(queuedMessage); expect(queuedMessage.message.method).toBe('notifications/message'); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual({ + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual({ taskId: 'parent-task-123' }); @@ -3038,9 +3039,9 @@ describe('Capability negotiation for tasks', () => { } }; - expect(serverCapabilities.tasks.list).toEqual({}); - expect(serverCapabilities.tasks.cancel).toEqual({}); - expect(serverCapabilities.tasks.requests.tools.call).toEqual({}); + expect(serverCapabilities.tasks.list).toStrictEqual({}); + expect(serverCapabilities.tasks.cancel).toStrictEqual({}); + expect(serverCapabilities.tasks.requests.tools.call).toStrictEqual({}); }); it('should include list and cancel in server capabilities', () => { @@ -3103,7 +3104,7 @@ describe('Message interception for task-related notifications', () => { const queuedMessage = await queue!.dequeue(task.taskId); assertQueuedNotification(queuedMessage); expect(queuedMessage.message.method).toBe('notifications/message'); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual({ taskId: task.taskId }); + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual({ taskId: task.taskId }); }); it('should not queue notifications without related-task metadata', async () => { @@ -3290,7 +3291,7 @@ describe('Message interception for task-related requests', () => { const queuedMessage = await queue!.dequeue(task.taskId); assertQueuedRequest(queuedMessage); expect(queuedMessage.message.method).toBe('ping'); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual({ taskId: task.taskId }); + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual({ taskId: task.taskId }); // Verify resolver is stored in _requestResolvers map (not in the message) const requestId = (queuedMessage!.message as JSONRPCRequest).id as RequestId; @@ -3461,7 +3462,7 @@ describe('Message interception for task-related requests', () => { // Verify the response was routed correctly const result = await requestPromise; - expect(result).toEqual({ message: 'pong' }); + expect(result).toStrictEqual({ message: 'pong' }); }); it('should log error when resolver is missing for side-channeled request', async () => { @@ -3725,7 +3726,7 @@ describe('Message Interception', () => { expect(queuedMessage!.type).toBe('response'); if (queuedMessage!.type === 'response') { expect(queuedMessage!.message.id).toBe(requestId); - expect(queuedMessage!.message.result).toEqual({ content: 'test result' }); + expect(queuedMessage!.message.result).toStrictEqual({ content: 'test result' }); } }); @@ -4067,7 +4068,7 @@ describe('Message Interception', () => { expect(queuedMessage).toBeDefined(); assertQueuedNotification(queuedMessage); expect(queuedMessage.message.params!._meta).toBeDefined(); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual(relatedTask); + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual(relatedTask); }); it('should preserve relatedTask metadata in queued request', async () => { @@ -4092,7 +4093,7 @@ describe('Message Interception', () => { expect(queuedMessage).toBeDefined(); assertQueuedRequest(queuedMessage); expect(queuedMessage.message.params!._meta).toBeDefined(); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual(relatedTask); + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual(relatedTask); // Clean up transport.onmessage?.({ @@ -4130,7 +4131,7 @@ describe('Message Interception', () => { assertQueuedNotification(queuedMessage); expect(queuedMessage.message.params!._meta!.customField).toBe('customValue'); expect(queuedMessage.message.params!._meta!.anotherField).toBe(123); - expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toEqual({ + expect(queuedMessage.message.params!._meta![RELATED_TASK_META_KEY]).toStrictEqual({ taskId: 'task-preserve-meta' }); }); @@ -5373,7 +5374,7 @@ describe('Error handling for missing resolvers', () => { const calledError = resolverMock.mock.calls[0]![0]; expect(calledError.code).toBe(ErrorCode.InvalidParams); expect(calledError.message).toContain('Validation failed'); - expect(calledError.data).toEqual({ field: 'userName', reason: 'required' }); + expect(calledError.data).toStrictEqual({ field: 'userName', reason: 'required' }); }); it('should not throw when processing error with missing resolver', async () => { @@ -5561,7 +5562,7 @@ describe('Error handling for missing resolvers', () => { } // Verify FIFO order was maintained - expect(callOrder).toEqual([1, 2, 3]); + expect(callOrder).toStrictEqual([1, 2, 3]); }); }); }); diff --git a/packages/core/test/shared/stdio.test.ts b/packages/core/test/shared/stdio.test.ts index 455c8a627..e15f5b8bb 100644 --- a/packages/core/test/shared/stdio.test.ts +++ b/packages/core/test/shared/stdio.test.ts @@ -18,7 +18,7 @@ test('should only yield a message after a newline', () => { expect(readBuffer.readMessage()).toBeNull(); readBuffer.append(Buffer.from('\n')); - expect(readBuffer.readMessage()).toEqual(testMessage); + expect(readBuffer.readMessage()).toStrictEqual(testMessage); expect(readBuffer.readMessage()).toBeNull(); }); @@ -31,5 +31,5 @@ test('should be reusable after clearing', () => { readBuffer.append(Buffer.from(JSON.stringify(testMessage))); readBuffer.append(Buffer.from('\n')); - expect(readBuffer.readMessage()).toEqual(testMessage); + expect(readBuffer.readMessage()).toStrictEqual(testMessage); }); diff --git a/packages/core/test/shared/uriTemplate.test.ts b/packages/core/test/shared/uriTemplate.test.ts index ec913c0db..7d223f0d3 100644 --- a/packages/core/test/shared/uriTemplate.test.ts +++ b/packages/core/test/shared/uriTemplate.test.ts @@ -22,13 +22,13 @@ describe('UriTemplate', () => { it('should expand simple string variables', () => { const template = new UriTemplate('http://example.com/users/{username}'); expect(template.expand({ username: 'fred' })).toBe('http://example.com/users/fred'); - expect(template.variableNames).toEqual(['username']); + expect(template.variableNames).toStrictEqual(['username']); }); it('should handle multiple variables', () => { const template = new UriTemplate('{x,y}'); expect(template.expand({ x: '1024', y: '768' })).toBe('1024,768'); - expect(template.variableNames).toEqual(['x', 'y']); + expect(template.variableNames).toStrictEqual(['x', 'y']); }); it('should encode reserved characters', () => { @@ -41,7 +41,7 @@ describe('UriTemplate', () => { it('should not encode reserved characters with + operator', () => { const template = new UriTemplate('{+path}/here'); expect(template.expand({ path: '/foo/bar' })).toBe('/foo/bar/here'); - expect(template.variableNames).toEqual(['path']); + expect(template.variableNames).toStrictEqual(['path']); }); }); @@ -49,7 +49,7 @@ describe('UriTemplate', () => { it('should add # prefix and not encode reserved chars', () => { const template = new UriTemplate('X{#var}'); expect(template.expand({ var: '/test' })).toBe('X#/test'); - expect(template.variableNames).toEqual(['var']); + expect(template.variableNames).toStrictEqual(['var']); }); }); @@ -57,7 +57,7 @@ describe('UriTemplate', () => { it('should add . prefix', () => { const template = new UriTemplate('X{.var}'); expect(template.expand({ var: 'test' })).toBe('X.test'); - expect(template.variableNames).toEqual(['var']); + expect(template.variableNames).toStrictEqual(['var']); }); }); @@ -65,7 +65,7 @@ describe('UriTemplate', () => { it('should add / prefix', () => { const template = new UriTemplate('X{/var}'); expect(template.expand({ var: 'test' })).toBe('X/test'); - expect(template.variableNames).toEqual(['var']); + expect(template.variableNames).toStrictEqual(['var']); }); }); @@ -73,7 +73,7 @@ describe('UriTemplate', () => { it('should add ? prefix and name=value format', () => { const template = new UriTemplate('X{?var}'); expect(template.expand({ var: 'test' })).toBe('X?var=test'); - expect(template.variableNames).toEqual(['var']); + expect(template.variableNames).toStrictEqual(['var']); }); }); @@ -81,7 +81,7 @@ describe('UriTemplate', () => { it('should add & prefix and name=value format', () => { const template = new UriTemplate('X{&var}'); expect(template.expand({ var: 'test' })).toBe('X&var=test'); - expect(template.variableNames).toEqual(['var']); + expect(template.variableNames).toStrictEqual(['var']); }); }); @@ -89,13 +89,13 @@ describe('UriTemplate', () => { it('should match simple strings and extract variables', () => { const template = new UriTemplate('http://example.com/users/{username}'); const match = template.match('http://example.com/users/fred'); - expect(match).toEqual({ username: 'fred' }); + expect(match).toStrictEqual({ username: 'fred' }); }); it('should match multiple variables', () => { const template = new UriTemplate('/users/{username}/posts/{postId}'); const match = template.match('/users/fred/posts/123'); - expect(match).toEqual({ username: 'fred', postId: '123' }); + expect(match).toStrictEqual({ username: 'fred', postId: '123' }); }); it('should return null for non-matching URIs', () => { @@ -107,7 +107,7 @@ describe('UriTemplate', () => { it('should handle exploded arrays', () => { const template = new UriTemplate('{/list*}'); const match = template.match('/red,green,blue'); - expect(match).toEqual({ list: ['red', 'green', 'blue'] }); + expect(match).toStrictEqual({ list: ['red', 'green', 'blue'] }); }); }); @@ -139,7 +139,7 @@ describe('UriTemplate', () => { id: '123' }) ).toBe('/api/v1/users/123'); - expect(template.variableNames).toEqual(['version', 'resource', 'id']); + expect(template.variableNames).toStrictEqual(['version', 'resource', 'id']); }); it('should handle query parameters with arrays', () => { @@ -149,7 +149,7 @@ describe('UriTemplate', () => { tags: ['nodejs', 'typescript', 'testing'] }) ).toBe('/search?tags=nodejs,typescript,testing'); - expect(template.variableNames).toEqual(['tags']); + expect(template.variableNames).toStrictEqual(['tags']); }); it('should handle multiple query parameters', () => { @@ -161,7 +161,7 @@ describe('UriTemplate', () => { limit: '10' }) ).toBe('/search?q=test&page=1&limit=10'); - expect(template.variableNames).toEqual(['q', 'page', 'limit']); + expect(template.variableNames).toStrictEqual(['q', 'page', 'limit']); }); }); @@ -169,26 +169,26 @@ describe('UriTemplate', () => { it('should match nested path segments', () => { const template = new UriTemplate('/api/{version}/{resource}/{id}'); const match = template.match('/api/v1/users/123'); - expect(match).toEqual({ + expect(match).toStrictEqual({ version: 'v1', resource: 'users', id: '123' }); - expect(template.variableNames).toEqual(['version', 'resource', 'id']); + expect(template.variableNames).toStrictEqual(['version', 'resource', 'id']); }); it('should match query parameters', () => { const template = new UriTemplate('/search{?q}'); const match = template.match('/search?q=test'); - expect(match).toEqual({ q: 'test' }); - expect(template.variableNames).toEqual(['q']); + expect(match).toStrictEqual({ q: 'test' }); + expect(template.variableNames).toStrictEqual(['q']); }); it('should match multiple query parameters', () => { const template = new UriTemplate('/search{?q,page}'); const match = template.match('/search?q=test&page=1'); - expect(match).toEqual({ q: 'test', page: '1' }); - expect(template.variableNames).toEqual(['q', 'page']); + expect(match).toStrictEqual({ q: 'test', page: '1' }); + expect(template.variableNames).toStrictEqual(['q', 'page']); }); it('should handle partial matches correctly', () => { @@ -203,7 +203,7 @@ describe('UriTemplate', () => { const longString = 'x'.repeat(100000); const template = new UriTemplate(`/api/{param}`); expect(template.expand({ param: longString })).toBe(`/api/${longString}`); - expect(template.match(`/api/${longString}`)).toEqual({ param: longString }); + expect(template.match(`/api/${longString}`)).toStrictEqual({ param: longString }); }); it('should handle deeply nested template expressions', () => { @@ -255,20 +255,20 @@ describe('UriTemplate', () => { it('should handle repeated operators', () => { const template = new UriTemplate('{?a}{?b}{?c}'); expect(template.expand({ a: '1', b: '2', c: '3' })).toBe('?a=1&b=2&c=3'); - expect(template.variableNames).toEqual(['a', 'b', 'c']); + expect(template.variableNames).toStrictEqual(['a', 'b', 'c']); }); it('should handle overlapping variable names', () => { const template = new UriTemplate('{var}{vara}'); expect(template.expand({ var: '1', vara: '2' })).toBe('12'); - expect(template.variableNames).toEqual(['var', 'vara']); + expect(template.variableNames).toStrictEqual(['var', 'vara']); }); it('should handle empty segments', () => { const template = new UriTemplate('///{a}////{b}////'); expect(template.expand({ a: '1', b: '2' })).toBe('///1////2////'); - expect(template.match('///1////2////')).toEqual({ a: '1', b: '2' }); - expect(template.variableNames).toEqual(['a', 'b']); + expect(template.match('///1////2////')).toStrictEqual({ a: '1', b: '2' }); + expect(template.variableNames).toStrictEqual(['a', 'b']); }); it('should handle maximum template expression limit', () => { diff --git a/packages/core/test/types.capabilities.test.ts b/packages/core/test/types.capabilities.test.ts index ed414d2db..878840dc1 100644 --- a/packages/core/test/types.capabilities.test.ts +++ b/packages/core/test/types.capabilities.test.ts @@ -10,7 +10,7 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { const result = ClientCapabilitiesSchema.parse(capabilities); expect(result.elicitation).toBeDefined(); expect(result.elicitation?.form).toBeDefined(); - expect(result.elicitation?.form).toEqual({}); + expect(result.elicitation?.form).toStrictEqual({}); expect(result.elicitation?.url).toBeUndefined(); }); @@ -26,7 +26,7 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { const result = ClientCapabilitiesSchema.parse(capabilities); expect(result.elicitation).toBeDefined(); expect(result.elicitation?.form).toBeDefined(); - expect(result.elicitation?.form).toEqual({ applyDefaults: true }); + expect(result.elicitation?.form).toStrictEqual({ applyDefaults: true }); expect(result.elicitation?.url).toBeUndefined(); }); @@ -40,7 +40,7 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { const result = ClientCapabilitiesSchema.parse(capabilities); expect(result.elicitation).toBeDefined(); expect(result.elicitation?.form).toBeDefined(); - expect(result.elicitation?.form).toEqual({}); + expect(result.elicitation?.form).toStrictEqual({}); expect(result.elicitation?.url).toBeUndefined(); }); @@ -54,7 +54,7 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { const result = ClientCapabilitiesSchema.parse(capabilities); expect(result.elicitation).toBeDefined(); expect(result.elicitation?.url).toBeDefined(); - expect(result.elicitation?.url).toEqual({}); + expect(result.elicitation?.url).toStrictEqual({}); expect(result.elicitation?.form).toBeUndefined(); }); @@ -70,8 +70,8 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { expect(result.elicitation).toBeDefined(); expect(result.elicitation?.form).toBeDefined(); expect(result.elicitation?.url).toBeDefined(); - expect(result.elicitation?.form).toEqual({}); - expect(result.elicitation?.url).toEqual({}); + expect(result.elicitation?.form).toStrictEqual({}); + expect(result.elicitation?.url).toStrictEqual({}); }); it('should not inject form capability when elicitation is undefined', () => { @@ -97,7 +97,7 @@ describe('ClientCapabilitiesSchema backwards compatibility', () => { const result = InitializeRequestParamsSchema.parse(initializeParams); expect(result.capabilities.elicitation).toBeDefined(); expect(result.capabilities.elicitation?.form).toBeDefined(); - expect(result.capabilities.elicitation?.form).toEqual({}); + expect(result.capabilities.elicitation?.form).toStrictEqual({}); }); }); }); diff --git a/packages/core/test/types.test.ts b/packages/core/test/types.test.ts index c14fe4060..a83466df8 100644 --- a/packages/core/test/types.test.ts +++ b/packages/core/test/types.test.ts @@ -66,7 +66,7 @@ describe('Types', () => { expect(result.data.title).toBe('A comprehensive example resource'); expect(result.data.description).toBe('This resource demonstrates all fields'); expect(result.data.mimeType).toBe('text/plain'); - expect(result.data._meta).toEqual({ custom: 'metadata' }); + expect(result.data._meta).toStrictEqual({ custom: 'metadata' }); } }); @@ -110,7 +110,7 @@ describe('Types', () => { expect(result.success).toBe(true); if (result.success) { expect(result.data.type).toBe('text'); - expect(result.data.annotations).toEqual({ + expect(result.data.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -135,7 +135,7 @@ describe('Types', () => { expect(result.success).toBe(true); if (result.success) { expect(result.data.type).toBe('image'); - expect(result.data.annotations).toEqual({ + expect(result.data.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -160,7 +160,7 @@ describe('Types', () => { expect(result.success).toBe(true); if (result.success) { expect(result.data.type).toBe('audio'); - expect(result.data.annotations).toEqual({ + expect(result.data.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -186,7 +186,7 @@ describe('Types', () => { expect(result.success).toBe(true); if (result.success) { expect(result.data.type).toBe('resource_link'); - expect(result.data.annotations).toEqual({ + expect(result.data.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -214,7 +214,7 @@ describe('Types', () => { expect(result.success).toBe(true); if (result.success) { expect(result.data.type).toBe('resource'); - expect(result.data.annotations).toEqual({ + expect(result.data.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -285,7 +285,7 @@ describe('Types', () => { const result = CallToolResultSchema.safeParse(toolResult); expect(result.success).toBe(true); if (result.success) { - expect(result.data.content).toEqual([]); + expect(result.data.content).toStrictEqual([]); } }); }); @@ -326,7 +326,7 @@ describe('Types', () => { const result = CompleteRequestSchema.safeParse(request); expect(result.success).toBe(true); if (result.success) { - expect(result.data.params.context?.arguments).toEqual({ + expect(result.data.params.context?.arguments).toStrictEqual({ '{owner}': 'microsoft' }); } @@ -347,7 +347,7 @@ describe('Types', () => { const result = CompleteRequestSchema.safeParse(request); expect(result.success).toBe(true); if (result.success) { - expect(result.data.params.context?.arguments).toEqual({}); + expect(result.data.params.context?.arguments).toStrictEqual({}); } }); @@ -369,7 +369,7 @@ describe('Types', () => { const result = CompleteRequestSchema.safeParse(request); expect(result.success).toBe(true); if (result.success) { - expect(result.data.params.context?.arguments).toEqual({ + expect(result.data.params.context?.arguments).toStrictEqual({ '{tenant}': 'acme-corp', '{resource}': 'users' }); @@ -518,7 +518,7 @@ describe('Types', () => { expect(result.data.type).toBe('tool_use'); expect(result.data.id).toBe('call_123'); expect(result.data.name).toBe('get_weather'); - expect(result.data.input).toEqual({ city: 'San Francisco', units: 'celsius' }); + expect(result.data.input).toStrictEqual({ city: 'San Francisco', units: 'celsius' }); } }); @@ -534,7 +534,7 @@ describe('Types', () => { const result = ToolUseContentSchema.safeParse(toolCall); expect(result.success).toBe(true); if (result.success) { - expect(result.data._meta).toEqual({ custom: 'data' }); + expect(result.data._meta).toStrictEqual({ custom: 'data' }); } }); @@ -563,7 +563,7 @@ describe('Types', () => { if (result.success) { expect(result.data.type).toBe('tool_result'); expect(result.data.toolUseId).toBe('call_123'); - expect(result.data.structuredContent).toEqual({ temperature: 72, condition: 'sunny' }); + expect(result.data.structuredContent).toStrictEqual({ temperature: 72, condition: 'sunny' }); } }); @@ -578,7 +578,7 @@ describe('Types', () => { const result = ToolResultContentSchema.safeParse(toolResult); expect(result.success).toBe(true); if (result.success) { - expect(result.data.structuredContent).toEqual({ error: 'API_ERROR', message: 'Service unavailable' }); + expect(result.data.structuredContent).toStrictEqual({ error: 'API_ERROR', message: 'Service unavailable' }); expect(result.data.isError).toBe(true); } }); diff --git a/packages/server/test/server/auth/handlers/metadata.test.ts b/packages/server/test/server/auth/handlers/metadata.test.ts index 0dc51e51d..be87e1b22 100644 --- a/packages/server/test/server/auth/handlers/metadata.test.ts +++ b/packages/server/test/server/auth/handlers/metadata.test.ts @@ -31,7 +31,7 @@ describe('Metadata Handler', () => { expect(response.status).toBe(405); expect(response.headers.allow).toBe('GET, OPTIONS'); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ error: 'method_not_allowed', error_description: 'The method POST is not allowed for this endpoint' }); @@ -41,7 +41,7 @@ describe('Metadata Handler', () => { const response = await supertest(app).get('/.well-known/oauth-authorization-server'); expect(response.status).toBe(200); - expect(response.body).toEqual(exampleMetadata); + expect(response.body).toStrictEqual(exampleMetadata); }); it('includes CORS headers in response', async () => { @@ -74,6 +74,6 @@ describe('Metadata Handler', () => { const response = await supertest(minimalApp).get('/.well-known/oauth-authorization-server'); expect(response.status).toBe(200); - expect(response.body).toEqual(minimalMetadata); + expect(response.body).toStrictEqual(minimalMetadata); }); }); diff --git a/packages/server/test/server/auth/handlers/register.test.ts b/packages/server/test/server/auth/handlers/register.test.ts index b10e048ed..c746d8a59 100644 --- a/packages/server/test/server/auth/handlers/register.test.ts +++ b/packages/server/test/server/auth/handlers/register.test.ts @@ -77,7 +77,7 @@ describe('Client Registration Handler', () => { expect(response.status).toBe(405); expect(response.headers.allow).toBe('POST'); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ error: 'method_not_allowed', error_description: 'The method GET is not allowed for this endpoint' }); @@ -122,7 +122,7 @@ describe('Client Registration Handler', () => { expect(response.body.client_secret).toBeDefined(); expect(response.body.client_id_issued_at).toBeDefined(); expect(response.body.client_secret_expires_at).toBeDefined(); - expect(response.body.redirect_uris).toEqual(['https://example.com/callback']); + expect(response.body.redirect_uris).toStrictEqual(['https://example.com/callback']); // Verify client was registered expect(spyRegisterClient).toHaveBeenCalledTimes(1); @@ -256,7 +256,7 @@ describe('Client Registration Handler', () => { // Verify all metadata was preserved Object.entries(fullClientMetadata).forEach(([key, value]) => { - expect(response.body[key]).toEqual(value); + expect(response.body[key]).toStrictEqual(value); }); }); diff --git a/packages/server/test/server/auth/handlers/revoke.test.ts b/packages/server/test/server/auth/handlers/revoke.test.ts index 61ff51b24..ef09536ac 100644 --- a/packages/server/test/server/auth/handlers/revoke.test.ts +++ b/packages/server/test/server/auth/handlers/revoke.test.ts @@ -159,7 +159,7 @@ describe('Revocation Handler', () => { expect(response.status).toBe(405); expect(response.headers.allow).toBe('POST'); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ error: 'method_not_allowed', error_description: 'The method GET is not allowed for this endpoint' }); @@ -198,7 +198,7 @@ describe('Revocation Handler', () => { }); expect(response.status).toBe(200); - expect(response.body).toEqual({}); // Empty response on success + expect(response.body).toStrictEqual({}); // Empty response on success expect(spyRevokeToken).toHaveBeenCalledTimes(1); expect(spyRevokeToken).toHaveBeenCalledWith(validClient, { token: 'token_to_revoke' diff --git a/packages/server/test/server/auth/handlers/token.test.ts b/packages/server/test/server/auth/handlers/token.test.ts index 02eab891f..19db7c5d1 100644 --- a/packages/server/test/server/auth/handlers/token.test.ts +++ b/packages/server/test/server/auth/handlers/token.test.ts @@ -134,7 +134,7 @@ describe('Token Handler', () => { expect(response.status).toBe(405); expect(response.headers.allow).toBe('POST'); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ error: 'method_not_allowed', error_description: 'The method GET is not allowed for this endpoint' }); diff --git a/packages/server/test/server/auth/middleware/allowedMethods.test.ts b/packages/server/test/server/auth/middleware/allowedMethods.test.ts index 40e9c3b1f..c6e54fe9c 100644 --- a/packages/server/test/server/auth/middleware/allowedMethods.test.ts +++ b/packages/server/test/server/auth/middleware/allowedMethods.test.ts @@ -36,7 +36,7 @@ describe('allowedMethods', () => { // @ts-expect-error - dynamic method call const response = await request(app)[method]('/test'); expect(response.status).toBe(405); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ error: 'method_not_allowed', error_description: `The method ${method.toUpperCase()} is not allowed for this endpoint` }); diff --git a/packages/server/test/server/auth/middleware/bearerAuth.test.ts b/packages/server/test/server/auth/middleware/bearerAuth.test.ts index 7b464bbff..a22ea8346 100644 --- a/packages/server/test/server/auth/middleware/bearerAuth.test.ts +++ b/packages/server/test/server/auth/middleware/bearerAuth.test.ts @@ -48,7 +48,7 @@ describe('requireBearerAuth middleware', () => { await middleware(mockRequest as Request, mockResponse as Response, nextFunction); expect(mockVerifyAccessToken).toHaveBeenCalledWith('valid-token'); - expect(mockRequest.auth).toEqual(validAuthInfo); + expect(mockRequest.auth).toStrictEqual(validAuthInfo); expect(nextFunction).toHaveBeenCalled(); expect(mockResponse.status).not.toHaveBeenCalled(); expect(mockResponse.json).not.toHaveBeenCalled(); @@ -128,7 +128,7 @@ describe('requireBearerAuth middleware', () => { await middleware(mockRequest as Request, mockResponse as Response, nextFunction); expect(mockVerifyAccessToken).toHaveBeenCalledWith('valid-token'); - expect(mockRequest.auth).toEqual(nonExpiredAuthInfo); + expect(mockRequest.auth).toStrictEqual(nonExpiredAuthInfo); expect(nextFunction).toHaveBeenCalled(); expect(mockResponse.status).not.toHaveBeenCalled(); expect(mockResponse.json).not.toHaveBeenCalled(); @@ -183,7 +183,7 @@ describe('requireBearerAuth middleware', () => { await middleware(mockRequest as Request, mockResponse as Response, nextFunction); expect(mockVerifyAccessToken).toHaveBeenCalledWith('valid-token'); - expect(mockRequest.auth).toEqual(authInfo); + expect(mockRequest.auth).toStrictEqual(authInfo); expect(nextFunction).toHaveBeenCalled(); expect(mockResponse.status).not.toHaveBeenCalled(); expect(mockResponse.json).not.toHaveBeenCalled(); diff --git a/packages/server/test/server/auth/providers/proxyProvider.test.ts b/packages/server/test/server/auth/providers/proxyProvider.test.ts index 375179e5b..845916e24 100644 --- a/packages/server/test/server/auth/providers/proxyProvider.test.ts +++ b/packages/server/test/server/auth/providers/proxyProvider.test.ts @@ -137,7 +137,7 @@ describe('Proxy OAuth Server Provider', () => { body: expect.stringContaining('grant_type=authorization_code') }) ); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); it('includes redirect_uri in token request when provided', async () => { @@ -154,7 +154,7 @@ describe('Proxy OAuth Server Provider', () => { body: expect.stringContaining(`redirect_uri=${encodeURIComponent(redirectUri)}`) }) ); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); it('includes resource parameter in authorization code exchange', async () => { @@ -176,7 +176,7 @@ describe('Proxy OAuth Server Provider', () => { body: expect.stringContaining('resource=' + encodeURIComponent('https://api.example.com/resource')) }) ); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); it('handles authorization code exchange without resource parameter', async () => { @@ -185,7 +185,7 @@ describe('Proxy OAuth Server Provider', () => { const fetchCall = (global.fetch as Mock).mock.calls[0]; const body = fetchCall![1].body as string; expect(body).not.toContain('resource='); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); it('exchanges refresh token for new tokens', async () => { @@ -201,7 +201,7 @@ describe('Proxy OAuth Server Provider', () => { body: expect.stringContaining('grant_type=refresh_token') }) ); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); it('includes resource parameter in refresh token exchange', async () => { @@ -222,7 +222,7 @@ describe('Proxy OAuth Server Provider', () => { body: expect.stringContaining('resource=' + encodeURIComponent('https://api.example.com/resource')) }) ); - expect(tokens).toEqual(mockTokenResponse); + expect(tokens).toStrictEqual(mockTokenResponse); }); }); @@ -252,7 +252,7 @@ describe('Proxy OAuth Server Provider', () => { body: JSON.stringify(newClient) }) ); - expect(result).toEqual(newClient); + expect(result).toStrictEqual(newClient); }); it('handles registration failure', async () => { @@ -312,7 +312,7 @@ describe('Proxy OAuth Server Provider', () => { mockVerifyToken.mockResolvedValue(validAuthInfo); const authInfo = await provider.verifyAccessToken('valid-token'); - expect(authInfo).toEqual(validAuthInfo); + expect(authInfo).toStrictEqual(validAuthInfo); expect(mockVerifyToken).toHaveBeenCalledWith('valid-token'); }); diff --git a/packages/server/test/server/auth/router.test.ts b/packages/server/test/server/auth/router.test.ts index 250fca4c4..39be0493c 100644 --- a/packages/server/test/server/auth/router.test.ts +++ b/packages/server/test/server/auth/router.test.ts @@ -213,11 +213,11 @@ describe('MCP Auth Router', () => { expect(response.body.revocation_endpoint).toBe('https://auth.example.com/revoke'); // Verify supported features - expect(response.body.response_types_supported).toEqual(['code']); - expect(response.body.grant_types_supported).toEqual(['authorization_code', 'refresh_token']); - expect(response.body.code_challenge_methods_supported).toEqual(['S256']); - expect(response.body.token_endpoint_auth_methods_supported).toEqual(['client_secret_post', 'none']); - expect(response.body.revocation_endpoint_auth_methods_supported).toEqual(['client_secret_post']); + expect(response.body.response_types_supported).toStrictEqual(['code']); + expect(response.body.grant_types_supported).toStrictEqual(['authorization_code', 'refresh_token']); + expect(response.body.code_challenge_methods_supported).toStrictEqual(['S256']); + expect(response.body.token_endpoint_auth_methods_supported).toStrictEqual(['client_secret_post', 'none']); + expect(response.body.revocation_endpoint_auth_methods_supported).toStrictEqual(['client_secret_post']); // Verify optional fields expect(response.body.service_documentation).toBe('https://docs.example.com/'); @@ -266,7 +266,7 @@ describe('MCP Auth Router', () => { // Verify protected resource metadata expect(response.body.resource).toBe('https://mcp.example.com/'); expect(response.body.authorization_servers).toContain('https://mcp.example.com/'); - expect(response.body.scopes_supported).toEqual(['read', 'write']); + expect(response.body.scopes_supported).toStrictEqual(['read', 'write']); expect(response.body.resource_name).toBe('Test API'); }); }); @@ -419,10 +419,10 @@ describe('MCP Auth Metadata Router', () => { expect(response.body.issuer).toBe('https://auth.example.com/'); expect(response.body.authorization_endpoint).toBe('https://auth.example.com/authorize'); expect(response.body.token_endpoint).toBe('https://auth.example.com/token'); - expect(response.body.response_types_supported).toEqual(['code']); - expect(response.body.grant_types_supported).toEqual(['authorization_code', 'refresh_token']); - expect(response.body.code_challenge_methods_supported).toEqual(['S256']); - expect(response.body.token_endpoint_auth_methods_supported).toEqual(['client_secret_post']); + expect(response.body.response_types_supported).toStrictEqual(['code']); + expect(response.body.grant_types_supported).toStrictEqual(['authorization_code', 'refresh_token']); + expect(response.body.code_challenge_methods_supported).toStrictEqual(['S256']); + expect(response.body.token_endpoint_auth_methods_supported).toStrictEqual(['client_secret_post']); }); it('returns OAuth protected resource metadata', async () => { @@ -432,8 +432,8 @@ describe('MCP Auth Metadata Router', () => { // Verify protected resource metadata expect(response.body.resource).toBe('https://api.example.com/'); - expect(response.body.authorization_servers).toEqual(['https://auth.example.com/']); - expect(response.body.scopes_supported).toEqual(['read', 'write']); + expect(response.body.authorization_servers).toStrictEqual(['https://auth.example.com/']); + expect(response.body.scopes_supported).toStrictEqual(['read', 'write']); expect(response.body.resource_name).toBe('Test API'); expect(response.body.resource_documentation).toBe('https://docs.example.com/'); }); @@ -457,7 +457,7 @@ describe('MCP Auth Metadata Router', () => { expect(resourceResponse.status).toBe(200); expect(resourceResponse.body.resource).toBe('https://api.example.com/'); - expect(resourceResponse.body.authorization_servers).toEqual(['https://auth.example.com/']); + expect(resourceResponse.body.authorization_servers).toStrictEqual(['https://auth.example.com/']); expect(resourceResponse.body.scopes_supported).toBeUndefined(); expect(resourceResponse.body.resource_name).toBeUndefined(); expect(resourceResponse.body.resource_documentation).toBeUndefined(); diff --git a/packages/server/test/server/completable.test.ts b/packages/server/test/server/completable.test.ts index ff94b641b..5754b6f8f 100644 --- a/packages/server/test/server/completable.test.ts +++ b/packages/server/test/server/completable.test.ts @@ -18,7 +18,7 @@ describe.each(zodTestMatrix)('completable with $zodVersionLabel', (entry: ZodMat const completer = getCompleter(schema); expect(completer).toBeDefined(); - expect(await completer!('')).toEqual(completions); + expect(await completer!('')).toStrictEqual(completions); }); it('allows async completion functions', async () => { @@ -27,7 +27,7 @@ describe.each(zodTestMatrix)('completable with $zodVersionLabel', (entry: ZodMat const completer = getCompleter(schema); expect(completer).toBeDefined(); - expect(await completer!('')).toEqual(completions); + expect(await completer!('')).toStrictEqual(completions); }); it('passes current value to completion function', async () => { @@ -35,7 +35,7 @@ describe.each(zodTestMatrix)('completable with $zodVersionLabel', (entry: ZodMat const completer = getCompleter(schema); expect(completer).toBeDefined(); - expect(await completer!('test')).toEqual(['test!']); + expect(await completer!('test')).toStrictEqual(['test!']); }); it('works with number schemas', async () => { @@ -44,7 +44,7 @@ describe.each(zodTestMatrix)('completable with $zodVersionLabel', (entry: ZodMat expect(schema.parse(1)).toBe(1); const completer = getCompleter(schema); expect(completer).toBeDefined(); - expect(await completer!(0)).toEqual([1, 2, 3]); + expect(await completer!(0)).toStrictEqual([1, 2, 3]); }); it('preserves schema description', () => { diff --git a/packages/server/test/server/stdio.test.ts b/packages/server/test/server/stdio.test.ts index f1c9e038c..96b05c282 100644 --- a/packages/server/test/server/stdio.test.ts +++ b/packages/server/test/server/stdio.test.ts @@ -64,7 +64,7 @@ test('should not read until started', async () => { expect(didRead).toBeFalsy(); await server.start(); - expect(await readMessage).toEqual(message); + expect(await readMessage).toStrictEqual(message); }); test('should read multiple messages', async () => { @@ -100,5 +100,5 @@ test('should read multiple messages', async () => { await server.start(); await finished; - expect(readMessages).toEqual(messages); + expect(readMessages).toStrictEqual(messages); }); diff --git a/packages/server/test/server/streamableHttp.test.ts b/packages/server/test/server/streamableHttp.test.ts index d8c6388e4..d05eebe5f 100644 --- a/packages/server/test/server/streamableHttp.test.ts +++ b/packages/server/test/server/streamableHttp.test.ts @@ -1143,7 +1143,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { const listResponse = results.find((r: { id?: RequestId }) => r.id === 'batch-1'); const callResponse = results.find((r: { id?: RequestId }) => r.id === 'batch-2'); - expect(listResponse).toEqual( + expect(listResponse).toStrictEqual( expect.objectContaining({ jsonrpc: '2.0', id: 'batch-1', @@ -1153,7 +1153,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }) ); - expect(callResponse).toEqual( + expect(callResponse).toStrictEqual( expect.objectContaining({ jsonrpc: '2.0', id: 'batch-2', @@ -2512,7 +2512,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Give time for async callback to complete await new Promise(resolve => setTimeout(resolve, 50)); - expect(initializationOrder).toEqual(['async-start', 'async-end', tempSessionId]); + expect(initializationOrder).toStrictEqual(['async-start', 'async-end', tempSessionId]); // Clean up tempServer.close(); @@ -2536,7 +2536,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { const initResponse = await sendPostRequest(tempUrl, TEST_MESSAGES.initialize); const tempSessionId = initResponse.headers.get('mcp-session-id'); - expect(capturedSessionId).toEqual([tempSessionId]); + expect(capturedSessionId).toStrictEqual([tempSessionId]); // Clean up tempServer.close(); @@ -2579,7 +2579,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Give time for async callback to complete await new Promise(resolve => setTimeout(resolve, 50)); - expect(closureOrder).toEqual(['async-close-start', 'async-close-end', tempSessionId]); + expect(closureOrder).toStrictEqual(['async-close-start', 'async-close-end', tempSessionId]); // Clean up tempServer.close(); diff --git a/test/integration/test/client/client.test.ts b/test/integration/test/client/client.test.ts index 5574a2d84..7b2ed7df2 100644 --- a/test/integration/test/client/client.test.ts +++ b/test/integration/test/client/client.test.ts @@ -241,7 +241,7 @@ test('should initialize with matching protocol version', async () => { ); // Should have the instructions returned - expect(client.getInstructions()).toEqual('test instructions'); + expect(client.getInstructions()).toStrictEqual('test instructions'); }); /*** @@ -286,7 +286,7 @@ test('should initialize with supported older protocol version', async () => { await client.connect(clientTransport); // Connection should succeed with the older version - expect(client.getServerVersion()).toEqual({ + expect(client.getServerVersion()).toStrictEqual({ name: 'test', version: '1.0' }); @@ -393,7 +393,7 @@ test('should connect new client to old, supported server version', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); - expect(client.getServerVersion()).toEqual({ + expect(client.getServerVersion()).toStrictEqual({ name: 'old server', version: '1.0' }); @@ -454,7 +454,7 @@ test('should negotiate version when client is old, and newer server supports its await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); - expect(client.getServerVersion()).toEqual({ + expect(client.getServerVersion()).toStrictEqual({ name: 'new server', version: '1.0' }); @@ -575,7 +575,7 @@ test('should respect server capabilities', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); // Server supports resources and tools, but not prompts - expect(client.getServerCapabilities()).toEqual({ + expect(client.getServerCapabilities()).toStrictEqual({ resources: {}, tools: {} }); @@ -830,7 +830,7 @@ test('should accept form-mode elicitation request when client advertises empty e }); expect(result.action).toBe('accept'); - expect(result.content).toEqual({ + expect(result.content).toStrictEqual({ username: 'test-user', confirmed: true }); @@ -1121,7 +1121,7 @@ test('should apply defaults for form-mode elicitation when applyDefaults is enab }); expect(result.action).toBe('accept'); - expect(result.content).toEqual({ + expect(result.content).toStrictEqual({ confirmed: true }); @@ -1863,7 +1863,7 @@ describe('outputSchema validation', () => { // Call the tool - should validate successfully const result = await client.callTool({ name: 'test-tool' }); - expect(result.structuredContent).toEqual({ result: 'success', count: 42 }); + expect(result.structuredContent).toStrictEqual({ result: 'success', count: 42 }); }); /*** @@ -2132,7 +2132,7 @@ describe('outputSchema validation', () => { // Call the tool - should work normally without validation const result = await client.callTool({ name: 'test-tool' }); - expect(result.content).toEqual([{ type: 'text', text: 'Normal response' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Normal response' }]); }); /*** @@ -2573,7 +2573,7 @@ describe('Task-based execution', () => { // Query task result using the captured task ID const result = await client.experimental.tasks.getTaskResult(taskId!, CallToolResultSchema); - expect(result.content).toEqual([{ type: 'text', text: 'Result data!' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Result data!' }]); }); test('should query task list from server using listTasks', async () => { @@ -2952,7 +2952,7 @@ describe('Task-based execution', () => { // Query task result using getTaskResult const taskResult = await server.experimental.tasks.getTaskResult(taskId, ElicitResultSchema); expect(taskResult.action).toBe('accept'); - expect(taskResult.content).toEqual({ username: 'result-user' }); + expect(taskResult.content).toStrictEqual({ username: 'result-user' }); }); test('should query task list from client using listTasks', async () => { @@ -3155,7 +3155,7 @@ describe('Task-based execution', () => { // List all tasks without cursor const firstPage = await client.experimental.tasks.listTasks(); expect(firstPage.tasks.length).toBeGreaterThan(0); - expect(firstPage.tasks.map(t => t.taskId)).toEqual(expect.arrayContaining(createdTaskIds)); + expect(firstPage.tasks.map(t => t.taskId)).toStrictEqual(expect.arrayContaining(createdTaskIds)); // If there's a cursor, test pagination if (firstPage.nextCursor) { @@ -3396,7 +3396,7 @@ test('should respect server task capabilities', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); // Server supports task creation for tools/call - expect(client.getServerCapabilities()).toEqual({ + expect(client.getServerCapabilities()).toStrictEqual({ tools: { listChanged: true }, @@ -3469,7 +3469,7 @@ test('should expose requestStream() method for streaming responses', async () => // First verify that regular request() works const regularResult = await client.callTool({ name: 'test-tool', arguments: {} }); - expect(regularResult.content).toEqual([{ type: 'text', text: 'Tool result' }]); + expect(regularResult.content).toStrictEqual([{ type: 'text', text: 'Tool result' }]); // Test requestStream with non-task request (should yield only result) const stream = client.experimental.tasks.requestStream( @@ -3489,7 +3489,7 @@ test('should expose requestStream() method for streaming responses', async () => expect(messages.length).toBe(1); expect(messages[0]!.type).toBe('result'); if (messages[0]!.type === 'result') { - expect(messages[0]!.result.content).toEqual([{ type: 'text', text: 'Tool result' }]); + expect(messages[0]!.result.content).toStrictEqual([{ type: 'text', text: 'Tool result' }]); } await client.close(); @@ -3544,7 +3544,7 @@ test('should expose callToolStream() method for streaming tool calls', async () expect(messages.length).toBe(1); expect(messages[0]!.type).toBe('result'); if (messages[0]!.type === 'result') { - expect(messages[0]!.result.content).toEqual([{ type: 'text', text: 'Tool result' }]); + expect(messages[0]!.result.content).toStrictEqual([{ type: 'text', text: 'Tool result' }]); } await client.close(); @@ -3625,7 +3625,7 @@ test('should validate structured output in callToolStream()', async () => { expect(messages.length).toBe(1); expect(messages[0]!.type).toBe('result'); if (messages[0]!.type === 'result') { - expect(messages[0]!.result.structuredContent).toEqual({ value: 42 }); + expect(messages[0]!.result.structuredContent).toStrictEqual({ value: 42 }); } await client.close(); @@ -3838,7 +3838,7 @@ test('callToolStream() should handle tools without outputSchema normally', async expect(messages.length).toBe(1); expect(messages[0]!.type).toBe('result'); if (messages[0]!.type === 'result') { - expect(messages[0]!.result.content).toEqual([{ type: 'text', text: 'Normal response' }]); + expect(messages[0]!.result.content).toStrictEqual([{ type: 'text', text: 'Normal response' }]); } await client.close(); @@ -4088,7 +4088,7 @@ test('callToolStream() should not validate structuredContent when isError is tru expect(messages[0]!.type).toBe('result'); if (messages[0]!.type === 'result') { expect(messages[0]!.result.isError).toBe(true); - expect(messages[0]!.result.content).toEqual([{ type: 'text', text: 'Something went wrong' }]); + expect(messages[0]!.result.content).toStrictEqual([{ type: 'text', text: 'Something went wrong' }]); } await client.close(); diff --git a/test/integration/test/experimental/tasks/task-listing.test.ts b/test/integration/test/experimental/tasks/task-listing.test.ts index 28b39bb3b..dcd04a858 100644 --- a/test/integration/test/experimental/tasks/task-listing.test.ts +++ b/test/integration/test/experimental/tasks/task-listing.test.ts @@ -24,7 +24,7 @@ describe('Task Listing with Pagination', () => { it('should return empty list when no tasks exist', async () => { const result = await client.experimental.tasks.listTasks(); - expect(result.tasks).toEqual([]); + expect(result.tasks).toStrictEqual([]); expect(result.nextCursor).toBeUndefined(); }); diff --git a/test/integration/test/issues/test_1277_zod_v4_description.test.ts b/test/integration/test/issues/test_1277_zod_v4_description.test.ts index fe58cfcd5..a6213838b 100644 --- a/test/integration/test/issues/test_1277_zod_v4_description.test.ts +++ b/test/integration/test/issues/test_1277_zod_v4_description.test.ts @@ -56,7 +56,7 @@ describe.each(zodTestMatrix)('Issue #1277: $zodVersionLabel', (entry: ZodMatrixE expect(result.prompts).toHaveLength(1); expect(result.prompts[0]!.name).toBe('test'); - expect(result.prompts[0]!.arguments).toEqual([ + expect(result.prompts[0]!.arguments).toStrictEqual([ { name: 'name', required: true, description: 'The user name' }, { name: 'value', required: true, description: 'The value to set' } ]); diff --git a/test/integration/test/server.test.ts b/test/integration/test/server.test.ts index fcac6cc45..d9bc40f64 100644 --- a/test/integration/test/server.test.ts +++ b/test/integration/test/server.test.ts @@ -193,7 +193,7 @@ test('should accept latest protocol version', async () => { close: vi.fn().mockResolvedValue(undefined), send: vi.fn().mockImplementation(message => { if (message.id === 1 && message.result) { - expect(message.result).toEqual({ + expect(message.result).toStrictEqual({ protocolVersion: LATEST_PROTOCOL_VERSION, capabilities: expect.any(Object), serverInfo: { @@ -256,7 +256,7 @@ test('should accept supported older protocol version', async () => { close: vi.fn().mockResolvedValue(undefined), send: vi.fn().mockImplementation(message => { if (message.id === 1 && message.result) { - expect(message.result).toEqual({ + expect(message.result).toStrictEqual({ protocolVersion: OLD_VERSION, capabilities: expect.any(Object), serverInfo: { @@ -316,7 +316,7 @@ test('should handle unsupported protocol version', async () => { close: vi.fn().mockResolvedValue(undefined), send: vi.fn().mockImplementation(message => { if (message.id === 1 && message.result) { - expect(message.result).toEqual({ + expect(message.result).toStrictEqual({ protocolVersion: LATEST_PROTOCOL_VERSION, capabilities: expect.any(Object), serverInfo: { @@ -411,7 +411,7 @@ test('should respect client capabilities', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); - expect(server.getClientCapabilities()).toEqual({ sampling: {} }); + expect(server.getClientCapabilities()).toStrictEqual({ sampling: {} }); // This should work because sampling is supported by the client await expect( @@ -467,7 +467,7 @@ test('should respect client elicitation capabilities', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); // After schema parsing, empty elicitation object should have form capability injected - expect(server.getClientCapabilities()).toEqual({ elicitation: { form: {} } }); + expect(server.getClientCapabilities()).toStrictEqual({ elicitation: { form: {} } }); // This should work because elicitation is supported by the client await expect( @@ -492,7 +492,7 @@ test('should respect client elicitation capabilities', async () => { required: ['username'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { username: 'test-user', @@ -551,7 +551,7 @@ test('should use elicitInput with mode: "form" by default for backwards compatib await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); // After schema parsing, empty elicitation object should have form capability injected - expect(server.getClientCapabilities()).toEqual({ elicitation: { form: {} } }); + expect(server.getClientCapabilities()).toStrictEqual({ elicitation: { form: {} } }); // This should work because elicitation is supported by the client await expect( @@ -575,7 +575,7 @@ test('should use elicitInput with mode: "form" by default for backwards compatib required: ['username'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { username: 'test-user', @@ -737,14 +737,14 @@ test('should include form mode when sending elicitation form requests', async () required: ['confirmation'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { confirmation: true } }); - expect(receivedModes).toEqual(['form']); + expect(receivedModes).toStrictEqual(['form']); }); test('should include url mode when sending elicitation URL requests', async () => { @@ -795,12 +795,13 @@ test('should include url mode when sending elicitation URL requests', async () = elicitationId: 'elicitation-xyz', url: 'https://example.com/verify' }) - ).resolves.toEqual({ - action: 'decline' + ).resolves.toStrictEqual({ + action: 'decline', + content: undefined }); - expect(receivedModes).toEqual(['url']); - expect(receivedIds).toEqual(['elicitation-xyz']); + expect(receivedModes).toStrictEqual(['url']); + expect(receivedIds).toStrictEqual(['elicitation-xyz']); }); test('should reject elicitInput when client response violates requested schema', async () => { @@ -997,7 +998,7 @@ test('should create notifier that emits elicitation completion notification', as await new Promise(resolve => setTimeout(resolve, 0)); - expect(receivedIds).toEqual(['elicitation-123']); + expect(receivedIds).toStrictEqual(['elicitation-123']); }); test('should throw when creating notifier if client lacks URL elicitation support', async () => { @@ -1071,7 +1072,7 @@ test('should apply back-compat form capability injection when client sends empty expect(clientCapabilities).toBeDefined(); expect(clientCapabilities?.elicitation).toBeDefined(); expect(clientCapabilities?.elicitation?.form).toBeDefined(); - expect(clientCapabilities?.elicitation?.form).toEqual({}); + expect(clientCapabilities?.elicitation?.form).toStrictEqual({}); expect(clientCapabilities?.elicitation?.url).toBeUndefined(); }); @@ -1116,7 +1117,7 @@ test('should preserve form capability configuration when client enables applyDef expect(clientCapabilities).toBeDefined(); expect(clientCapabilities?.elicitation).toBeDefined(); expect(clientCapabilities?.elicitation?.form).toBeDefined(); - expect(clientCapabilities?.elicitation?.form).toEqual({ applyDefaults: true }); + expect(clientCapabilities?.elicitation?.form).toStrictEqual({ applyDefaults: true }); expect(clientCapabilities?.elicitation?.url).toBeUndefined(); }); @@ -1188,7 +1189,7 @@ test('should validate elicitation response against requested schema', async () = required: ['name', 'email'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { name: 'John Doe', @@ -1326,8 +1327,9 @@ test('should allow elicitation reject and cancel without validation', async () = message: 'Please provide your name', requestedSchema: schema }) - ).resolves.toEqual({ - action: 'decline' + ).resolves.toStrictEqual({ + action: 'decline', + content: undefined }); // Test cancel - should not validate @@ -1337,8 +1339,9 @@ test('should allow elicitation reject and cancel without validation', async () = message: 'Please provide your name', requestedSchema: schema }) - ).resolves.toEqual({ - action: 'cancel' + ).resolves.toStrictEqual({ + action: 'cancel', + content: undefined }); }); @@ -1556,7 +1559,7 @@ test('should respect log level for transport without sessionId', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); - expect(clientTransport.sessionId).toEqual(undefined); + expect(clientTransport.sessionId).toStrictEqual(undefined); // Client sets logging level to warning await client.setLoggingLevel('warning'); @@ -1577,7 +1580,7 @@ test('should respect log level for transport without sessionId', async () => { // Test the one that makes it through clientTransport.onmessage = vi.fn().mockImplementation(message => { - expect(message).toEqual({ + expect(message).toStrictEqual({ jsonrpc: '2.0', method: 'notifications/message', params: warningParams @@ -2042,7 +2045,7 @@ test('should respect log level for transport with sessionId', async () => { // Test the one that makes it through clientTransport.onmessage = vi.fn().mockImplementation(message => { - expect(message).toEqual({ + expect(message).toStrictEqual({ jsonrpc: '2.0', method: 'notifications/message', params: warningParams @@ -2073,7 +2076,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').send({ hello: 'world' }).set('Content-Type', 'application/json'); expect(response.status).toBe(200); - expect(response.body).toEqual({ received: { hello: 'world' } }); + expect(response.body).toStrictEqual({ received: { hello: 'world' } }); }); test('should reject requests with invalid Host header by default', async () => { @@ -2085,7 +2088,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').set('Host', 'evil.com:3000').send({}); expect(response.status).toBe(403); - expect(response.body).toEqual({ + expect(response.body).toStrictEqual({ jsonrpc: '2.0', error: { code: -32000, @@ -2104,7 +2107,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').set('Host', 'localhost:3000').send({}); expect(response.status).toBe(200); - expect(response.body).toEqual({ success: true }); + expect(response.body).toStrictEqual({ success: true }); }); test('should allow requests with 127.0.0.1 Host header', async () => { @@ -2116,7 +2119,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').set('Host', '127.0.0.1:3000').send({}); expect(response.status).toBe(200); - expect(response.body).toEqual({ success: true }); + expect(response.body).toStrictEqual({ success: true }); }); test('should not apply host validation when host is 0.0.0.0', async () => { @@ -2129,7 +2132,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').set('Host', 'any-host.com:3000').send({}); expect(response.status).toBe(200); - expect(response.body).toEqual({ success: true }); + expect(response.body).toStrictEqual({ success: true }); }); test('should apply host validation when host is explicitly localhost', async () => { @@ -2153,7 +2156,7 @@ describe('createMcpExpressApp', () => { const response = await supertest(app).post('/test').set('Host', '[::1]:3000').send({}); expect(response.status).toBe(200); - expect(response.body).toEqual({ success: true }); + expect(response.body).toStrictEqual({ success: true }); }); test('should apply host validation when host is ::1 (IPv6 localhost)', async () => { @@ -2328,7 +2331,7 @@ describe('Task-based execution', () => { // Verify we can retrieve the result const result = await client.experimental.tasks.getTaskResult(taskId!, CallToolResultSchema); - expect(result.content).toEqual([{ type: 'text', text: 'Tool executed successfully!' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Tool executed successfully!' }]); // Cleanup taskStore.cleanup(); @@ -2553,7 +2556,7 @@ describe('Task-based execution', () => { // Verify tool result was correct const result = await client.experimental.tasks.getTaskResult(taskId!, CallToolResultSchema); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Collected username: test-user' @@ -2813,7 +2816,7 @@ describe('Task-based execution', () => { // Query result const result = await server.experimental.tasks.getTaskResult(taskId, ElicitResultSchema); expect(result.action).toBe('accept'); - expect(result.content).toEqual({ username: 'result-user', confirmed: true }); + expect(result.content).toStrictEqual({ username: 'result-user', confirmed: true }); }); test('should query task list from client using listTasks', async () => { @@ -3028,7 +3031,7 @@ describe('Task-based execution', () => { expect(task.taskId).toBe(taskIds[i]!); const result = await client.experimental.tasks.getTaskResult(taskIds[i]!, CallToolResultSchema); - expect(result.content).toEqual([{ type: 'text', text: `Completed task ${i + 1}` }]); + expect(result.content).toStrictEqual([{ type: 'text', text: `Completed task ${i + 1}` }]); } // Verify listTasks returns all tasks @@ -3223,7 +3226,7 @@ test('should respect client task capabilities', async () => { await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); // Client supports task creation for elicitation/create and task methods - expect(server.getClientCapabilities()).toEqual({ + expect(server.getClientCapabilities()).toStrictEqual({ sampling: {}, elicitation: { form: {} diff --git a/test/integration/test/server/elicitation.test.ts b/test/integration/test/server/elicitation.test.ts index 6cf6d5395..10c281cfb 100644 --- a/test/integration/test/server/elicitation.test.ts +++ b/test/integration/test/server/elicitation.test.ts @@ -79,7 +79,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { name: 'John Doe' } }); @@ -103,7 +103,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { age: 42 } }); @@ -127,7 +127,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { agree: true } }); @@ -171,7 +171,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo }; const result = await server.elicitInput(formRequestParams); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: userData }); @@ -307,8 +307,9 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ - action: 'decline' + expect(result).toStrictEqual({ + action: 'decline', + content: undefined }); }); @@ -329,8 +330,9 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ - action: 'cancel' + expect(result).toStrictEqual({ + action: 'cancel', + content: undefined }); }); @@ -377,12 +379,12 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo }); expect(requestCount).toBe(3); - expect(nameResult).toEqual({ + expect(nameResult).toStrictEqual({ action: 'accept', content: { name: 'Alice' } }); - expect(ageResult).toEqual({ action: 'accept', content: { age: 30 } }); - expect(cityResult).toEqual({ + expect(ageResult).toStrictEqual({ action: 'accept', content: { age: 30 } }); + expect(cityResult).toStrictEqual({ action: 'accept', content: { city: 'New York' } }); @@ -407,7 +409,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { name: 'John', nickname: 'Johnny' } }); @@ -432,7 +434,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { name: 'John' } }); @@ -456,7 +458,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo } }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { email: 'user@example.com' } }); @@ -557,8 +559,8 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo // Client returns no values; SDK should apply defaults automatically (and validate) client.setRequestHandler(ElicitRequestSchema, request => { - expect(request.params.mode).toEqual('form'); - expect((request.params as ElicitRequestFormParams).requestedSchema).toEqual(testSchemaProperties); + expect(request.params.mode).toStrictEqual('form'); + expect((request.params as ElicitRequestFormParams).requestedSchema).toStrictEqual(testSchemaProperties); return { action: 'accept', content: {} @@ -574,7 +576,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo requestedSchema: testSchemaProperties }); - expect(result).toEqual({ + expect(result).toStrictEqual({ action: 'accept', content: { subscribe: true, @@ -642,7 +644,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo required: ['color'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { color: 'Red' @@ -682,7 +684,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo required: ['color'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { color: '#FF0000' @@ -718,7 +720,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo required: ['color'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { color: '#FF0000' @@ -760,7 +762,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo required: ['colors'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { colors: ['Red', 'Blue'] @@ -803,7 +805,7 @@ function testElicitationFlow(validatorProvider: typeof ajvProvider | typeof cfWo required: ['colors'] } }) - ).resolves.toEqual({ + ).resolves.toStrictEqual({ action: 'accept', content: { colors: ['#FF0000', '#0000FF'] diff --git a/test/integration/test/server/mcp.test.ts b/test/integration/test/server/mcp.test.ts index f7bcececc..e39299976 100644 --- a/test/integration/test/server/mcp.test.ts +++ b/test/integration/test/server/mcp.test.ts @@ -291,7 +291,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.tools).toHaveLength(1); expect(result.tools[0]!.name).toBe('test'); - expect(result.tools[0]!.inputSchema).toEqual({ + expect(result.tools[0]!.inputSchema).toStrictEqual({ type: 'object', properties: {} }); @@ -373,7 +373,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CallToolResultSchema ); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Updated response' @@ -467,7 +467,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CallToolResultSchema ); - expect(callResult.content).toEqual([ + expect(callResult.content).toStrictEqual([ { type: 'text', text: 'Updated: test, 42' @@ -558,7 +558,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CallToolResultSchema ); - expect(callResult.structuredContent).toEqual({ + expect(callResult.structuredContent).toStrictEqual({ result: 42, sum: 100 }); @@ -691,7 +691,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); expect(result.tools[1]!.name).toBe('test (new api)'); - expect(result.tools[1]!.inputSchema).toEqual(result.tools[0]!.inputSchema); + expect(result.tools[1]!.inputSchema).toStrictEqual(result.tools[0]!.inputSchema); }); /*** @@ -801,12 +801,12 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.tools).toHaveLength(2); expect(result.tools[0]!.name).toBe('test'); - expect(result.tools[0]!.annotations).toEqual({ + expect(result.tools[0]!.annotations).toStrictEqual({ title: 'Test Tool', readOnlyHint: true }); expect(result.tools[1]!.name).toBe('test (new api)'); - expect(result.tools[1]!.annotations).toEqual({ + expect(result.tools[1]!.annotations).toStrictEqual({ title: 'Test Tool', readOnlyHint: true }); @@ -852,13 +852,13 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { type: 'object', properties: { name: { type: 'string' } } }); - expect(result.tools[0]!.annotations).toEqual({ + expect(result.tools[0]!.annotations).toStrictEqual({ title: 'Test Tool', readOnlyHint: true }); expect(result.tools[1]!.name).toBe('test (new api)'); - expect(result.tools[1]!.inputSchema).toEqual(result.tools[0]!.inputSchema); - expect(result.tools[1]!.annotations).toEqual(result.tools[0]!.annotations); + expect(result.tools[1]!.inputSchema).toStrictEqual(result.tools[0]!.inputSchema); + expect(result.tools[1]!.annotations).toStrictEqual(result.tools[0]!.annotations); }); /*** @@ -913,15 +913,15 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { type: 'object', properties: { name: { type: 'string' } } }); - expect(result.tools[0]!.annotations).toEqual({ + expect(result.tools[0]!.annotations).toStrictEqual({ title: 'Complete Test Tool', readOnlyHint: true, openWorldHint: false }); expect(result.tools[1]!.name).toBe('test (new api)'); expect(result.tools[1]!.description).toBe('A tool with everything'); - expect(result.tools[1]!.inputSchema).toEqual(result.tools[0]!.inputSchema); - expect(result.tools[1]!.annotations).toEqual(result.tools[0]!.annotations); + expect(result.tools[1]!.inputSchema).toStrictEqual(result.tools[0]!.inputSchema); + expect(result.tools[1]!.annotations).toStrictEqual(result.tools[0]!.annotations); }); /*** @@ -980,15 +980,15 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { type: 'object', properties: {} }); - expect(result.tools[0]!.annotations).toEqual({ + expect(result.tools[0]!.annotations).toStrictEqual({ title: 'Complete Test Tool with empty params', readOnlyHint: true, openWorldHint: false }); expect(result.tools[1]!.name).toBe('test (new api)'); expect(result.tools[1]!.description).toBe('A tool with everything but empty params'); - expect(result.tools[1]!.inputSchema).toEqual(result.tools[0]!.inputSchema); - expect(result.tools[1]!.annotations).toEqual(result.tools[0]!.annotations); + expect(result.tools[1]!.inputSchema).toStrictEqual(result.tools[0]!.inputSchema); + expect(result.tools[1]!.annotations).toStrictEqual(result.tools[0]!.annotations); }); /*** @@ -1057,7 +1057,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.isError).toBe(true); - expect(result.content).toEqual( + expect(result.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1081,7 +1081,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result2.isError).toBe(true); - expect(result2.content).toEqual( + expect(result2.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1236,7 +1236,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.content!).toHaveLength(1); expect(result.content![0]).toMatchObject({ type: 'text' }); const textContent = result.content![0] as TextContent; - expect(JSON.parse(textContent.text)).toEqual(result.structuredContent); + expect(JSON.parse(textContent.text)).toStrictEqual(result.structuredContent); }); /*** @@ -1290,7 +1290,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }); expect(result.isError).toBe(true); - expect(result.content).toEqual( + expect(result.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1422,7 +1422,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }); expect(result.isError).toBe(true); - expect(result.content).toEqual( + expect(result.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1521,7 +1521,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(receivedRequestId).toBeDefined(); expect(typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number').toBe(true); - expect(result.content).toEqual( + expect(result.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1631,7 +1631,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CallToolResultSchema ); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Processed: hello' @@ -1672,7 +1672,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.isError).toBe(true); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Tool execution failed' @@ -1718,7 +1718,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.isError).toBe(true); - expect(result.content).toEqual( + expect(result.content).toStrictEqual( expect.arrayContaining([ { type: 'text', @@ -1777,7 +1777,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(error).toBeInstanceOf(UrlElicitationRequiredError); if (error instanceof UrlElicitationRequiredError) { expect(error.code).toBe(ErrorCode.UrlElicitationRequired); - expect(error.elicitations).toEqual([elicitationParams]); + expect(error.elicitations).toStrictEqual([elicitationParams]); } }); }); @@ -1823,7 +1823,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.tools).toHaveLength(1); expect(result.tools[0]!.name).toBe('test-with-meta'); expect(result.tools[0]!.description).toBe('A tool with _meta field'); - expect(result.tools[0]!._meta).toEqual(metaData); + expect(result.tools[0]!._meta).toStrictEqual(metaData); }); /*** @@ -1923,7 +1923,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.tools).toHaveLength(1); expect(result.tools[0]!.name).toBe('task-tool'); - expect(result.tools[0]!.execution).toEqual({ + expect(result.tools[0]!.execution).toStrictEqual({ taskSupport: 'required' }); @@ -1992,7 +1992,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.tools).toHaveLength(1); expect(result.tools[0]!.name).toBe('optional-task-tool'); - expect(result.tools[0]!.execution).toEqual({ + expect(result.tools[0]!.execution).toStrictEqual({ taskSupport: 'optional' }); @@ -2144,7 +2144,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.contents).toHaveLength(1); - expect(result.contents).toEqual( + expect(result.contents).toStrictEqual( expect.arrayContaining([ { text: expect.stringContaining('Updated content'), @@ -2216,7 +2216,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.contents).toHaveLength(1); - expect(result.contents).toEqual( + expect(result.contents).toStrictEqual( expect.arrayContaining([ { text: expect.stringContaining('Updated content'), @@ -2439,7 +2439,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.resources).toHaveLength(1); expect(result.resources[0]!.description).toBe('Test resource'); expect(result.resources[0]!.mimeType).toBe('text/plain'); - expect(result.resources[0]!.annotations).toEqual({ + expect(result.resources[0]!.annotations).toStrictEqual({ audience: ['user'], priority: 0.5, lastModified: mockDate @@ -2583,7 +2583,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ReadResourceResultSchema ); - expect(result.contents).toEqual( + expect(result.contents).toStrictEqual( expect.arrayContaining([ { text: expect.stringContaining('Category: books, ID: 123'), @@ -2882,7 +2882,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result.completion.values).toEqual(['books', 'movies', 'music']); + expect(result.completion.values).toStrictEqual(['books', 'movies', 'music']); expect(result.completion.total).toBe(3); }); @@ -2939,7 +2939,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result.completion.values).toEqual(['movies', 'music']); + expect(result.completion.values).toStrictEqual(['movies', 'music']); expect(result.completion.total).toBe(2); }); @@ -2986,7 +2986,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(receivedRequestId).toBeDefined(); expect(typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number').toBe(true); - expect(result.contents).toEqual( + expect(result.contents).toStrictEqual( expect.arrayContaining([ { text: expect.stringContaining(`Received request ID:`), @@ -3099,7 +3099,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(result.messages).toHaveLength(1); - expect(result.messages).toEqual( + expect(result.messages).toStrictEqual( expect.arrayContaining([ { role: 'assistant', @@ -3183,7 +3183,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(listResult.prompts[0]!.arguments).toHaveLength(2); - expect(listResult.prompts[0]!.arguments!.map(a => a.name).sort()).toEqual(['name', 'value']); + expect(listResult.prompts[0]!.arguments!.map(a => a.name).sort()).toStrictEqual(['name', 'value']); // Call the prompt with the new schema const getResult = await client.request( @@ -3201,7 +3201,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); expect(getResult.messages).toHaveLength(1); - expect(getResult.messages).toEqual( + expect(getResult.messages).toStrictEqual( expect.arrayContaining([ { role: 'assistant', @@ -3324,7 +3324,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { let result = await client.request({ method: 'prompts/list' }, ListPromptsResultSchema); expect(result.prompts).toHaveLength(2); - expect(result.prompts.map(p => p.name).sort()).toEqual(['prompt1', 'prompt2']); + expect(result.prompts.map(p => p.name).sort()).toStrictEqual(['prompt1', 'prompt2']); expect(notifications).toHaveLength(0); @@ -3389,9 +3389,9 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.prompts).toHaveLength(1); expect(result.prompts[0]!.name).toBe('test'); - expect(result.prompts[0]!.arguments).toEqual([ - { name: 'name', required: true }, - { name: 'value', required: true } + expect(result.prompts[0]!.arguments).toStrictEqual([ + { description: undefined, name: 'name', required: true }, + { description: undefined, name: 'value', required: true } ]); }); @@ -3801,7 +3801,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result.completion.values).toEqual(['Alice', 'Bob', 'Charlie']); + expect(result.completion.values).toStrictEqual(['Alice', 'Bob', 'Charlie']); expect(result.completion.total).toBe(3); }); @@ -3858,7 +3858,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result.completion.values).toEqual(['Alice']); + expect(result.completion.values).toStrictEqual(['Alice']); expect(result.completion.total).toBe(1); }); @@ -3908,7 +3908,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(receivedRequestId).toBeDefined(); expect(typeof receivedRequestId === 'string' || typeof receivedRequestId === 'number').toBe(true); - expect(result.messages).toEqual( + expect(result.messages).toStrictEqual( expect.arrayContaining([ { role: 'assistant', @@ -4089,7 +4089,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(result.prompts).toHaveLength(1); expect(result.prompts[0]!.name).toBe('test-prompt'); - expect(result.prompts[0]!.arguments).toEqual([ + expect(result.prompts[0]!.arguments).toStrictEqual([ { name: 'name', description: undefined, @@ -4301,7 +4301,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result1.completion.values).toEqual(['project1', 'project2', 'project3']); + expect(result1.completion.values).toStrictEqual(['project1', 'project2', 'project3']); expect(result1.completion.total).toBe(3); // Test with facebook owner @@ -4327,7 +4327,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result2.completion.values).toEqual(['repo1', 'repo2', 'repo3']); + expect(result2.completion.values).toStrictEqual(['repo1', 'repo2', 'repo3']); expect(result2.completion.total).toBe(3); // Test with no resolved context @@ -4348,7 +4348,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result3.completion.values).toEqual([]); + expect(result3.completion.values).toStrictEqual([]); expect(result3.completion.total).toBe(0); }); @@ -4425,7 +4425,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result1.completion.values).toEqual(['Alice']); + expect(result1.completion.values).toStrictEqual(['Alice']); // Test with sales department const result2 = await client.request( @@ -4450,7 +4450,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result2.completion.values).toEqual(['David']); + expect(result2.completion.values).toStrictEqual(['David']); // Test with marketing department const result3 = await client.request( @@ -4475,7 +4475,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result3.completion.values).toEqual(['Grace']); + expect(result3.completion.values).toStrictEqual(['Grace']); // Test with no resolved context const result4 = await client.request( @@ -4495,7 +4495,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result4.completion.values).toEqual(['Guest']); + expect(result4.completion.values).toStrictEqual(['Guest']); }); }); @@ -4638,7 +4638,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2, 'same_week'); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Found these alternatives: 2024-12-26, 2024-12-27, 2024-12-28' @@ -4676,7 +4676,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).not.toHaveBeenCalled(); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'No booking made. Original date not available.' @@ -4711,7 +4711,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).not.toHaveBeenCalled(); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'No booking made. Original date not available.' @@ -4761,7 +4761,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(emailResult.content).toEqual([ + expect(emailResult.content).toStrictEqual([ { type: 'text', text: 'Email contact: test@example.com' @@ -4776,7 +4776,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(phoneResult.content).toEqual([ + expect(phoneResult.content).toStrictEqual([ { type: 'text', text: 'Phone contact: +1234567890' @@ -4823,7 +4823,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'User: 123, John Doe, 30 years old' @@ -4884,7 +4884,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Processed: HELLO, 10, WORLD' @@ -4927,7 +4927,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }); expect(invalidTypeResult.isError).toBe(true); - expect(invalidTypeResult.content).toEqual( + expect(invalidTypeResult.content).toStrictEqual( expect.arrayContaining([ expect.objectContaining({ type: 'text', @@ -4981,7 +4981,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { arguments: { name: ' World ' } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Hello, World!' @@ -5026,7 +5026,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { arguments: { firstName: 'John', lastName: 'Doe' } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Full name: John Doe' @@ -5066,7 +5066,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { arguments: { value: 'test' } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Value: test, Processed: true' @@ -5124,7 +5124,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { arguments: { name: 'items', count: '5' } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'items: 5 -> 10' @@ -5228,7 +5228,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ReadResourceResultSchema ); - expect(result.contents).toEqual([ + expect(result.contents).toStrictEqual([ { uri: 'test://resource', text: 'Updated content' @@ -5588,7 +5588,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result1.completion.values).toEqual(['project1', 'project2', 'project3']); + expect(result1.completion.values).toStrictEqual(['project1', 'project2', 'project3']); expect(result1.completion.total).toBe(3); // Test with facebook owner @@ -5614,7 +5614,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result2.completion.values).toEqual(['repo1', 'repo2', 'repo3']); + expect(result2.completion.values).toStrictEqual(['repo1', 'repo2', 'repo3']); expect(result2.completion.total).toBe(3); // Test with no resolved context @@ -5635,7 +5635,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result3.completion.values).toEqual([]); + expect(result3.completion.values).toStrictEqual([]); expect(result3.completion.total).toBe(0); }); @@ -5712,7 +5712,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result1.completion.values).toEqual(['Alice']); + expect(result1.completion.values).toStrictEqual(['Alice']); // Test with sales department const result2 = await client.request( @@ -5737,7 +5737,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result2.completion.values).toEqual(['David']); + expect(result2.completion.values).toStrictEqual(['David']); // Test with marketing department const result3 = await client.request( @@ -5762,7 +5762,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result3.completion.values).toEqual(['Grace']); + expect(result3.completion.values).toStrictEqual(['Grace']); // Test with no resolved context const result4 = await client.request( @@ -5782,7 +5782,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { CompleteResultSchema ); - expect(result4.completion.values).toEqual(['Guest']); + expect(result4.completion.values).toStrictEqual(['Guest']); }); }); @@ -5926,7 +5926,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2, 'same_week'); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Found these alternatives: 2024-12-26, 2024-12-27, 2024-12-28' @@ -5964,7 +5964,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).not.toHaveBeenCalled(); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'No booking made. Original date not available.' @@ -5999,7 +5999,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { expect(checkAvailability).toHaveBeenCalledWith('ABC Restaurant', '2024-12-25', 2); expect(findAlternatives).not.toHaveBeenCalled(); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'No booking made. Original date not available.' @@ -6049,7 +6049,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(emailResult.content).toEqual([ + expect(emailResult.content).toStrictEqual([ { type: 'text', text: 'Email contact: test@example.com' @@ -6064,7 +6064,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(phoneResult.content).toEqual([ + expect(phoneResult.content).toStrictEqual([ { type: 'text', text: 'Phone contact: +1234567890' @@ -6111,7 +6111,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'User: 123, John Doe, 30 years old' @@ -6172,7 +6172,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { } }); - expect(result.content).toEqual([ + expect(result.content).toStrictEqual([ { type: 'text', text: 'Processed: HELLO, 10, WORLD' @@ -6215,7 +6215,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }); expect(invalidTypeResult.isError).toBe(true); - expect(invalidTypeResult.content).toEqual( + expect(invalidTypeResult.content).toStrictEqual( expect.arrayContaining([ expect.objectContaining({ type: 'text', @@ -6233,7 +6233,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { }); expect(invalidDiscriminatorResult.isError).toBe(true); - expect(invalidDiscriminatorResult.content).toEqual( + expect(invalidDiscriminatorResult.content).toStrictEqual( expect.arrayContaining([ expect.objectContaining({ type: 'text', @@ -6449,7 +6449,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Should receive CallToolResult directly, not CreateTaskResult expect(result).toHaveProperty('content'); - expect(result.content).toEqual([{ type: 'text' as const, text: 'Result: 42' }]); + expect(result.content).toStrictEqual([{ type: 'text' as const, text: 'Result: 42' }]); expect(result).not.toHaveProperty('task'); // Wait for async operations to complete @@ -6675,7 +6675,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Should receive the error result expect(result).toHaveProperty('content'); - expect(result.content).toEqual([{ type: 'text' as const, text: 'Error occurred' }]); + expect(result.content).toStrictEqual([{ type: 'text' as const, text: 'Error occurred' }]); expect(result.isError).toBe(true); // Wait for async operations to complete @@ -6778,7 +6778,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Should receive an error since cancelled tasks don't have results expect(result).toHaveProperty('content'); - expect(result.content).toEqual([{ type: 'text' as const, text: expect.stringContaining('has no result stored') }]); + expect(result.content).toStrictEqual([{ type: 'text' as const, text: expect.stringContaining('has no result stored') }]); // Wait for async operations to complete await waitForLatch(); diff --git a/test/integration/test/stateManagementStreamableHttp.test.ts b/test/integration/test/stateManagementStreamableHttp.test.ts index c33100efa..0a6fc4a9b 100644 --- a/test/integration/test/stateManagementStreamableHttp.test.ts +++ b/test/integration/test/stateManagementStreamableHttp.test.ts @@ -222,7 +222,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); // Verify tool result - expect(greetingResult.content).toEqual([{ type: 'text', text: 'Hello, Stateless Transport!' }]); + expect(greetingResult.content).toStrictEqual([{ type: 'text', text: 'Hello, Stateless Transport!' }]); // Clean up await transport.close(); @@ -345,7 +345,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { ); // Verify tool result - expect(greetingResult.content).toEqual([{ type: 'text', text: 'Hello, Stateful Transport!' }]); + expect(greetingResult.content).toStrictEqual([{ type: 'text', text: 'Hello, Stateful Transport!' }]); // Clean up await transport.close(); diff --git a/test/integration/test/taskLifecycle.test.ts b/test/integration/test/taskLifecycle.test.ts index 216479e93..9997d6a18 100644 --- a/test/integration/test/taskLifecycle.test.ts +++ b/test/integration/test/taskLifecycle.test.ts @@ -262,7 +262,7 @@ describe('Task Lifecycle Integration Tests', () => { // Verify result is stored const result = await taskStore.getTaskResult(taskId); expect(result).toBeDefined(); - expect(result.content).toEqual([{ type: 'text', text: 'Completed after 500ms' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Completed after 500ms' }]); await transport.close(); }); @@ -304,7 +304,7 @@ describe('Task Lifecycle Integration Tests', () => { // Verify error result is stored const result = await taskStore.getTaskResult(taskId); - expect(result.content).toEqual([{ type: 'text', text: 'Task failed as requested' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Task failed as requested' }]); expect(result.isError).toBe(true); await transport.close(); @@ -561,7 +561,7 @@ describe('Task Lifecycle Integration Tests', () => { expect(receivedMessages[2]!.message).toBe('Request 3 of 3'); // Verify final result includes all responses - expect(result.content).toEqual([{ type: 'text', text: 'Received responses: Response 1, Response 2, Response 3' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Received responses: Response 1, Response 2, Response 3' }]); // Verify task is completed const task = await client.request( @@ -677,10 +677,10 @@ describe('Task Lifecycle Integration Tests', () => { // Verify the elicitation request had related-task metadata expect(elicitationRequestMeta).toBeDefined(); - expect(elicitationRequestMeta?.[RELATED_TASK_META_KEY]).toEqual({ taskId }); + expect(elicitationRequestMeta?.[RELATED_TASK_META_KEY]).toStrictEqual({ taskId }); // Verify final result - expect(result.content).toEqual([{ type: 'text', text: 'Hello, TestUser!' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Hello, TestUser!' }]); // Verify task is now completed const finalTask = await elicitClient.request( @@ -1294,7 +1294,7 @@ describe('Task Lifecycle Integration Tests', () => { } // Verify final result is correct - expect(result.content).toEqual([{ type: 'text', text: 'Received all responses: Response 1, Response 2, Response 3' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Received all responses: Response 1, Response 2, Response 3' }]); // Verify task is now completed task = await client.request( @@ -1474,7 +1474,7 @@ describe('Task Lifecycle Integration Tests', () => { expect(receivedMessages[1]!.message).toBe('Quick message 2 of 2'); // Verify final result is correct - expect(result.content).toEqual([{ type: 'text', text: 'Task completed quickly' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Task completed quickly' }]); // Verify queue is cleaned up - calling tasks/result again should only return the result receivedMessages.length = 0; // Clear the array @@ -1489,7 +1489,7 @@ describe('Task Lifecycle Integration Tests', () => { // No messages should be delivered on second call (queue was cleaned up) expect(receivedMessages.length).toBe(0); - expect(result2.content).toEqual([{ type: 'text', text: 'Task completed quickly' }]); + expect(result2.content).toStrictEqual([{ type: 'text', text: 'Task completed quickly' }]); await transport.close(); }, 10000); @@ -1656,7 +1656,7 @@ describe('Task Lifecycle Integration Tests', () => { // Verify result content const result = lastMessage.result as { content: Array<{ type: string; text: string }> }; - expect(result.content).toEqual([{ type: 'text', text: 'Hello, StreamUser!' }]); + expect(result.content).toStrictEqual([{ type: 'text', text: 'Hello, StreamUser!' }]); await transport.close(); }, 15000); diff --git a/test/integration/test/taskResumability.test.ts b/test/integration/test/taskResumability.test.ts index 1e4d8a0fd..178a95202 100644 --- a/test/integration/test/taskResumability.test.ts +++ b/test/integration/test/taskResumability.test.ts @@ -2,13 +2,13 @@ import { randomUUID } from 'node:crypto'; import { createServer, type Server } from 'node:http'; import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client'; +import type { EventStore, JSONRPCMessage } from '@modelcontextprotocol/server'; import { CallToolResultSchema, LoggingMessageNotificationSchema, McpServer, StreamableHTTPServerTransport } from '@modelcontextprotocol/server'; -import type { EventStore, JSONRPCMessage } from '@modelcontextprotocol/server'; import type { ZodMatrixEntry } from '@modelcontextprotocol/test-helpers'; import { listenOnRandomPort, zodTestMatrix } from '@modelcontextprotocol/test-helpers'; diff --git a/test/integration/test/title.test.ts b/test/integration/test/title.test.ts index 4eec82335..ada2197fc 100644 --- a/test/integration/test/title.test.ts +++ b/test/integration/test/title.test.ts @@ -191,7 +191,7 @@ describe.each(zodTestMatrix)('$zodVersionLabel', (entry: ZodMatrixEntry) => { // Test reading the resource const readResult = await client.readResource({ uri: 'users://123/profile' }); expect(readResult.contents).toHaveLength(1); - expect(readResult.contents).toEqual( + expect(readResult.contents).toStrictEqual( expect.arrayContaining([ { text: expect.stringContaining('Profile data for user 123'),