const { passwordDigest } = require('../src/md5crypt'); describe('passwordDigest', () => { it('returns a 40-char hex string', () => { expect(passwordDigest('password', 'salt')).toMatch(/^[0-9a-f]{40}$/); }); it('is deterministic', () => { expect(passwordDigest('mypass', 'mysalt')).toBe(passwordDigest('mypass', 'mysalt')); }); it('differs for different passwords', () => { expect(passwordDigest('pass1', 'salt')).not.toBe(passwordDigest('pass2', 'salt')); }); it('differs for different salts', () => { expect(passwordDigest('pass', 'salt1')).not.toBe(passwordDigest('pass', 'salt2')); }); it('strips $1$ prefix from salt', () => { expect(passwordDigest('pass', '$1$salt')).toBe(passwordDigest('pass', 'salt')); }); it('truncates salt to 8 characters', () => { expect(passwordDigest('pass', 'salt1234extra')).toBe(passwordDigest('pass', 'salt1234')); }); it('handles empty password', () => { expect(passwordDigest('', 'salt')).toMatch(/^[0-9a-f]{40}$/); }); it('handles empty salt', () => { expect(passwordDigest('pass', '')).toMatch(/^[0-9a-f]{40}$/); }); });