import { passwordMatchValidator, buildPasswordPolicyMessage, } from '../../frontend/src/app/features/shell/change-password/change-password-modal.validators'; import { formatChangePasswordError } from '../../frontend/src/app/features/shell/change-password/password-feedback'; describe('passwordMatchValidator', () => { const grp = (newP: string, conf: string) => ({ get: (k: string) => k === 'newPassword' ? { value: newP } : k === 'confirmNewPassword' ? { value: conf } : { value: '' }, }); it('returns null when both inputs are equal', () => { expect(passwordMatchValidator(grp('Abc123!Xyz', 'Abc123!Xyz'))).toBeNull(); }); it('returns {passwordMismatch:true} when inputs differ', () => { expect(passwordMatchValidator(grp('Abc123!Xyz', 'Other1!Pass'))).toEqual({ passwordMismatch: true }); }); it('returns null when either input is empty (handled by required validators)', () => { expect(passwordMatchValidator(grp('', ''))).toBeNull(); expect(passwordMatchValidator(grp('Abc', ''))).toBeNull(); }); }); describe('buildPasswordPolicyMessage', () => { it('returns the policy description verbatim', () => { expect(buildPasswordPolicyMessage({ minLength: 12, requireMixed: true, description: 'foo bar' })).toBe('foo bar'); }); }); describe('formatChangePasswordError', () => { it('maps INVALID_OLD_PASSWORD to a clear message', () => { expect(formatChangePasswordError({ code: 'INVALID_OLD_PASSWORD' })).toBe('Old password is incorrect'); }); it('maps PASSWORDS_DO_NOT_MATCH', () => { expect(formatChangePasswordError({ code: 'PASSWORDS_DO_NOT_MATCH' })).toBe('New password and confirmation do not match'); }); it('maps PASSWORD_POLICY and surfaces server message if present', () => { expect(formatChangePasswordError({ code: 'PASSWORD_POLICY', message: 'too short' })).toBe('too short'); expect(formatChangePasswordError({ code: 'PASSWORD_POLICY' })).toBe('New password does not meet the policy requirements'); }); it('maps UNAUTHORIZED', () => { expect(formatChangePasswordError({ code: 'UNAUTHORIZED' })).toBe('You must be signed in to change your password'); }); it('falls back to message or default for unknown codes', () => { expect(formatChangePasswordError({ code: 'EXOTIC', message: 'Quux' })).toBe('Quux'); expect(formatChangePasswordError({ code: 'EXOTIC' })).toBe('Failed to change password'); }); it('handles null/undefined code and message', () => { expect(formatChangePasswordError({ code: null, message: null })).toBe('Failed to change password'); }); });