Files
electric-cherry/tests/unit/host-agent-update-status.test.ts
T

50 lines
3.0 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { hostAgentUpdateLabel, hostAgentUpdateMessage, hostAgentUpdatesEnabled, type HostInventory } from '../../src/lib/hosts.js';
const installed: HostInventory = {
agentVersion: '1.2.0', capabilities: ['host.decommission', 'agent.update'],
agentUpdate: { enabled: true, state: 'current', currentVersion: '1.2.0', checkedAt: '2026-10-04T12:00:00Z' }
};
describe('host automatic update status', () => {
it('requires the installed updater capability instead of inferring setup from agent version', () => {
for (const inventory of [
{}, { agentVersion: '1.2.0' },
{ ...installed, capabilities: ['host.decommission'] },
{ ...installed, agentUpdate: { ...installed.agentUpdate!, enabled: false } }
]) {
expect(hostAgentUpdatesEnabled(inventory)).toBe(false);
expect(hostAgentUpdateLabel(inventory)).toBe('Setup required');
expect(hostAgentUpdateMessage(inventory)).toMatch(/installer once/);
}
expect(hostAgentUpdatesEnabled(installed)).toBe(true);
expect(hostAgentUpdateLabel(installed)).toBe('Current');
});
it('does not claim an unchecked fresh installation has verified the latest release', () => {
const fresh = { ...installed, agentUpdate: { ...installed.agentUpdate!, checkedAt: undefined } };
expect(hostAgentUpdateLabel(fresh)).toBe('Awaiting first check');
expect(hostAgentUpdateMessage(fresh)).toContain('will check');
expect(hostAgentUpdateMessage(installed)).toContain('last check');
});
it('distinguishes a deferred check from a failed update without assuming every hold is an active operation', () => {
const deferred = { ...installed, agentUpdate: { ...installed.agentUpdate!, state: 'deferred' as const, targetVersion: '1.3.0' } };
expect(hostAgentUpdateLabel(deferred)).toBe('Deferred');
expect(hostAgentUpdateMessage(deferred)).toContain('reported condition to clear');
expect(hostAgentUpdateMessage(deferred)).toContain('checks again automatically');
const failed = { ...installed, agentUpdate: { ...installed.agentUpdate!, state: 'failed' as const, error: 'Checksum mismatch' } };
expect(hostAgentUpdateLabel(failed)).toBe('Needs attention');
expect(hostAgentUpdateMessage(failed)).toContain('did not complete');
});
it('describes connection verification until the updater confirms success', () => {
const updating = { ...installed, agentUpdate: { ...installed.agentUpdate!, state: 'updating' as const, targetVersion: '1.3.0' } };
expect(hostAgentUpdateLabel(updating)).toBe('Updating');
expect(hostAgentUpdateMessage(updating)).toContain('checking that the new process connects');
const updated = { ...installed, agentUpdate: { ...installed.agentUpdate!, state: 'updated' as const, currentVersion: '1.3.0' } };
expect(hostAgentUpdateLabel(updated)).toBe('Updated');
expect(hostAgentUpdateMessage(updated)).toContain('connected successfully');
});
});