import assert from 'node:assert/strict' import { test } from 'node:test' import { networkFailure, requestErrorContext, ApiError } from './request-error.js' test('безопасная причина соединения извлекается из вложенных Node-ошибок', () => { for (const [code, message] of [ ['ECONNREFUSED', 'Сервер отклонил соединение'], ['ECONNRESET', 'Соединение с сервером прервано'], ['UND_ERR_CONNECT_TIMEOUT', 'Превышено время ожидания соединения с сервером'], ['CERT_HAS_EXPIRED', 'Ошибка защищённого соединения с сервером'], ['SECRET', 'Сервер недоступен'], ]) { const error = new TypeError('SECRET', { cause: new AggregateError([Object.assign(new Error('SECRET'), { code })]), }) const result = networkFailure(error, new AbortController().signal) assert.equal(result.message, message) assert.equal(result.code, code === 'SECRET' ? 'NETWORK' : code) assert.ok(!result.message.includes('SECRET')) } }) test('контекст HTTP сохраняет тип ошибки, статус и исключает query с секретами', () => { const error = new ApiError(403) const result = requestErrorContext(error, 'GetGame', 'GET', '/api/games/7?access_token=SECRET') assert.equal(result, error) assert.equal(error.status, 403) assert.match(result.message, /HTTP 403/) assert.match(result.message, /Описание игры · GET \/api\/games\/7: Нет доступа/) assert.ok(!result.message.includes('SECRET')) assert.equal( requestErrorContext(result, 'GetGame', 'GET', '/api/games/7').message, result.message, ) })