Files
vue-seo-layer/tests/graph.test.ts
Jakub Zych 160b53b2f5 feat: CMS head and one JSON-LD graph on every server-rendered page (tracer)
- Nitro middleware resolves page requests once and hands the answer to the
  render (event.context.seo); the route middleware reuses it
- useCmsSeo: html lang, hreflang links, og:locale and exactly one JSON-LD
  script with one @graph (CMS nodes plus useSchemaNode nodes, merged by @id)
- local module (configKey seo): cms (alias of public.seo.enabled),
  breadcrumbs, links.newTabHint, rootFiles, resolveFiles
- GET /api/__seo__/resolve for client navigation through the Nuxt server
- smoke harness: count=, exact header=, noheader=, reqheader=, repeated
  options, resolves/apicalls/noreport lines, --no-site; v0.1.1 suite runs
  unchanged against a backend without /site
2026-11-04 09:15:26 +01:00

64 lines
2.7 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import { mergeGraph } from '../app/utils/graph.ts'
const cms = {
'@context': 'https://schema.org',
'@graph': [
{ '@type': 'WebPage', '@id': 'https://acme.test/x#webpage', name: 'CMS name' },
{ '@type': 'Organization', '@id': 'https://acme.test/#org', name: 'Acme' },
],
}
test('mergeGraph: a layer node with a CMS @id merges into it, CMS values first', () => {
const g = mergeGraph(cms, [{ '@id': 'https://acme.test/x#webpage', name: 'Layer name', inLanguage: 'pl' }])
assert.ok(g)
assert.equal(g['@graph'].length, 2)
assert.deepEqual(g['@graph'][0], { '@id': 'https://acme.test/x#webpage', name: 'CMS name', inLanguage: 'pl', '@type': 'WebPage' })
})
test('mergeGraph: a node with a new @id or none is appended, in order', () => {
const g = mergeGraph(cms, [{ '@type': 'ItemList', '@id': 'https://acme.test/x#itemlist' }, { '@type': 'Thing' }])
assert.ok(g)
assert.deepEqual(
g['@graph'].map((n) => n['@type']),
['WebPage', 'Organization', 'ItemList', 'Thing'],
)
})
test('mergeGraph: no duplicate @id, also within the CMS graph and among layer nodes', () => {
const g = mergeGraph({ '@graph': [{ '@id': 'a', x: 1 }, { '@id': 'a', y: 2 }] }, [{ '@id': 'a', z: 3 }, { '@id': 'b' }, { '@id': 'b', w: 4 }])
assert.ok(g)
const ids = g['@graph'].map((n) => n['@id'])
assert.deepEqual(ids, ['a', 'b'])
assert.deepEqual(g['@graph'][0], { '@id': 'a', x: 1, y: 2, z: 3 })
assert.deepEqual(g['@graph'][1], { '@id': 'b', w: 4 })
})
test('mergeGraph: one context, nested @context removed from nodes', () => {
const g = mergeGraph(null, [{ '@context': 'https://schema.org', '@type': 'FAQPage', '@id': 'f' }])
assert.ok(g)
assert.equal(g['@context'], 'https://schema.org')
assert.deepEqual(g['@graph'], [{ '@type': 'FAQPage', '@id': 'f' }])
})
test('mergeGraph: a single-node jsonld counts as one node', () => {
const g = mergeGraph({ '@context': 'https://schema.org', '@type': 'WebSite', '@id': 'w' }, [])
assert.deepEqual(g, { '@context': 'https://schema.org', '@graph': [{ '@type': 'WebSite', '@id': 'w' }] })
})
test('mergeGraph: nothing to emit is null (no JSON-LD script)', () => {
assert.equal(mergeGraph(null, []), null)
assert.equal(mergeGraph(undefined), null)
assert.equal(mergeGraph({ '@graph': [] }, [null, 'x', 3]), null)
assert.equal(mergeGraph('nope', []), null)
})
test('mergeGraph: inputs are not mutated', () => {
const input = JSON.parse(JSON.stringify(cms))
const node = { '@id': 'https://acme.test/x#webpage', extra: true }
mergeGraph(input, [node])
assert.deepEqual(input, cms)
assert.deepEqual(node, { '@id': 'https://acme.test/x#webpage', extra: true })
})