import { describe, expect, test } from 'bun:test'; import { buildRuntimeAuthHeaders, clearRuntimeAuthCredentialProvider, getRuntimeBearerTokenSync, setRuntimeAuthCredentialProvider, setRuntimeBearerToken, } from './runtime-auth'; describe('runtime auth headers', () => { test('does not add authorization by default', async () => { clearRuntimeAuthCredentialProvider(); const headers = await buildRuntimeAuthHeaders({ Accept: 'application/json' }); expect(headers.get('Accept')).toBe('application/json'); expect(headers.has('Authorization')).toBe(false); }); test('adds bearer token when configured', async () => { try { setRuntimeBearerToken('token-123'); const headers = await buildRuntimeAuthHeaders(); expect(headers.get('Authorization')).toBe('Bearer token-123'); } finally { clearRuntimeAuthCredentialProvider(); } }); test('preserves explicit authorization header', async () => { try { setRuntimeAuthCredentialProvider(() => ({ type: 'bearer', token: 'runtime-token' })); const headers = await buildRuntimeAuthHeaders({ Authorization: 'Bearer explicit-token' }); expect(headers.get('Authorization')).toBe('Bearer explicit-token'); } finally { clearRuntimeAuthCredentialProvider(); } }); test('falls back to injected desktop client token', async () => { const previousWindow = Object.getOwnPropertyDescriptor(globalThis, 'window'); try { clearRuntimeAuthCredentialProvider(); Object.defineProperty(globalThis, 'window', { configurable: true, value: { __OPENCHAMBER_CLIENT_TOKEN__: ' injected-token ' }, }); expect(getRuntimeBearerTokenSync()).toBe('injected-token'); const headers = await buildRuntimeAuthHeaders(); expect(headers.get('Authorization')).toBe('Bearer injected-token'); } finally { clearRuntimeAuthCredentialProvider(); if (previousWindow) { Object.defineProperty(globalThis, 'window', previousWindow); } else { Reflect.deleteProperty(globalThis, 'window'); } } }); });