UNPKG

@bernierllc/content-type-blog-post

Version:

Blog post content type with rich TipTap editor, SEO metadata, database storage, and web publishing

90 lines (73 loc) 3.22 kB
/* Copyright (c) 2025 Bernier LLC This file is licensed to the client under a limited-use license. The client may use and modify this code *only within the scope of the project it was delivered for*. Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC. */ import { isValidSlug, generateSlugFromTitle, ensureUniqueSlug } from '../src/slug'; describe('slug', () => { describe('isValidSlug', () => { it('should accept valid slugs', () => { expect(isValidSlug('test-slug')).toBe(true); expect(isValidSlug('test-slug-123')).toBe(true); expect(isValidSlug('slug')).toBe(true); expect(isValidSlug('123')).toBe(true); }); it('should reject invalid slugs', () => { expect(isValidSlug('Test-Slug')).toBe(false); // uppercase expect(isValidSlug('test_slug')).toBe(false); // underscore expect(isValidSlug('test slug')).toBe(false); // space expect(isValidSlug('test@slug')).toBe(false); // special char expect(isValidSlug('')).toBe(false); // empty }); }); describe('generateSlugFromTitle', () => { it('should convert title to slug', () => { expect(generateSlugFromTitle('Test Blog Post')).toBe('test-blog-post'); }); it('should handle special characters', () => { expect(generateSlugFromTitle('Test! Blog? Post.')).toBe('test-blog-post'); }); it('should handle multiple spaces', () => { expect(generateSlugFromTitle('Test Blog Post')).toBe('test-blog-post'); }); it('should trim hyphens from start and end', () => { expect(generateSlugFromTitle(' Test Blog Post ')).toBe('test-blog-post'); }); it('should handle unicode characters', () => { expect(generateSlugFromTitle('Test Blög Pøst')).toBe('test-blg-pst'); }); it('should handle empty title', () => { expect(generateSlugFromTitle('')).toBe(''); }); it('should replace multiple hyphens with single hyphen', () => { expect(generateSlugFromTitle('Test---Blog---Post')).toBe('test-blog-post'); }); }); describe('ensureUniqueSlug', () => { it('should return original slug if unique', () => { const slug = 'test-post'; const existing = ['other-post', 'another-post']; expect(ensureUniqueSlug(slug, existing)).toBe('test-post'); }); it('should append -1 if slug exists', () => { const slug = 'test-post'; const existing = ['test-post']; expect(ensureUniqueSlug(slug, existing)).toBe('test-post-1'); }); it('should increment counter for multiple conflicts', () => { const slug = 'test-post'; const existing = ['test-post', 'test-post-1', 'test-post-2']; expect(ensureUniqueSlug(slug, existing)).toBe('test-post-3'); }); it('should handle empty existing slugs array', () => { const slug = 'test-post'; expect(ensureUniqueSlug(slug, [])).toBe('test-post'); }); it('should find first available number in sequence', () => { const slug = 'test-post'; const existing = ['test-post', 'test-post-2', 'test-post-3']; expect(ensureUniqueSlug(slug, existing)).toBe('test-post-1'); }); }); });