Files
tg_bot_gen/tests/smoke.mjs
T

56 lines
2.2 KiB
JavaScript

// Смоук-тест генератора: запускается в CI (node tests/smoke.mjs)
import assert from 'node:assert/strict';
import { generatePassword, strength } from '../lib/generator.js';
const cases = [];
// 1. Обычный пароль: все наборы, длина соблюдена
for (let i = 0; i < 50; i++) {
const p = generatePassword({ length: 16, upper: true, lower: true, digits: true, symbols: true });
assert.equal(p.length, 16, 'length 16');
assert.match(p, /[A-Z]/);
assert.match(p, /[a-z]/);
assert.match(p, /[0-9]/);
assert.match(p, /[^a-zA-Z0-9]/);
cases.push('random16');
}
// 2. Без похожих символов: ni один запрещённый символ
for (let i = 0; i < 50; i++) {
const p = generatePassword({ length: 24, upper: true, lower: true, digits: true, symbols: true, excludeAmbiguous: true });
assert.equal(p.length, 24);
assert.doesNotMatch(p, /[l1oOI0]/, 'no ambiguous chars');
cases.push('noAmbiguous24');
}
// 3. Произносимый режим
const pr = generatePassword({ length: 12, pronounceable: true });
assert.equal(pr.length, 12);
assert.match(pr, /[aeiou]/, 'has vowels');
cases.push('pronounceable12');
// 4. Границы длины
assert.equal(generatePassword({ length: 1, upper: true }).length, 4, 'min length clamps to 4');
assert.equal(generatePassword({ length: 999 }).length, 128, 'max length clamps to 128');
cases.push('bounds');
// 5. Пустые наборы -> не падает
const p5 = generatePassword({ length: 8 });
assert.equal(p5.length, 8);
cases.push('noSetsFallback');
// 6. Стойкость
const st = strength('aZ1!');
assert.ok(st.bits > 0 && typeof st.level === 'string');
const stStrong = strength(generatePassword({ length: 64 }));
assert.ok(stStrong.bits >= 200, 'long password has high entropy');
cases.push('strength');
// 7. Уникальность (1000 паролей не повторяются)
const set = new Set();
for (let i = 0; i < 1000; i++) set.add(generatePassword({ length: 16 }));
assert.equal(set.size, 1000, 'all unique');
cases.push('uniqueness');
console.log('SMOKE OK — ' + cases.length + ' групп проверок пройдено');