Files
evening_detective_screen/electron/request-error.test.ts
T
2026-10-18 13:01:44 +07:00

68 lines
3.1 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,
)
})
test('ошибки Chromium сохраняют безопасный код без адресов и содержимого', () => {
for (const [input, code, message] of [
['ERR_NAME_NOT_RESOLVED', 'ENOTFOUND', 'Не удалось определить адрес сервера'],
['ERR_CONNECTION_REFUSED', 'ECONNREFUSED', 'Сервер отклонил соединение'],
['ERR_CONNECTION_TIMED_OUT', 'ETIMEDOUT', 'Превышено время ожидания соединения с сервером'],
[
'ERR_PROXY_CONNECTION_FAILED',
'ERR_PROXY_CONNECTION_FAILED',
'Не удалось подключиться через системный прокси',
],
[
'ERR_TUNNEL_CONNECTION_FAILED',
'ERR_TUNNEL_CONNECTION_FAILED',
'Не удалось подключиться через системный прокси',
],
[
'ERR_CERT_AUTHORITY_INVALID',
'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
'Ошибка защищённого соединения с сервером',
],
['ERR_UNKNOWN', 'NETWORK', 'Сервер недоступен'],
]) {
const result = networkFailure(
new Error(`net::${input} at https://SECRET.invalid`),
new AbortController().signal,
)
assert.equal(result.code, code)
assert.equal(result.message, message)
assert.ok(!result.message.includes('SECRET'))
}
})