36 lines
1.8 KiB
TypeScript
36 lines
1.8 KiB
TypeScript
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,
|
|
)
|
|
})
|