Files
Netcatty/application/state/vaultSnapshotStore.test.ts
T
yintian 27dc1c62af feat(vault): 添加组变更提交功能以支持原子操作
- 在多个组件中引入 commitVaultGroupMutation 函数
- 更新 useHostTreeInlineGroupActions 钩子以使用新的提交机制
- 修改 vault 组件以传递新的组变更提交函数
- 实现组重命名和删除操作的统一提交逻辑
- 添加相关测试用例验证组变更提交功能
- 更新类型定义以包含新的组变更状态管理接口
2026-08-12 20:37:10 +08:00

96 lines
2.9 KiB
TypeScript

import assert from 'node:assert/strict';
import test from 'node:test';
import type { Host } from '../../domain/models.ts';
import {
EMPTY_VAULT_SNAPSHOT,
getVaultSnapshot,
getVaultSnapshotActions,
publishVaultSnapshot,
registerVaultSnapshotActions,
subscribeVaultSnapshot,
vaultSnapshotsEqual,
type VaultSnapshotActions,
} from './vaultSnapshotStore.ts';
function makeHost(id: string): Host {
return { id, label: id, hostname: `${id}.example`, username: 'root' } as Host;
}
test('vaultSnapshotStore notifies only when a field identity changes', () => {
const seen: number[] = [];
const unsubscribe = subscribeVaultSnapshot(() => {
seen.push(getVaultSnapshot().hosts.length);
});
const hosts = [makeHost('h1')];
const snapshot = { ...EMPTY_VAULT_SNAPSHOT, isVaultInitialized: true, hosts };
publishVaultSnapshot(snapshot);
assert.deepEqual(seen, [1]);
assert.equal(getVaultSnapshot().hosts, hosts);
assert.equal(getVaultSnapshot().isVaultInitialized, true);
// Same field identities in a fresh object must not wake subscribers.
publishVaultSnapshot({ ...snapshot });
assert.deepEqual(seen, [1]);
const moreHosts = [...hosts, makeHost('h2')];
publishVaultSnapshot({ ...snapshot, hosts: moreHosts });
assert.deepEqual(seen, [1, 2]);
unsubscribe();
publishVaultSnapshot(EMPTY_VAULT_SNAPSHOT);
assert.deepEqual(seen, [1, 2]);
});
test('vaultSnapshotsEqual compares every published field', () => {
assert.equal(vaultSnapshotsEqual(EMPTY_VAULT_SNAPSHOT, { ...EMPTY_VAULT_SNAPSHOT }), true);
assert.equal(
vaultSnapshotsEqual(EMPTY_VAULT_SNAPSHOT, { ...EMPTY_VAULT_SNAPSHOT, groupConfigs: [] }),
false,
);
assert.equal(
vaultSnapshotsEqual(EMPTY_VAULT_SNAPSHOT, {
...EMPTY_VAULT_SNAPSHOT,
isVaultInitialized: true,
}),
false,
);
});
test('vault actions register and unregister', () => {
assert.equal(getVaultSnapshotActions(), null);
const calls: string[] = [];
const noop = (() => {}) as never;
registerVaultSnapshotActions({
updateHosts: ((() => {
calls.push('hosts');
}) as unknown) as VaultSnapshotActions['updateHosts'],
updateKeys: noop,
importOrReuseKey: noop,
updateIdentities: noop,
updateProxyProfiles: noop,
updateSnippets: noop,
updateSnippetPackages: noop,
updateCustomGroups: noop,
updateKnownHosts: noop,
updateManagedSources: noop,
updateGroupConfigs: noop,
convertKnownHostToHost: noop,
readPersistedHosts: noop,
readPersistedManagedSources: noop,
commitPluginImporterData: noop,
commitVaultImportTransaction: noop,
commitVaultGroupMutation: noop,
updateHostDistro: noop,
updateHostLastConnected: noop,
addShellHistoryEntry: noop,
removeShellHistoryEntry: noop,
});
getVaultSnapshotActions()?.updateHosts([]);
assert.deepEqual(calls, ['hosts']);
registerVaultSnapshotActions(null);
assert.equal(getVaultSnapshotActions(), null);
});