EntityReader.test.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { test } from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import path from 'node:path'
  4. import { fileURLToPath } from 'node:url'
  5. import { EntityReader } from '../../../src/storage/adapters/EntityReader.js'
  6. const __dirname = path.dirname(fileURLToPath(import.meta.url))
  7. const fixtureRoot = path.join(__dirname, '../../fixtures/sample-book')
  8. test('readCharacterFrontMatter:读取角色卡 front matter', async () => {
  9. const reader = new EntityReader(fixtureRoot)
  10. const result = await reader.readCharacterFrontMatter('林晚')
  11. assert.equal(result.ok, true)
  12. assert.equal(result.data.姓名, '林晚')
  13. assert.equal(result.data.状态, '在世')
  14. assert.equal(result.data.位置, '青云宗')
  15. assert.deepEqual(result.data.别名, ['晚晚', '林师妹'])
  16. })
  17. test('readCharacterFull:读取角色卡完整内容', async () => {
  18. const reader = new EntityReader(fixtureRoot)
  19. const result = await reader.readCharacterFull('林晚')
  20. assert.equal(result.ok, true)
  21. assert.equal(result.frontMatter.姓名, '林晚')
  22. assert.ok(result.body.includes('外门弟子'))
  23. assert.ok(result.body.includes('本姑娘才不怕'))
  24. })
  25. test('resolveAlias:解析别名到正名', async () => {
  26. const reader = new EntityReader(fixtureRoot)
  27. const result = await reader.resolveAlias('晚晚')
  28. assert.equal(result.ok, true)
  29. assert.equal(result.canonicalName, '林晚')
  30. })
  31. test('resolveAlias:未找到别名', async () => {
  32. const reader = new EntityReader(fixtureRoot)
  33. const result = await reader.resolveAlias('不存在的别名')
  34. assert.equal(result.ok, false)
  35. assert.ok(result.error.includes('未找到'))
  36. })
  37. test('listCharacters:列出所有角色', async () => {
  38. const reader = new EntityReader(fixtureRoot)
  39. const characters = await reader.listCharacters()
  40. assert.ok(characters.length > 0)
  41. assert.ok(characters.some((c) => c.正名 === '林晚'))
  42. })
  43. test('listCharacters:按状态筛选', async () => {
  44. const reader = new EntityReader(fixtureRoot)
  45. const characters = await reader.listCharacters({ status: '在世' })
  46. assert.ok(characters.length > 0)
  47. assert.ok(characters.every((c) => c.状态 === '在世'))
  48. })