const { test } = require('node:test') const assert = require('node:assert/strict') const { canonicalUrl, getSeo, newsSeo, serializeJsonLd, sitemapLinks } = require('../lib/seo') test('canonical URLs remove tracking, fragments and trailing slashes without trusting an external host', () => { assert.equal(canonicalUrl('/page/about/?utm_source=test#intro'), 'https://miphospital.ir/page/about') assert.equal(canonicalUrl('/'), 'https://miphospital.ir/') assert.equal(canonicalUrl('//evil.example/page'), 'https://miphospital.ir/') assert.equal(canonicalUrl('https://evil.example/page'), 'https://miphospital.ir/') }) test('public pages have distinct descriptions and internal pages remain out of search', () => { assert.notEqual(getSeo('/page/about').description, getSeo('/page/contact-us').description) assert.equal(getSeo('/page/contact-us').noindex, false) for (const route of ['/components/slider', '/appContainer', '/recruitment/inquiry', '/recruitment/item/request/23', '/404']) { assert.equal(getSeo(route).noindex, true, route) } assert.equal(getSeo('/components/service').noindex, false) assert.equal(getSeo('/page/news/36').noindex, false) assert.match(getSeo('/recruitment/inquiry').title, /استعلام/) }) test('article metadata derives a plain text summary and absolute cover URL from the actual article', () => { const seo = newsSeo({ title: 'خبر افتتاح', text: '

خبر بیمارستان

', cover: 'news.jpg' }, '36') assert.equal(seo.title, 'خبر افتتاح') assert.equal(seo.description, 'خبر بیمارستان') assert.equal(seo.image, 'https://mehrara-api.iran.liara.run/panel-public/uploads/news.jpg') assert.equal(seo.structuredData['@type'], 'NewsArticle') assert.equal(seo.structuredData.mainEntityOfPage, 'https://miphospital.ir/page/news/36') }) test('JSON-LD cannot terminate its HTML script element', () => { const value = { name: '' } const serialized = serializeJsonLd(value) assert.equal(serialized.includes('<'), false) assert.deepEqual(JSON.parse(serialized), value) }) test('sitemap contains real public routes and unique valid article IDs only', () => { const links = sitemapLinks([{ id: 36 }, { id: 36 }, { id: '../bad' }, { id: null }, { id: 82 }]) assert.ok(links.includes('/page/contact-us')) assert.ok(links.includes('/page/news/36')) assert.ok(links.includes('/page/news/82')) assert.equal(links.filter(url => url === '/page/news/36').length, 1) assert.equal(links.includes('/contact-us'), false) assert.equal(links.some(url => url.includes('request') || url.includes('../')), false) })