fix/test: clean up split-brain noise and add openrouter-status tests

- 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 <noreply@anthropic.com>

---
Build: pass | Tests: pass — Tests  2061 passed (2061)
This commit is contained in:
Operator & Claude Code 2026-04-29 13:34:46 +02:00
parent a1f37c57a4
commit 3fbddcd73b
3 changed files with 65 additions and 1 deletions

View file

@ -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');
});
});

View file

@ -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');
});
});

View file

@ -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'