Files
NetMesh/application/state/vaultSnapshotStore.test.ts
zhaolei 3c72efcb7f
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
[Init] Initial commit - NetMesh terminal manager
2026-09-13 18:24:01 +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);
});