import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { errorTextOf, isUnauthorized, loginRedirectTarget, requestErrorMessage, REQUEST_FALLBACK_MESSAGE, unwrap, } from '../src/api/envelope.ts' test('test_task_022_envelope_rules_normal_primary_path', () => { // 正常主路径:带 data 的信封解包出业务数据。 const out = unwrap<{ item: { id: number } }>({ success: true, data: { item: { id: 1 } } }) assert.equal(out.item.id, 1) }) test('test_task_022_envelope_rules_normal_variant_input', () => { // 正常变体:{items}/{item} 信封(无 data)原样返回由调用方再解。 const payload = { success: true, items: [{ key: 'a' }] } const out = unwrap<{ items: Array<{ key: string }> }>(payload) assert.equal(out.items[0].key, 'a') }) test('test_task_022_envelope_rules_normal_repeated_operation_is_idempotent', () => { // 正常重复:解包结果稳定、不修改输入。 const payload = { success: true, data: [1, 2] } const a = JSON.stringify(unwrap(payload)) const b = JSON.stringify(unwrap(payload)) assert.equal(a, b) assert.deepEqual(payload, { success: true, data: [1, 2] }) }) test('test_task_022_envelope_rules_boundary_empty_input', () => { // 边界空值:空/非对象负载按原样返回或回落网络提示。 assert.equal(unwrap(undefined as unknown as null), undefined) assert.equal(requestErrorMessage(undefined), REQUEST_FALLBACK_MESSAGE) }) test('test_task_022_envelope_rules_boundary_single_item', () => { // 边界单元素:错误文案优先取响应 message。 const error = { response: { data: { message: '未登录', error: 'old' } } } assert.equal(requestErrorMessage(error), '未登录') }) test('test_task_022_envelope_rules_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:success=false 且 message 缺失回落到通用失败。 assert.throws(() => unwrap({ success: false }), /请求失败/) assert.equal(errorTextOf({ error: '权限不足' }), '权限不足') assert.equal(errorTextOf({ message: '', error: 'X' }), 'X') }) test('test_task_022_envelope_rules_invalid_input_rejected', () => { // 异常输入:401 判定覆盖 code/status/statusCode;非 401 不误判。 assert.equal(isUnauthorized({ code: 401 }), true) assert.equal(isUnauthorized({ status: 401 }), true) assert.equal(isUnauthorized({ statusCode: 401 }), true) assert.equal(isUnauthorized({ code: 403 }), false) assert.equal(isUnauthorized(null), false) assert.equal(requestErrorMessage(new Error('Network Error')), 'Network Error') }) test('test_task_022_envelope_rules_dependency_failure_returns_actionable_message', () => { // 依赖失败:http 层复用 envelope 并统一处理 401 跳登录。 const http = readSource('src/api/http.ts') assert.match(http, /export \{ unwrap \} from '\.\/envelope'/) assert.match(http, /isUnauthorized/) assert.match(http, /login\?redirect=/) assert.equal(loginRedirectTarget({ pathname: '/admin-vue/x', search: '?a=1' }), encodeURIComponent('/admin-vue/x?a=1')) })