Skip to content

Commit 0586fbf

Browse files
Test: Add crypto API check and improve rate limit error handling
Co-authored-by: justin.r.hall <justin.r.hall@gmail.com>
1 parent 4a3d9e9 commit 0586fbf

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

src/__tests__/pwned-password.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { describe, it, expect } from 'vitest';
1+
import { describe, it, expect, vi } from 'vitest';
22
import { http } from 'msw';
33
import { server } from '../../mocks/server.js';
44
import { PASSWORD, SHA1_RESPONSE_BODY } from '../../test/fixtures.js';
@@ -89,4 +89,18 @@ describe('pwnedPassword', () => {
8989
return pwnedPassword(PASSWORD, { addPadding: true });
9090
});
9191
});
92+
93+
describe('environment', () => {
94+
it('rejects when the Web Crypto API is unavailable', async () => {
95+
expect.assertions(1);
96+
vi.stubGlobal('crypto', undefined as unknown as Crypto);
97+
try {
98+
await expect(pwnedPassword('anything')).rejects.toThrow(
99+
'The Web Crypto API is not available in this environment.',
100+
);
101+
} finally {
102+
vi.unstubAllGlobals();
103+
}
104+
});
105+
});
92106
});

src/api/haveibeenpwned/__tests__/fetch-from-api.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,28 @@ describe('internal (haveibeenpwned): fetchFromApi', () => {
146146
'[RateLimitError: Rate limit is exceeded. Try again in 2 seconds.]',
147147
);
148148
});
149+
150+
it('sets retryAfterSeconds to undefined when header is missing', async () => {
151+
server.use(
152+
http.get('*', () => {
153+
return new Response(JSON.stringify(TOO_MANY_REQUESTS.body), {
154+
status: TOO_MANY_REQUESTS.status,
155+
// omit retry-after header
156+
});
157+
}),
158+
);
159+
let err;
160+
161+
try {
162+
await fetchFromApi('/service/rate_limited', { apiKey });
163+
} catch (e: unknown) {
164+
err = e;
165+
}
166+
167+
expect(err).toBeInstanceOf(Error);
168+
expect((err as Error).name).toBe('RateLimitError');
169+
expect((err as { retryAfterSeconds?: number }).retryAfterSeconds).toBeUndefined();
170+
});
149171
});
150172

151173
describe('unexpected HTTP error', () => {

0 commit comments

Comments
 (0)