From d1021544a3ea3e995673db6dbd5a7cc9e64720d0 Mon Sep 17 00:00:00 2001 From: Konstantin Konstantinov Date: Thu, 21 May 2026 08:12:05 +0300 Subject: [PATCH 1/2] add tests --- packages/client/test/client/sse.test.ts | 1 + .../client/test/client/streamableHttp.test.ts | 1 + .../client/test/client/tokenProvider.test.ts | 5 +- .../core/test/errors/sdkHttpError.test.ts | 55 +++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 packages/core/test/errors/sdkHttpError.test.ts diff --git a/packages/client/test/client/sse.test.ts b/packages/client/test/client/sse.test.ts index 6948d9a4e0..4ccbb91e5f 100644 --- a/packages/client/test/client/sse.test.ts +++ b/packages/client/test/client/sse.test.ts @@ -1590,6 +1590,7 @@ describe('SSEClientTransport', () => { expect(error).toBeInstanceOf(SdkHttpError); expect((error as SdkHttpError).code).toBe(SdkErrorCode.ClientHttpAuthentication); expect((error as SdkHttpError).status).toBe(401); + expect((error as SdkHttpError).statusText).toBe('Unauthorized'); expect(authProvider.onUnauthorized).toHaveBeenCalledTimes(1); expect(postCount).toBe(2); }); diff --git a/packages/client/test/client/streamableHttp.test.ts b/packages/client/test/client/streamableHttp.test.ts index 0edf8b75ac..6542302c9d 100644 --- a/packages/client/test/client/streamableHttp.test.ts +++ b/packages/client/test/client/streamableHttp.test.ts @@ -1875,6 +1875,7 @@ describe('StreamableHTTPClientTransport', () => { expect(error).toBeInstanceOf(SdkHttpError); expect((error as SdkHttpError).code).toBe(SdkErrorCode.ClientHttpAuthentication); expect((error as SdkHttpError).status).toBe(401); + expect((error as SdkHttpError).statusText).toBe('Unauthorized'); expect(mockAuthProvider.saveTokens).toHaveBeenCalledWith({ access_token: 'new-access-token', token_type: 'Bearer', diff --git a/packages/client/test/client/tokenProvider.test.ts b/packages/client/test/client/tokenProvider.test.ts index e1108267ef..c06a4b58de 100644 --- a/packages/client/test/client/tokenProvider.test.ts +++ b/packages/client/test/client/tokenProvider.test.ts @@ -95,13 +95,14 @@ describe('StreamableHTTPClientTransport with AuthProvider', () => { vi.spyOn(globalThis, 'fetch'); (globalThis.fetch as Mock) - .mockResolvedValueOnce({ ok: false, status: 401, headers: new Headers(), text: async () => 'unauthorized' }) - .mockResolvedValueOnce({ ok: false, status: 401, headers: new Headers(), text: async () => 'unauthorized' }); + .mockResolvedValueOnce({ ok: false, status: 401, statusText: 'Unauthorized', headers: new Headers(), text: async () => 'unauthorized' }) + .mockResolvedValueOnce({ ok: false, status: 401, statusText: 'Unauthorized', headers: new Headers(), text: async () => 'unauthorized' }); const error = await transport.send(message).catch(e => e); expect(error).toBeInstanceOf(SdkHttpError); expect((error as SdkHttpError).code).toBe(SdkErrorCode.ClientHttpAuthentication); expect((error as SdkHttpError).status).toBe(401); + expect((error as SdkHttpError).statusText).toBe('Unauthorized'); expect(authProvider.onUnauthorized).toHaveBeenCalledTimes(1); }); diff --git a/packages/core/test/errors/sdkHttpError.test.ts b/packages/core/test/errors/sdkHttpError.test.ts new file mode 100644 index 0000000000..b217483580 --- /dev/null +++ b/packages/core/test/errors/sdkHttpError.test.ts @@ -0,0 +1,55 @@ +import { describe, it, expect } from 'vitest'; +import { SdkError, SdkErrorCode, SdkHttpError } from '../../src/index.js'; + +describe('SdkHttpError', () => { + it('exposes status and statusText via getters', () => { + const error = new SdkHttpError(SdkErrorCode.ClientHttpAuthentication, 'Unauthorized', { + status: 401, + statusText: 'Unauthorized' + }); + + expect(error.status).toBe(401); + expect(error.statusText).toBe('Unauthorized'); + }); + + it('returns undefined for statusText when omitted', () => { + const error = new SdkHttpError(SdkErrorCode.ClientHttpAuthentication, 'auth failed', { + status: 401 + }); + + expect(error.status).toBe(401); + expect(error.statusText).toBeUndefined(); + }); + + it('is an instance of SdkError', () => { + const error = new SdkHttpError(SdkErrorCode.ClientHttpForbidden, 'Forbidden', { + status: 403, + statusText: 'Forbidden' + }); + + expect(error).toBeInstanceOf(SdkError); + expect(error).toBeInstanceOf(SdkHttpError); + }); + + it('preserves code and message from SdkError', () => { + const error = new SdkHttpError(SdkErrorCode.ClientHttpNotImplemented, 'Not Implemented', { + status: 501, + statusText: 'Not Implemented' + }); + + expect(error.code).toBe(SdkErrorCode.ClientHttpNotImplemented); + expect(error.message).toBe('Not Implemented'); + expect(error.name).toBe('SdkHttpError'); + }); + + it('exposes extra data fields alongside status', () => { + const error = new SdkHttpError(SdkErrorCode.ClientHttpAuthentication, 'auth failed', { + status: 401, + statusText: 'Unauthorized', + retryAfter: 30 + }); + + expect(error.data.retryAfter).toBe(30); + expect(error.status).toBe(401); + }); +}); From c131a83ea50bda4bc53cf6febfbd4e648a5a4eed Mon Sep 17 00:00:00 2001 From: Konstantin Konstantinov Date: Thu, 21 May 2026 08:20:13 +0300 Subject: [PATCH 2/2] format fix --- .../client/test/client/tokenProvider.test.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/client/test/client/tokenProvider.test.ts b/packages/client/test/client/tokenProvider.test.ts index c06a4b58de..4defbc2bd1 100644 --- a/packages/client/test/client/tokenProvider.test.ts +++ b/packages/client/test/client/tokenProvider.test.ts @@ -95,8 +95,20 @@ describe('StreamableHTTPClientTransport with AuthProvider', () => { vi.spyOn(globalThis, 'fetch'); (globalThis.fetch as Mock) - .mockResolvedValueOnce({ ok: false, status: 401, statusText: 'Unauthorized', headers: new Headers(), text: async () => 'unauthorized' }) - .mockResolvedValueOnce({ ok: false, status: 401, statusText: 'Unauthorized', headers: new Headers(), text: async () => 'unauthorized' }); + .mockResolvedValueOnce({ + ok: false, + status: 401, + statusText: 'Unauthorized', + headers: new Headers(), + text: async () => 'unauthorized' + }) + .mockResolvedValueOnce({ + ok: false, + status: 401, + statusText: 'Unauthorized', + headers: new Headers(), + text: async () => 'unauthorized' + }); const error = await transport.send(message).catch(e => e); expect(error).toBeInstanceOf(SdkHttpError);