// tools/receipt-key-config.test.mjs import { describe, it, expect } from 'vitest'; import { readFileSync } from 'node:fs'; import { resolveReceiptKey } from './receipt-key-config.mjs'; describe('resolveReceiptKey', () => { it('returns keychain key when present', () => { const r = resolveReceiptKey({ env: {}, keychainGet: () => 'k-from-chain' }); expect(r).toBe('k-from-chain'); }); // Пакет 4.1 (Δ4): env-fallback УБРАН — receipt-key-config больше НЕ читает // ROUTER_MENTOR_RECEIPT_KEY (анти-казуальная утечка ключа через env/логи; шов под HSM). it('env-fallback УБРАН: env задан, keychain пуст → null', () => { const r = resolveReceiptKey({ env: { ROUTER_MENTOR_RECEIPT_KEY: 'k-env' }, keychainGet: () => null }); expect(r).toBe(null); }); it('keychain держит ключ, env полностью игнорируется', () => { const r = resolveReceiptKey({ env: { ROUTER_MENTOR_RECEIPT_KEY: 'k-env' }, keychainGet: () => 'k-chain' }); expect(r).toBe('k-chain'); }); it('returns null when neither present', () => { expect(resolveReceiptKey({ env: {}, keychainGet: () => null })).toBe(null); }); it('never throws when keychainGet throws → null', () => { const r = resolveReceiptKey({ env: {}, keychainGet: () => { throw new Error('boom'); } }); expect(r).toBe(null); }); }); // keytar fix (live activation 2026-06-09): keytar async-only — getPasswordSync НЕ существует. // Пин: defaultKeychainGet не зовёт несуществующий getPasswordSync, читает через keychain-read. describe('defaultKeychainGet keytar-fix (async getPassword via keychain-read)', () => { it('не использует getPasswordSync (его нет в keytar) и делегирует readKeychainSync', () => { const src = readFileSync(new URL('./receipt-key-config.mjs', import.meta.url), 'utf8'); expect(src).not.toContain('getPasswordSync'); expect(src).toContain('readKeychainSync'); }); });