import { describe, it, expect } from 'vitest' import { slugify } from '../slugify' describe('slugify', () => { it('converts to lowercase', () => { expect(slugify('Hello World')).toBe('hello-world') }) it('replaces spaces with hyphens', () => { expect(slugify('foo bar baz')).toBe('foo-bar-baz') }) it('transliterates German umlauts', () => { expect(slugify('Ärger über Öl füßen')).toBe('aerger-ueber-oel-fuessen') }) it('transliterates uppercase umlauts', () => { expect(slugify('Ä Ö Ü')).toBe('ae-oe-ue') }) it('transliterates ß', () => { expect(slugify('Straße')).toBe('strasse') }) it('removes non-ASCII characters after transliteration', () => { expect(slugify('Café résumé')).toBe('caf-rsum') }) it('replaces special characters with hyphens', () => { expect(slugify('hello@world! #test')).toBe('hello-world-test') }) it('collapses consecutive hyphens', () => { expect(slugify('foo---bar')).toBe('foo-bar') }) it('trims leading and trailing hyphens', () => { expect(slugify('--hello--')).toBe('hello') }) it('truncates to 60 characters', () => { const long = 'a'.repeat(80) expect(slugify(long).length).toBeLessThanOrEqual(60) }) it('does not break mid-word when truncating', () => { // 60 chars of 'a' should just be 60 a's (no word boundary issue) const result = slugify('a'.repeat(65)) expect(result.length).toBe(60) expect(result).toBe('a'.repeat(60)) }) it('handles empty string', () => { expect(slugify('')).toBe('') }) it('handles string that becomes empty after processing', () => { expect(slugify('!@#$%')).toBe('') }) it('handles emoji', () => { const result = slugify('Party 🎉 time') expect(result).toBe('party-time') }) it('produces Sommerfest am See example from spec', () => { expect(slugify('Sommerfest am See')).toBe('sommerfest-am-see') }) })