Spaces:
Sleeping
Sleeping
HonzysClawdbot
test: add coverage for pure utility modules, fix Vitest 60% threshold (#339)
eb47743 unverified | import { describe, it, expect } from 'vitest' | |
| import { hashPassword, verifyPassword } from '../password' | |
| describe('hashPassword', () => { | |
| it('returns a string with salt:hash format', () => { | |
| const hash = hashPassword('testpassword') | |
| expect(hash).toContain(':') | |
| const parts = hash.split(':') | |
| expect(parts).toHaveLength(2) | |
| expect(parts[0]).toHaveLength(32) // 16 bytes hex = 32 chars | |
| expect(parts[1]).toHaveLength(64) // 32 bytes hex = 64 chars | |
| }) | |
| it('produces different hashes for same password (random salt)', () => { | |
| const hash1 = hashPassword('password123') | |
| const hash2 = hashPassword('password123') | |
| expect(hash1).not.toBe(hash2) | |
| }) | |
| it('handles empty string', () => { | |
| const hash = hashPassword('') | |
| expect(hash).toContain(':') | |
| }) | |
| it('handles special characters', () => { | |
| const hash = hashPassword('p@$$w0rd!#%&*()') | |
| expect(hash).toContain(':') | |
| }) | |
| }) | |
| describe('verifyPassword', () => { | |
| it('returns true for correct password', () => { | |
| const password = 'correctpassword' | |
| const hash = hashPassword(password) | |
| expect(verifyPassword(password, hash)).toBe(true) | |
| }) | |
| it('returns false for wrong password', () => { | |
| const hash = hashPassword('correctpassword') | |
| expect(verifyPassword('wrongpassword', hash)).toBe(false) | |
| }) | |
| it('returns false for malformed stored hash (no colon)', () => { | |
| expect(verifyPassword('password', 'malformedhash')).toBe(false) | |
| }) | |
| it('returns false for empty stored hash', () => { | |
| expect(verifyPassword('password', '')).toBe(false) | |
| }) | |
| it('returns false when salt missing', () => { | |
| expect(verifyPassword('password', ':somehash')).toBe(false) | |
| }) | |
| it('returns false when hash missing', () => { | |
| expect(verifyPassword('password', 'somesalt:')).toBe(false) | |
| }) | |
| it('is case-sensitive', () => { | |
| const hash = hashPassword('Password') | |
| expect(verifyPassword('password', hash)).toBe(false) | |
| expect(verifyPassword('PASSWORD', hash)).toBe(false) | |
| expect(verifyPassword('Password', hash)).toBe(true) | |
| }) | |
| it('verifies consistently across multiple calls', () => { | |
| const password = 'stable-password' | |
| const hash = hashPassword(password) | |
| expect(verifyPassword(password, hash)).toBe(true) | |
| expect(verifyPassword(password, hash)).toBe(true) | |
| expect(verifyPassword(password, hash)).toBe(true) | |
| }) | |
| }) | |