'use strict'; const assert = require('assert'); const bcrypt = require('bcryptjs'); const password = require('../src/password'); describe('Password', () => { describe('.hash()', () => { it('should return a password hash when called', async () => { const hash = await password.hash(12, 'test'); assert(hash.startsWith('$2a$')); }); }); describe('.compare()', async () => { const salt = await bcrypt.genSalt(12); it('should correctly compare a password and a hash', async () => { const hash = await password.hash(12, 'test'); const match = await password.compare('test', hash, true); assert(match); }); it('should correctly handle comparison with no sha wrapping of the input (backwards compatibility)', async () => { const hash = await bcrypt.hash('test', salt); const match = await password.compare('test', hash, false); assert(match); }); it('should continue to function even with passwords > 73 characters', async () => { const arr = []; arr.length = 100; const hash = await password.hash(12, arr.join('a')); arr.length = 150; const match = await password.compare(arr.join('a'), hash, true); assert.strictEqual(match, false); }); it('should process a million-character long password quickly', async () => { // ... because sha512 reduces it to a constant size const arr = []; const start = Date.now(); arr.length = 1000000; await password.hash(12, arr.join('a')); const end = Date.now(); assert(end - start < 5000); }); }); });