import { afterEach, expect, test, vi } from "vitest" import { comparePassword, hashPassword } from "#Source/credential/index.ts" afterEach(() => { vi.restoreAllMocks() }) test("hashPassword returns v1 PBKDF2-SHA-512 serialized format", async () => { vi.spyOn(crypto, "getRandomValues").mockImplementation((buffer) => { if (buffer === null) { return buffer } const target = buffer as Uint8Array target.fill(0xab) return buffer }) const hashedPassword = await hashPassword("secret") const segments = hashedPassword.split(":") expect(segments).toHaveLength(6) expect(segments[0]).toBe("v1") expect(segments[1]).toBe("pbkdf2") expect(segments[2]).toBe("sha512") expect(segments[3]).toBe("210000") expect(segments[4]).toBe("abababababababababababababababab") expect(segments[5]).toHaveLength(128) expect(segments[5]).toMatch(/^[0-9A-F]+$/i) }) test("comparePassword returns true for matching password and false for mismatching password", async () => { const hashedPassword = await hashPassword("secret") await expect(comparePassword("secret", hashedPassword)).resolves.toBe(true) await expect(comparePassword("other", hashedPassword)).resolves.toBe(false) }) test("comparePassword returns false when serialized password format is invalid", async () => { await expect( comparePassword("secret", "v1:pbkdf2:sha512:210000:invalid-salt:abcd"), ).resolves.toBe(false) })