yaml-safe.test.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { test } from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import { parseYAML } from '../../../src/storage/parsers/yaml-safe.js'
  4. test('正常 YAML 解析', () => {
  5. const yaml = `章号: 1
  6. 标题: 测试章节
  7. 列表:
  8. - 项1
  9. - 项2`
  10. const result = parseYAML(yaml)
  11. assert.equal(result.ok, true)
  12. assert.equal(result.data.章号, 1)
  13. assert.equal(result.data.标题, '测试章节')
  14. assert.deepEqual(result.data.列表, ['项1', '项2'])
  15. })
  16. test('边界:YAML 语法错误', () => {
  17. const yaml = `章号: 1
  18. 标题: "未闭合引号`
  19. const result = parseYAML(yaml)
  20. assert.equal(result.ok, false)
  21. assert.ok(result.error.length > 0)
  22. })
  23. test('边界:空字符串', () => {
  24. const result = parseYAML('')
  25. assert.equal(result.ok, true)
  26. assert.deepEqual(result.data, {})
  27. })
  28. test('边界:根节点是数组', () => {
  29. const yaml = `- 项1
  30. - 项2`
  31. const result = parseYAML(yaml)
  32. assert.equal(result.ok, false)
  33. assert.ok(result.error.includes('必须是对象'))
  34. })
  35. test('边界:根节点是标量', () => {
  36. const yaml = `just a string`
  37. const result = parseYAML(yaml)
  38. assert.equal(result.ok, false)
  39. assert.ok(result.error.includes('必须是对象'))
  40. })
  41. test('容错:null 文档', () => {
  42. const yaml = `---
  43. null`
  44. const result = parseYAML(yaml)
  45. assert.equal(result.ok, true)
  46. assert.deepEqual(result.data, {})
  47. })
  48. test('保留原始 YAML 字符串', () => {
  49. const yaml = `章号: 1
  50. 自定义字段: 自定义值`
  51. const result = parseYAML(yaml)
  52. assert.equal(result.ok, true)
  53. assert.equal(result.raw, yaml)
  54. assert.equal(result.data.自定义字段, '自定义值')
  55. })
  56. test('容错读取保留未知字段:解析→修改→序列化', async () => {
  57. // 导入需要的模块
  58. const { parseFrontMatter } = await import('../../../src/storage/parsers/front-matter.js')
  59. const { serializeFrontMatter } = await import('../../../src/storage/serializers/front-matter.js')
  60. const original = `---
  61. 章号: 1
  62. 标题: 测试
  63. 自定义字段: 自定义值
  64. ---
  65. 正文内容`
  66. // 解析
  67. const parsed = parseFrontMatter(original)
  68. assert.equal(parsed.ok, true)
  69. assert.equal(parsed.data.自定义字段, '自定义值')
  70. // 修改已知字段
  71. parsed.data.标题 = '新标题'
  72. // 写回(保留未知字段)
  73. const serialized = serializeFrontMatter(parsed.data, parsed.body, parsed.rawYAML)
  74. assert.ok(serialized.includes('自定义字段: 自定义值'), '未知字段应被保留')
  75. assert.ok(serialized.includes('标题: 新标题'), '已知字段应被更新')
  76. assert.ok(serialized.includes('正文内容'), '正文应被保留')
  77. })