import { describe, expect, it } from 'bun:test' import { mergeMemberPreview } from './member-preview.ts' import type { ProxyInfo } from './api.ts' const info = (name: string) => ({ name, type: 'Vmess' }) as ProxyInfo const noLookup = () => undefined describe('成员预览', () => { it('草稿和现状一致时谁都不标', () => { const cards = mergeMemberPreview([{ name: 'A', info: info('A') }], ['A'], noLookup) expect(cards).toEqual([{ name: 'A', info: info('A'), removed: false, added: false }]) }) it('不在保存后名单里的现有成员标为将移除', () => { const cards = mergeMemberPreview( [ { name: 'A', info: info('A') }, { name: 'B', info: info('B') }, ], ['B'], noLookup, ) expect(cards.map((c) => [c.name, c.removed])).toEqual([ ['A', true], ['B', false], ]) }) it('新增的追加在末尾,线路信息从 lookup 取', () => { const cards = mergeMemberPreview([{ name: 'A', info: info('A') }], ['A', 'C'], info) expect(cards[1]).toEqual({ name: 'C', info: info('C'), removed: false, added: true }) }) it('现有成员保持原序在前,新增按保存后名单的顺序在后', () => { // 顺序稳定才不会出现「改一个筛选,卡片全部跳位」 const cards = mergeMemberPreview( [ { name: 'B', info: undefined }, { name: 'A', info: undefined }, ], ['C', 'A', 'D'], noLookup, ) expect(cards.map((c) => c.name)).toEqual(['B', 'A', 'C', 'D']) }) })