Files
mip-website/tests/seo.test.cjs
T

48 lines
2.6 KiB
JavaScript
Raw Normal View History

2026-10-17 17:20:59 +03:30
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: '<p>خبر <strong>بیمارستان</strong></p><script>bad()</script>', 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: '</script><script>alert(1)</script>' }
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)
})