fix: seo friendly
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
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)
|
||||
})
|
||||
Reference in New Issue
Block a user