import { describe, expect, it } from 'vitest'; import { awayDurationOk, browserOffset, isOffsetZone, validDisplayName, validEmail } from './profileValidation'; describe('validDisplayName', () => { it.each([ ['Kaya', true], ['Кая', true], ['Name_P. Last', true], ['Mr.Smith', true], ['Mr. Smith', true], [' Kaya ', true], ['Name P._Last', false], ['Name Last', false], ['_Name', false], ['Anna B.', true], ['Name.', true], ['Name..', false], ['Name_', false], ['Name2', true], // a trailing digit is allowed ['Аня2007', true], // a trailing year ['Player12345', true], // 5 trailing digits — the max ['Player123456', false], // 6 trailing digits — over the limit ['Dark2Wolf', false], // a digit in the middle ['12345', false], // must start with a letter ['Name2.', false], // digits and a trailing dot cannot combine ['Anna B.2', false], // a trailing dot and digits cannot combine ['Night.Fox2007', true], // one "." special; digits do not count ['a.a.a.a.a.a2007', true], // 5 dots + a digit run still passes ['', false], ['a'.repeat(33), false], ['a.a.a.a.a.a', true], // 5 dots — at the special-char limit ['a.a.a.a.a.a.a', false], // 6 dots — over the limit ['J. R. R. Tolkien', true], // 3 dots; spaces are not special ])('%s -> %s', (name, ok) => { expect(validDisplayName(name)).toBe(ok); }); }); describe('validEmail', () => { it('accepts a normal address', () => expect(validEmail('you@example.com')).toBe(true)); it('rejects a missing domain', () => expect(validEmail('you@')).toBe(false)); it('rejects spaces', () => expect(validEmail('a b@x.com')).toBe(false)); }); describe('awayDurationOk', () => { it.each([ ['22:00', '06:00', true], ['00:00', '12:00', true], ['08:00', '21:00', false], ['07:00', '07:00', true], ['20:00', '09:00', false], ])('%s-%s -> %s', (s, e, ok) => expect(awayDurationOk(s, e)).toBe(ok)); }); describe('timezone helpers', () => { it('detects offset zones', () => { expect(isOffsetZone('+03:00')).toBe(true); expect(isOffsetZone('Europe/Moscow')).toBe(false); }); it('formats the browser offset as ±HH:MM', () => { expect(browserOffset()).toMatch(/^[+-]\d{2}:\d{2}$/); }); });