import { render } from '@testing-library/react'; import { describe, expect, test, vi } from 'vitest'; vi.mock('@/app/(main)/layout.config', () => ({ title: 'Blog', owner: 'Test Owner', })); vi.mock('@/lib/constants', () => ({ baseUrl: new URL('http://localhost:3000'), })); import { PostJsonLd, TagJsonLd } from './json-ld'; describe('json-ld components', () => { test('renders post json-ld with blog posting and breadcrumb graph', () => { const { container } = render( , ); const script = container.querySelector('script[type="application/ld+json"]'); expect(script).toBeInTheDocument(); const payload = JSON.parse(script?.innerHTML ?? '{}'); expect(payload['@context']).toBe('https://schema.org'); expect(payload['@graph']).toHaveLength(2); expect(payload['@graph'][0]['@type']).toBe('BlogPosting'); expect(payload['@graph'][0].mainEntityOfPage['@id']).toBe( 'http://localhost:3000/posts/testing-post', ); }); test('returns null when post is not provided', () => { const { container } = render(); expect(container.firstChild).toBeNull(); }); test('renders tag json-ld with tag-specific breadcrumb item', () => { const { container } = render(); const script = container.querySelector('script[type="application/ld+json"]'); expect(script).toBeInTheDocument(); const payload = JSON.parse(script?.innerHTML ?? '{}'); expect(payload['@graph']).toHaveLength(1); expect(payload['@graph'][0]['@type']).toBe('BreadcrumbList'); expect(payload['@graph'][0].itemListElement[2].item).toBe( 'http://localhost:3000/tags/nextjs', ); }); });