Files
arkvault/test/unit/keyring.test.ts
2026-10-20 03:12:53 +09:00

56 lines
1.7 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import { keyring } from "#lib/client/keys/keyring.svelte.ts";
import type { MasterKey } from "#lib/client/keys/types.ts";
vi.mock("#lib/client/storage/indexed-db/index.ts", () => ({
getClientKey: vi.fn(async () => null),
getMasterKeys: vi.fn(async () => []),
getHmacSecrets: vi.fn(async () => []),
storeClientKey: vi.fn(async () => {}),
storeMasterKeys: vi.fn(async () => {}),
storeHmacSecrets: vi.fn(async () => {}),
}));
const key = {} as CryptoKey;
const masterKey = (version: number, state: MasterKey["state"]): MasterKey => ({
version,
state,
key,
});
beforeEach(async () => {
await keyring.setMasterKeys([]);
await keyring.setHmacSecrets([]);
});
describe("Keyring", () => {
it("uses the latest active master key for new data", async () => {
await keyring.setMasterKeys([
masterKey(1, "retired"),
masterKey(3, "active"),
masterKey(2, "active"),
]);
expect(keyring.hasMasterKeys).toBe(true);
expect(keyring.activeMasterKey.version).toBe(3);
});
it("finds master keys by version", async () => {
await keyring.setMasterKeys([masterKey(1, "retired"), masterKey(2, "active")]);
expect(keyring.getMasterKey(1).state).toBe("retired");
expect(() => keyring.getMasterKey(3)).toThrow("not found");
});
it("throws if there is no active key", async () => {
await keyring.setMasterKeys([masterKey(1, "retired")]);
expect(() => keyring.activeMasterKey).toThrow("Active master key not found");
expect(() => keyring.activeHmacSecret).toThrow("Active HMAC secret not found");
});
it("requires client keys", () => {
expect(() => keyring.requireClientKeys()).toThrow("Client keys not found");
});
});