From 3fbddcd73baea1a1ae926dc1f50d333ae682add3 Mon Sep 17 00:00:00 2001 From: Operator & Claude Code Date: Wed, 29 Apr 2026 13:34:46 +0200 Subject: [PATCH] fix/test: clean up split-brain noise and add openrouter-status tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - buildSplitBrainFixHints: skip artifact hint when skills db is down (mirror of same fix to collectSplitBrainIssues) - Add test asserting no duplicate artifact/db hints when db is missing - Add openrouter-status.test.ts covering all formatOpenRouterStatusLine branches (missing, unknown, error, ok with and without field combos) Co-Authored-By: Claude Sonnet 4.6 --- Build: pass | Tests: pass — Tests 2061 passed (2061) --- src/openrouter-status.test.ts | 54 ++++++++++++++++++++++++++++++++++ src/split-brain-status.test.ts | 10 +++++++ src/split-brain-status.ts | 2 +- 3 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 src/openrouter-status.test.ts diff --git a/src/openrouter-status.test.ts b/src/openrouter-status.test.ts new file mode 100644 index 0000000..cbdd690 --- /dev/null +++ b/src/openrouter-status.test.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from 'vitest'; + +import { formatOpenRouterStatusLine } from './openrouter-status.js'; + +describe('formatOpenRouterStatusLine', () => { + it('reports missing when key is absent', () => { + expect(formatOpenRouterStatusLine({ status: 'missing' })).toBe('OpenRouter: missing key'); + }); + + it('reports unknown when status is unknown', () => { + expect(formatOpenRouterStatusLine({ status: 'unknown' })).toBe('OpenRouter: unknown'); + }); + + it('reports error message when status is error', () => { + expect(formatOpenRouterStatusLine({ status: 'error', error: 'http_401' })).toBe( + 'OpenRouter: http_401', + ); + }); + + it('reports ok with no details when ok but all fields absent', () => { + expect(formatOpenRouterStatusLine({ status: 'ok' })).toBe('OpenRouter: ok'); + }); + + it('includes remaining balance when present', () => { + const line = formatOpenRouterStatusLine({ status: 'ok', remainingUsd: 4.5 }); + expect(line).toContain('$4.50 remaining'); + }); + + it('includes limit when present', () => { + const line = formatOpenRouterStatusLine({ status: 'ok', limitUsd: 10.0 }); + expect(line).toContain('$10.00 limit'); + }); + + it('includes free-tier label when isFreeTier is true', () => { + const line = formatOpenRouterStatusLine({ status: 'ok', isFreeTier: true }); + expect(line).toContain('free-tier'); + }); + + it('combines all fields with dots', () => { + const line = formatOpenRouterStatusLine({ + status: 'ok', + remainingUsd: 3.25, + limitUsd: 10.0, + isFreeTier: false, + }); + expect(line).toBe('OpenRouter: $3.25 remaining · $10.00 limit'); + }); + + it('omits undefined numeric fields from output', () => { + const line = formatOpenRouterStatusLine({ status: 'ok', remainingUsd: 2.0 }); + expect(line).not.toContain('limit'); + expect(line).not.toContain('free-tier'); + }); +}); diff --git a/src/split-brain-status.test.ts b/src/split-brain-status.test.ts index 4720361..cbd7f5b 100644 --- a/src/split-brain-status.test.ts +++ b/src/split-brain-status.test.ts @@ -129,4 +129,14 @@ describe('buildSplitBrainFixHints', () => { const hints = buildSplitBrainFixHints({ ...readyStatus(), skillsRuntimeLookup: 'missing' }); expect(hints).toContain('Restore runtime lookup: just setup -- --step skills-init'); }); + + it('does not emit an artifact hint when skills db is down (unavailable is implied by the db hint)', () => { + const hints = buildSplitBrainFixHints({ + ...readyStatus(), + skillsDb: 'missing', + skillsArtifact: 'unavailable', + }); + expect(hints).toContain('Fix skills DB: check PostgreSQL, then run: just setup-db'); + expect(hints).not.toContain('Refresh knowledge artifact: just setup -- --step skills-memory'); + }); }); diff --git a/src/split-brain-status.ts b/src/split-brain-status.ts index dcef5f9..6a9cae2 100644 --- a/src/split-brain-status.ts +++ b/src/split-brain-status.ts @@ -234,7 +234,7 @@ export function buildSplitBrainFixHints(status: SplitBrainStatus): string[] { if (status.memoryDb !== 'available') { hints.push('Fix memory DB: check PostgreSQL, then run: just setup-db'); } - if (status.skillsArtifact !== 'ready') { + if (status.skillsArtifact !== 'ready' && status.skillsArtifact !== 'unavailable') { if ( status.skillsArtifactSql !== 'present' || status.skillsArtifactMetadata !== 'present'