password.test.ts•1.81 kB
import { describe, expect, it } from 'vitest';
import { generatePassword } from './password.js';
describe('generatePassword', () => {
it('should generate a password with default options', () => {
const password = generatePassword();
expect(password.length).toBe(10);
expect(/^[A-Za-z]+$/.test(password)).toBe(true);
});
it('should generate a password with custom length', () => {
const password = generatePassword({ length: 16 });
expect(password.length).toBe(16);
});
it('should generate a password with numbers', () => {
const password = generatePassword({
numbers: true,
uppercase: false,
lowercase: false,
});
expect(/[0-9]/.test(password)).toBe(true);
});
it('should generate a password with symbols', () => {
const password = generatePassword({ symbols: true });
expect(/[!@#$%^&*()_+~`|}{[\]:;?><,./-=]/.test(password)).toBe(true);
});
it('should generate a password with uppercase only', () => {
const password = generatePassword({ uppercase: true, lowercase: false });
expect(/^[A-Z]+$/.test(password)).toBe(true);
});
it('should generate a password with lowercase only', () => {
const password = generatePassword({ uppercase: false, lowercase: true });
expect(/^[a-z]+$/.test(password)).toBe(true);
});
it('should not generate the same password twice', () => {
const password1 = generatePassword();
const password2 = generatePassword();
expect(password1).not.toBe(password2);
});
it('should throw an error if no character sets are selected', () => {
expect(() =>
generatePassword({
uppercase: false,
lowercase: false,
numbers: false,
symbols: false,
})
).toThrow('at least one character set must be selected');
});
});