Files
knowledge-governance/web/src/LegacySourceAssociation.test.tsx
T
姚章浩 8d838d9cb4
build / build (push) Successful in 1m45s
feat(library): 整库发布身份、写集合与收尾边界
执行时真实时钟与持久授权回读(撤销/过期即停并保留预备份)、写集合写前落盘、
租约与 attempt 身份、恢复队列与原发送身份分离、成功收尾必须释放维护后再登记终态。
2026-11-01 11:35:10 +08:00

46 lines
2.1 KiB
TypeScript

import { afterEach, expect, it, vi } from 'vitest'
import { renderToStaticMarkup } from 'react-dom/server'
import { associateLegacySource, LegacySourceAssociation } from './LegacySourceAssociation'
afterEach(() => vi.unstubAllGlobals())
const reply = (status: number, data: unknown) => new Response(JSON.stringify(data), { status })
it('only sends exact snapshot and scope; association is not publishing', async () => {
const fetchMock = vi
.fn()
.mockResolvedValue(
reply(200, { associated: true, published: false, snapshot_id: 'snapshot', source_id: 'a'.repeat(64) })
)
vi.stubGlobal('fetch', fetchMock)
expect(await associateLegacySource('internal', 'snapshot')).toBe('a'.repeat(64))
expect(fetchMock.mock.calls).toHaveLength(1)
expect(fetchMock.mock.calls[0][0]).toBe('/api/v1/library/source-associations')
expect(JSON.parse(fetchMock.mock.calls[0][1].body)).toEqual({ scope: 'internal', snapshot_id: 'snapshot' })
})
it('rejects wrong-snapshot and incomplete readback, and shows evidence errors', async () => {
for (const value of [
{ associated: true, published: false, snapshot_id: 'wrong', source_id: 'a'.repeat(64) },
{ associated: true, snapshot_id: 'snapshot' },
]) {
vi.stubGlobal('fetch', vi.fn().mockResolvedValue(reply(200, value)))
await expect(associateLegacySource('internal', 'snapshot')).rejects.toThrow('来源关联回执')
}
vi.stubGlobal('fetch', vi.fn().mockResolvedValue(reply(409, { error: 'original capture identity mismatch' })))
await expect(associateLegacySource('internal', 'snapshot')).rejects.toThrow('original capture identity mismatch')
})
it('hides association controls from non-admin and distinguishes it from publication', () => {
expect(
renderToStaticMarkup(
<LegacySourceAssociation scope="internal" snapshots={[]} admin={false} onBound={async () => {}} />
)
).toBe('')
const html = renderToStaticMarkup(
<LegacySourceAssociation scope="internal" snapshots={[]} admin onBound={async () => {}} />
)
expect(html).toContain('只追加治理关联')
expect(html).toContain('disabled')
expect(html).toContain('核验原证据并关联')
})