ext(sw): add preview_totp_from_secret popup handler
This commit is contained in:
@@ -1000,3 +1000,41 @@ describe('list_groups', () => {
|
||||
expect(resp.data).toEqual({ groups: [] });
|
||||
});
|
||||
});
|
||||
|
||||
// --- preview_totp_from_secret ---
|
||||
|
||||
describe('preview_totp_from_secret', () => {
|
||||
let originalChrome: any;
|
||||
beforeEach(() => { originalChrome = (globalThis as any).chrome; });
|
||||
afterEach(() => { (globalThis as any).chrome = originalChrome; });
|
||||
|
||||
it('returns code for valid base32', async () => {
|
||||
const state = makeState();
|
||||
state.wasm = {
|
||||
totp_compute: vi.fn().mockReturnValue({ code: '123456', expires_at: 9_999_999_999 }),
|
||||
};
|
||||
const resp = await route(
|
||||
{ type: 'preview_totp_from_secret', secret_b32: 'JBSWY3DPEHPK3PXP' } as any,
|
||||
state, makePopupSender(),
|
||||
);
|
||||
expect(resp.ok).toBe(true);
|
||||
expect(resp.data).toEqual({ code: '123456', expires_at: 9_999_999_999 });
|
||||
// Verify a transient TotpConfig was passed (sha1, 6 digits, 30s)
|
||||
const cfgArg = JSON.parse(state.wasm.totp_compute.mock.calls[0][0]);
|
||||
expect(cfgArg.algorithm).toBe('sha1');
|
||||
expect(cfgArg.digits).toBe(6);
|
||||
expect(cfgArg.period_seconds).toBe(30);
|
||||
});
|
||||
|
||||
it('rejects invalid base32', async () => {
|
||||
const state = makeState();
|
||||
state.wasm = { totp_compute: vi.fn() };
|
||||
const resp = await route(
|
||||
{ type: 'preview_totp_from_secret', secret_b32: 'too-short!!!' } as any,
|
||||
state, makePopupSender(),
|
||||
);
|
||||
expect(resp.ok).toBe(false);
|
||||
expect(resp.error).toMatch(/invalid/i);
|
||||
expect(state.wasm.totp_compute).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user