import {computeDefaultDeadline, slugBase, slugifyName} from '../../src/models/feedback/admin/events.admin.service'; describe('slugifyName', () => { it('lowercases and hyphenates', () => { expect(slugifyName('Sommerkonzert 2026')).toBe('sommerkonzert-2026'); }); it('transliterates umlauts', () => { expect(slugifyName('Frühlingskonzert')).toBe('fruehlingskonzert'); expect(slugifyName('Weihnachtsgrüße')).toBe('weihnachtsgruesse'); }); it('strips punctuation and collapses separators', () => { expect(slugifyName('Konzert: "Klänge & Farben"!')).toBe('konzert-klaenge-farben'); }); it('trims leading and trailing hyphens', () => { expect(slugifyName(' -- Herbstkonzert -- ')).toBe('herbstkonzert'); }); }); describe('slugBase', () => { it('appends the concert year when the name does not already carry it', () => { expect(slugBase('Sommerkonzert', '2026-08-01')).toBe('sommerkonzert-2026'); }); it('does not double up the year when the name already ends with it', () => { expect(slugBase('Adventskonzert 2026', '2026-12-06')).toBe('adventskonzert-2026'); }); it('still appends the year when the name contains a different year', () => { expect(slugBase('Jubiläum 2020', '2026-08-01')).toBe('jubilaeum-2020-2026'); }); }); describe('computeDefaultDeadline', () => { it('is 14 days after the event date, at 23:59:59', () => { const deadline = computeDefaultDeadline('2026-08-01'); expect(deadline.getFullYear()).toBe(2026); expect(deadline.getMonth()).toBe(7); // August = index 7 expect(deadline.getDate()).toBe(15); expect(deadline.getHours()).toBe(23); expect(deadline.getMinutes()).toBe(59); expect(deadline.getSeconds()).toBe(59); }); it('rolls over the month correctly', () => { const deadline = computeDefaultDeadline('2026-08-25'); expect(deadline.getMonth()).toBe(8); // September expect(deadline.getDate()).toBe(8); }); it('rolls over the year correctly', () => { const deadline = computeDefaultDeadline('2026-12-25'); expect(deadline.getFullYear()).toBe(2027); expect(deadline.getMonth()).toBe(0); // January expect(deadline.getDate()).toBe(8); }); });