五个页面按 h5/css 的 style.css → ui-20261009 → ui-20261012 覆盖顺序逐条重排, 换算规则固定为 calc(N * var(--u)) → 2N rpx,固定 px 的字号保持 px。 - app.acss:换回 H5 设计 token(方角小倒角按钮 10rpx、卡片 14rpx、.chev 折线箭头) - splash/profile/history:底图与按钮文字图改用 H5 资源,隐私/政策弹窗按 H5 重排 - report:环形分用 conic-gradient、人脸裁切窗口叠加 face_maps、标记点百分比盒、 侧脸皱纹 pending/unavailable 文案;用 Playwright 抓 H5 94 个选择器几何比对, 整页高 2438.7 vs 2438.67 - camera:淘宝 <camera> 组件在真机整页崩溃(嵌了微信专有的 <cover-view>), 改为默认系统相机 + `config.nativeCamera` 开关 + pages/camtest 冒烟页验证组件 - permissions:淘宝用带前缀的 scope.camera(裸名返回 5022 Scope:camera信息不存在), 先试带前缀再退回裸名,拒绝后不再重复弹窗 - voice:非 HTTPS 资源导致的异常不再冒泡成整页崩溃;app.js 加开发版错误 toast - 开发版入口:权限诊断(启动页/相机页)、相机组件测试 - 测试 20/20(新增权限与相机能力用例)
38 lines
2.6 KiB
JavaScript
38 lines
2.6 KiB
JavaScript
'use strict';
|
|
const { test } = require('node:test'), assert = require('node:assert/strict'), vm = require('node:vm'), fs = require('node:fs'), path = require('node:path');
|
|
test('cloud transport initializes once, preserves subpath/auth, caps timeout and unwraps gateway envelopes', async () => {
|
|
const config = { transport: 'cloud', baseUrl: 'https://skin.example.test', basePath: '/state', cloudAppId: 'cloud-id', cloudEnv: 'online' };
|
|
let initialized = 0, options;
|
|
const cloud = { init: async ({ env }) => { assert.equal(env, 'online'); initialized++; return true; },
|
|
application: { httpRequest: async input => { options = input; return { ok: true, http_status: 200 }; } } };
|
|
const module = { exports: {} };
|
|
vm.runInNewContext(fs.readFileSync(path.join(__dirname, '../utils/transport.js'), 'utf8'), {
|
|
module, Promise, require(name) { return name === '../config' ? config : { default: cloud }; }
|
|
});
|
|
const transport = module.exports;
|
|
await transport.request('/api/taobao/me', {}, 'token'); await transport.request('/api/taobao/reports', {}, 'token');
|
|
assert.equal(initialized, 1); assert.equal(options.path, '/state/api/taobao/reports');
|
|
assert.equal(options.headers.Authorization, 'Bearer token'); assert.equal(options.exts.timeout, 10000);
|
|
assert.equal(options.exts.cloudAppId, 'cloud-id'); assert.equal(options.exts.domain, config.baseUrl);
|
|
assert.equal(transport.unwrap({ success: true, data: { ok: true } }).ok, true);
|
|
assert.throws(() => transport.unwrap({ success: false, errorMessage: 'gateway rejected' }), /gateway rejected/);
|
|
config.transport = 'direct';
|
|
await assert.rejects(transport.request('/api/taobao/me', {}), /仅用于本机/);
|
|
});
|
|
test('聚石塔 tower transport omits domain and does not require HTTPS', async () => {
|
|
const config = { transport: 'cloud', cloudType: 'tower', baseUrl: 'http://127.0.0.1:8080', cloudAppId: '', cloudEnv: 'test', basePath: '' };
|
|
let options;
|
|
const cloud = { init: async ({ env }) => { assert.equal(env, 'test'); return true; },
|
|
application: { httpRequest: async input => { options = input; return { success: true, data: { ok: true } }; } } };
|
|
const module = { exports: {} };
|
|
vm.runInNewContext(fs.readFileSync(path.join(__dirname, '../utils/transport.js'), 'utf8'), {
|
|
module, Promise, require(name) { return name === '../config' ? config : { default: cloud }; }
|
|
});
|
|
const transport = module.exports;
|
|
const data = await transport.request('/api/taobao/ping', {});
|
|
assert.equal(data.ok, true);
|
|
assert.equal(options.path, '/api/taobao/ping');
|
|
assert.equal(options.exts.domain, undefined);
|
|
assert.equal(options.exts.cloudAppId, undefined);
|
|
});
|