import { describe, it, expect } from 'vitest'; import { parseFeed, pickVoteCount, PRODUCTHUNT_CATEGORY_SLUGS } from './utils.js'; const SAMPLE_ATOM = ` Product Hunt tag:www.producthunt.com,2005:Post/1001 2026-03-26T10:00:00-07:00 Awesome AI Tool <p>The best AI tool ever made</p><p><a href="...">Discussion</a></p> Jane Doe tag:www.producthunt.com,2005:Post/1002 2026-03-25T08:00:00-07:00 Dev Helper <p>Speeds up your workflow</p> John Smith `; describe('parseFeed', () => { it('parses entries into ranked posts', () => { const posts = parseFeed(SAMPLE_ATOM); expect(posts).toHaveLength(2); expect(posts[0].rank).toBe(1); expect(posts[0].name).toBe('Awesome AI Tool'); expect(posts[0].author).toBe('Jane Doe'); expect(posts[0].date).toBe('2026-03-26'); expect(posts[0].url).toBe('https://www.producthunt.com/products/awesome-ai-tool'); expect(posts[0].tagline).toContain('best AI tool'); }); it('strips HTML and Discussion link from tagline', () => { const posts = parseFeed(SAMPLE_ATOM); expect(posts[0].tagline).not.toContain('

'); expect(posts[0].tagline).not.toContain('Discussion'); }); it('returns empty array for empty feed', () => { expect(parseFeed('')).toHaveLength(0); }); it('assigns sequential ranks', () => { const posts = parseFeed(SAMPLE_ATOM); expect(posts.map(p => p.rank)).toEqual([1, 2]); }); it('prefers vote-like candidates over unrelated numeric badges', () => { const votes = pickVoteCount([ { text: '12', className: 'font-semibold', inButton: false, inReviewLink: false }, { text: '98', className: 'vote-button', inButton: true, inReviewLink: false }, ]); expect(votes).toBe('98'); }); it('ignores numbers inside review links', () => { const votes = pickVoteCount([ { text: '120', className: 'text-secondary', inButton: false, inReviewLink: true }, { text: '45', className: 'vote-button', inButton: true, inReviewLink: false }, ]); expect(votes).toBe('45'); }); it('shares category slugs across commands', () => { expect(PRODUCTHUNT_CATEGORY_SLUGS).toContain('developer-tools'); expect(PRODUCTHUNT_CATEGORY_SLUGS).toContain('ai-agents'); }); });