paths.spec.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { describe, expect, it } from 'vitest'
  2. import { validateSegment, assertSegment, paths, pad, chapterNo } from '../src/repo/paths'
  3. describe('路径白名单(机制 B2)', () => {
  4. it('合法中文名通过', () => {
  5. expect(validateSegment('初见')).toEqual([])
  6. expect(validateSegment('第一卷-风起')).toEqual([])
  7. })
  8. it('非法字符拒绝', () => {
  9. expect(validateSegment('a/b').length).toBeGreaterThan(0)
  10. expect(validateSegment('a\\b').length).toBeGreaterThan(0)
  11. expect(validateSegment('a:b').length).toBeGreaterThan(0)
  12. expect(validateSegment('a<b').length).toBeGreaterThan(0)
  13. })
  14. it('保留名与边界拒绝', () => {
  15. expect(validateSegment('CON').length).toBeGreaterThan(0)
  16. expect(validateSegment('..').length).toBeGreaterThan(0)
  17. expect(validateSegment('名字 ').length).toBeGreaterThan(0) // 尾空格(Windows)
  18. expect(validateSegment('名字.').length).toBeGreaterThan(0) // 尾点
  19. expect(validateSegment('').length).toBeGreaterThan(0)
  20. })
  21. it('assertSegment 抛错带字段名', () => {
  22. expect(() => assertSegment('a/b', '章名')).toThrow(/B2/)
  23. })
  24. })
  25. describe('路径构造(格式规格 §2)', () => {
  26. it('卷号两位、章号四位', () => {
  27. expect(pad(1)).toBe('01')
  28. expect(chapterNo(12)).toBe('0012')
  29. expect(paths.定稿章(2, 13, '风起')).toBe('定稿/卷02/0013-风起.md')
  30. expect(paths.确认细纲(1, 3, '初见')).toBe('大纲/卷规划/卷01/章细纲/0003-初见.md')
  31. expect(paths.账本('时间线')).toBe('账本/时间线.md')
  32. expect(paths.记忆('文风')).toBe('本书记忆/文风.md')
  33. expect(paths.审核记录(1, '初见')).toBe('草稿区/审核/卷01-初见.json')
  34. })
  35. })