From 52556a858a482ef91c67ea06ec0d2d54bd6dfd2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kh=E1=BA=A3i?= Date: Fri, 13 Feb 2026 04:54:13 +0700 Subject: [PATCH] refactor(test): some small polishments (#10603) * test: full message * refactor: consistent indentation * docs: remove extraneous comment * test: more cases --- .../test/oidcAuthToken.test.ts | 45 +++++++++++++++---- .../test/oidcIdToken.test.ts | 9 ++-- .../test/oidcProvenance.test.ts | 22 ++++++--- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/releasing/plugin-commands-publishing/test/oidcAuthToken.test.ts b/releasing/plugin-commands-publishing/test/oidcAuthToken.test.ts index 275871354f..ae31d427f8 100644 --- a/releasing/plugin-commands-publishing/test/oidcAuthToken.test.ts +++ b/releasing/plugin-commands-publishing/test/oidcAuthToken.test.ts @@ -125,7 +125,7 @@ describe('fetchAuthToken', () => { await expect(promise).rejects.toHaveProperty(['code'], 'ERR_PNPM_AUTH_TOKEN_FETCH') }) - test('throws AuthTokenExchangeError when response is not ok', async () => { + test('throws AuthTokenExchangeError when response is not ok and returns a payload of error', async () => { const mockFetch = jest.fn(async () => ({ ok: false, status: 401, @@ -142,6 +142,35 @@ describe('fetchAuthToken', () => { await expect(promise).rejects.toHaveProperty(['httpStatus'], 401) await expect(promise).rejects.toHaveProperty(['errorResponse', 'body', 'message'], 'Unauthorized') await expect(promise).rejects.toHaveProperty(['code'], 'ERR_PNPM_AUTH_TOKEN_EXCHANGE') + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed token exchange request with body message: Unauthorized (status code 401)' + ) + }) + + test('throws AuthTokenExchangeError when response is not ok and the returned payload could not be fetched', async () => { + const mockFetch = jest.fn(async () => ({ + ok: false, + status: 401, + json: async () => { + throw new Error('no json') + }, + })) + + const context: AuthTokenContext = { + fetch: mockFetch, + } + + const promise = fetchAuthToken({ context, idToken, packageName, registry }) + + await expect(promise).rejects.toBeInstanceOf(AuthTokenExchangeError) + await expect(promise).rejects.toHaveProperty(['httpStatus'], 401) + await expect(promise).rejects.toHaveProperty(['errorResponse'], undefined) + await expect(promise).rejects.toHaveProperty(['code'], 'ERR_PNPM_AUTH_TOKEN_EXCHANGE') + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed token exchange request with body message: Unknown error (status code 401)' + ) }) test('handles exchange error with missing body message', async () => { @@ -159,7 +188,10 @@ describe('fetchAuthToken', () => { await expect(promise).rejects.toBeInstanceOf(AuthTokenExchangeError) await expect(promise).rejects.toHaveProperty(['httpStatus'], 403) - await expect(promise).rejects.toMatchObject({ message: expect.stringContaining('Unknown error') }) + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed token exchange request with body message: Unknown error (status code 403)' + ) }) test('handles exchange error when json response is valid', async () => { @@ -232,8 +264,7 @@ describe('fetchAuthToken', () => { fetch: mockFetch, } - await expect(fetchAuthToken({ context, idToken, packageName, registry })) - .rejects.toThrow(AuthTokenMalformedJsonError) + await expect(fetchAuthToken({ context, idToken, packageName, registry })).rejects.toThrow(AuthTokenMalformedJsonError) }) test('throws AuthTokenMalformedJsonError when JSON response is null', async () => { @@ -247,8 +278,7 @@ describe('fetchAuthToken', () => { fetch: mockFetch, } - await expect(fetchAuthToken({ context, idToken, packageName, registry })) - .rejects.toThrow(AuthTokenMalformedJsonError) + await expect(fetchAuthToken({ context, idToken, packageName, registry })).rejects.toThrow(AuthTokenMalformedJsonError) }) test('throws AuthTokenMalformedJsonError when JSON response is not an object', async () => { @@ -262,7 +292,6 @@ describe('fetchAuthToken', () => { fetch: mockFetch, } - await expect(fetchAuthToken({ context, idToken, packageName, registry })) - .rejects.toThrow(AuthTokenMalformedJsonError) + await expect(fetchAuthToken({ context, idToken, packageName, registry })).rejects.toThrow(AuthTokenMalformedJsonError) }) }) diff --git a/releasing/plugin-commands-publishing/test/oidcIdToken.test.ts b/releasing/plugin-commands-publishing/test/oidcIdToken.test.ts index 372db46abc..2dbe9da26f 100644 --- a/releasing/plugin-commands-publishing/test/oidcIdToken.test.ts +++ b/releasing/plugin-commands-publishing/test/oidcIdToken.test.ts @@ -81,8 +81,7 @@ describe('getIdToken', () => { process: { env: {} }, } - await expect(getIdToken({ context, registry })) - .rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) + await expect(getIdToken({ context, registry })).rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) }) test('throws error when only ACTIONS_ID_TOKEN_REQUEST_TOKEN is set', async () => { @@ -94,8 +93,7 @@ describe('getIdToken', () => { process: { env: { ACTIONS_ID_TOKEN_REQUEST_TOKEN: 'token' } }, } - await expect(getIdToken({ context, registry })) - .rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) + await expect(getIdToken({ context, registry })).rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) }) test('throws error when only ACTIONS_ID_TOKEN_REQUEST_URL is set', async () => { @@ -107,8 +105,7 @@ describe('getIdToken', () => { process: { env: { ACTIONS_ID_TOKEN_REQUEST_URL: 'https://example.com' } }, } - await expect(getIdToken({ context, registry })) - .rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) + await expect(getIdToken({ context, registry })).rejects.toThrow(IdTokenGitHubWorkflowIncorrectPermissionsError) }) test('fetches ID token from GitHub Actions successfully', async () => { diff --git a/releasing/plugin-commands-publishing/test/oidcProvenance.test.ts b/releasing/plugin-commands-publishing/test/oidcProvenance.test.ts index cecbd78857..86cc9e1890 100644 --- a/releasing/plugin-commands-publishing/test/oidcProvenance.test.ts +++ b/releasing/plugin-commands-publishing/test/oidcProvenance.test.ts @@ -13,7 +13,6 @@ describe('determineProvenance', () => { const packageName = '@pnpm/test-package' const authToken = 'test-auth-token' - // Helper to create a valid JWT-like token function createIdToken (payload: Record): string { const header = { alg: 'RS256', typ: 'JWT' } const headerB64 = Buffer.from(JSON.stringify(header)).toString('base64url') @@ -328,7 +327,10 @@ describe('determineProvenance', () => { await expect(promise).rejects.toHaveProperty(['registry'], registry) await expect(promise).rejects.toHaveProperty(['errorResponse', 'code'], 'NOT_FOUND') await expect(promise).rejects.toHaveProperty(['errorResponse', 'message'], 'Package not found') - await expect(promise).rejects.toMatchObject({ message: expect.stringContaining('NOT_FOUND: Package not found') }) + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed to fetch visibility for package @pnpm/test-package from registry https://registry.npmjs.org due to NOT_FOUND: Package not found (status code 404)' + ) }) test('handles visibility fetch error with only code', async () => { @@ -355,8 +357,10 @@ describe('determineProvenance', () => { }) await expect(promise).rejects.toBeInstanceOf(ProvenanceFailedToFetchVisibilityError) - await expect(promise).rejects.toMatchObject({ message: expect.stringContaining('UNAUTHORIZED') }) - await expect(promise).rejects.toMatchObject({ message: expect.not.stringContaining(': ') }) + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed to fetch visibility for package @pnpm/test-package from registry https://registry.npmjs.org due to UNAUTHORIZED (status code 401)' + ) }) test('handles visibility fetch error with only message', async () => { @@ -383,7 +387,10 @@ describe('determineProvenance', () => { }) await expect(promise).rejects.toBeInstanceOf(ProvenanceFailedToFetchVisibilityError) - await expect(promise).rejects.toMatchObject({ message: expect.stringContaining('Internal server error') }) + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed to fetch visibility for package @pnpm/test-package from registry https://registry.npmjs.org due to Internal server error (status code 500)' + ) }) test('handles visibility fetch error with no error details', async () => { @@ -410,7 +417,10 @@ describe('determineProvenance', () => { }) await expect(promise).rejects.toBeInstanceOf(ProvenanceFailedToFetchVisibilityError) - await expect(promise).rejects.toMatchObject({ message: expect.stringContaining('an unknown error') }) + await expect(promise).rejects.toHaveProperty( + ['message'], + 'Failed to fetch visibility for package @pnpm/test-package from registry https://registry.npmjs.org due to an unknown error (status code 503)' + ) }) test('handles visibility fetch error when JSON parsing fails', async () => {