admin/lib/seo/legalPages.test.ts
alisaza e1eaf5eff5 feat: initial ghabilee-admin backoffice app
Extract admin dashboard from ghabilee-frontend2 into a dedicated Next.js
app for backoffice.ghabilee.ir (no SEO indexing / Clarity).
2026-09-05 13:12:59 +03:30

42 lines
1.5 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { LEGAL_DOCUMENT_UPDATED_AT_ISO, LEGAL_PAGE_SEO, legalWebPageSchema, refundPolicyFaqSchema } from '@/lib/seo/legalPages'
describe('legal page SEO helpers', () => {
it('keeps absolute legal titles within SERP-safe length', () => {
for (const page of Object.values(LEGAL_PAGE_SEO)) {
expect(page.metaTitle.length).toBeGreaterThan(20)
expect(page.metaTitle.length).toBeLessThanOrEqual(60)
expect(page.metaDescription.length).toBeGreaterThanOrEqual(70)
expect(page.metaDescription.length).toBeLessThanOrEqual(160)
expect(page.h1.length).toBeGreaterThan(5)
}
})
it('emits WebPage schema with language, dates, and site graph links', () => {
const schema = legalWebPageSchema('terms')
expect(schema).toMatchObject({
'@id': 'https://ghabilee.ir/terms#webpage',
inLanguage: 'fa-IR',
datePublished: LEGAL_DOCUMENT_UPDATED_AT_ISO,
dateModified: LEGAL_DOCUMENT_UPDATED_AT_ISO,
isPartOf: { '@id': 'https://ghabilee.ir/#website' },
publisher: { '@id': 'https://ghabilee.ir/#organization' },
url: 'https://ghabilee.ir/terms',
})
expect(schema['@type']).toEqual(['WebPage', 'TermsOfService'])
})
it('exposes FAQ entities for refund-policy rich results', () => {
const faq = refundPolicyFaqSchema()
expect(faq['@type']).toBe('FAQPage')
expect(faq.mainEntity.length).toBeGreaterThanOrEqual(6)
expect(faq.mainEntity[0]).toMatchObject({
'@type': 'Question',
acceptedAnswer: { '@type': 'Answer' },
})
})
})