import { describe, expect, it } from 'vitest'; import { slugify, validateSlug } from '../src/lib/marketplace/slug.ts'; describe('slugify', () => { it('lowercases and dasherizes', () => { expect(slugify('Anna Lang!')).toBe('anna-lang'); }); it('strips leading/trailing dashes', () => { expect(slugify(' hello world ')).toBe('hello-world'); }); it('drops diacritics', () => { expect(slugify('Café Crème')).toBe('cafe-creme'); }); it('caps at 60 chars', () => { const slug = slugify('a'.repeat(120)); expect(slug.length).toBeLessThanOrEqual(60); }); }); describe('validateSlug', () => { it('accepts simple lowercase slugs', () => { expect(validateSlug('anna-lang')).toEqual({ ok: true }); }); it('rejects too short', () => { expect(validateSlug('ab')).toEqual({ ok: false, reason: 'too-short' }); }); it('rejects too long', () => { expect(validateSlug('a'.repeat(70))).toEqual({ ok: false, reason: 'too-long' }); }); it('rejects uppercase', () => { expect(validateSlug('Anna-Lang')).toEqual({ ok: false, reason: 'invalid-chars' }); }); it('rejects underscore', () => { expect(validateSlug('anna_lang')).toEqual({ ok: false, reason: 'invalid-chars' }); }); it('rejects leading dash', () => { expect(validateSlug('-anna')).toEqual({ ok: false, reason: 'invalid-chars' }); }); it('rejects reserved slugs', () => { expect(validateSlug('admin')).toEqual({ ok: false, reason: 'reserved' }); expect(validateSlug('explore')).toEqual({ ok: false, reason: 'reserved' }); expect(validateSlug('marketplace')).toEqual({ ok: false, reason: 'reserved' }); }); });