48 lines
2.6 KiB
JavaScript
48 lines
2.6 KiB
JavaScript
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)
|
|
})
|