Files
zkxw/mobile-h5/utils/market-h5.test.js
T
2026-10-15 14:27:42 +08:00

201 lines
5.1 KiB
JavaScript

import assert from 'node:assert/strict'
import { OA_H5_ORIGIN } from './config.js'
import {
MARKET_ENTRIES,
buildMarketH5Url,
canOpenMarketWebview,
isTrustedMarketCloseMessage,
resolveHttpOrigin,
resolveMarketBackFallback,
resolveMarketEntry,
resolveMarketReturnPath
} from './market-h5.js'
import { normalizeMenu } from './menu.js'
import { isOaHostWebviewRoute } from './oa-navigate-back.js'
const marketOrigin = resolveHttpOrigin(OA_H5_ORIGIN)
const marketBase = String(OA_H5_ORIGIN || '').replace(/\/$/, '')
assert.equal(resolveHttpOrigin('https://xwyd.zkxw.cn/oa-h5'), 'https://xwyd.zkxw.cn')
assert.equal(
resolveHttpOrigin('http://127.0.0.1:5178/oa-h5/'),
'http://127.0.0.1:5178'
)
assert.equal(resolveHttpOrigin(''), '')
assert.equal(resolveHttpOrigin('not-a-url'), '')
assert.ok(marketOrigin)
const expectedEntries = [
'specialist-presign',
'specialist-protocol',
'specialist-payment-chase',
'specialist-payment',
'specialist-freight',
'manager-presign',
'manager-protocol',
'manager-payment-chase',
'manager-payment',
'manager-freight'
]
assert.deepEqual(Object.keys(MARKET_ENTRIES), expectedEntries)
assert.equal(MARKET_ENTRIES['specialist-presign'].title, '预签约订单(专员)')
assert.equal(MARKET_ENTRIES['specialist-presign'].groupTitle, '市场部')
assert.equal(MARKET_ENTRIES['manager-freight'].title, '运费信息(经理)')
assert.equal(MARKET_ENTRIES['manager-freight'].groupTitle, '市场部')
assert.equal(
resolveMarketEntry('specialist-presign').path,
'/market/specialist/presign'
)
assert.equal(
resolveMarketEntry('manager-freight').path,
'/market/manager/freight'
)
assert.equal(resolveMarketEntry('https://evil.example'), null)
assert.equal(resolveMarketEntry('../manager/freight'), null)
assert.equal(resolveMarketEntry('specialist-presign?scope=manager'), null)
assert.equal(
resolveMarketReturnPath({ returnPath: '/pages/index/index?tab=market' }),
'/pages/index/index?tab=market'
)
assert.equal(
resolveMarketReturnPath({ returnPath: 'https://evil.example/callback' }),
'/pages/index/index'
)
assert.equal(
resolveMarketReturnPath({ returnPath: '/pages/../evil' }),
'/pages/index/index'
)
assert.equal(
resolveMarketBackFallback('/pages/index/index?tab=market'),
'/pages/index/index?tab=market'
)
assert.equal(
resolveMarketBackFallback('https://evil.example/callback'),
'/pages/index/index'
)
const marketUrl = buildMarketH5Url({
entry: 'manager-payment-chase',
token: 'token +&',
returnPath: '/pages/index/index?tab=market'
})
assert.equal(
marketUrl,
marketBase +
'/market/manager/payment-chase' +
'?token=token%20%2B%26&returnPath=%2Fpages%2Findex%2Findex%3Ftab%3Dmarket'
)
assert.equal(
buildMarketH5Url({
entry: 'https://evil.example',
token: 'token',
returnPath: '/pages/index/index'
}),
''
)
assert.equal(normalizeMenu({ icon: '' }).icon, '')
assert.equal(
normalizeMenu({
path: '/pages/market/webview/index?entry=specialist-presign',
icon: ''
}).icon,
'market-presign'
)
assert.equal(
normalizeMenu({
path: 'pages/market/webview/index?entry=manager-payment-chase',
icon: ''
}).icon,
'market-payment-chase'
)
assert.equal(
normalizeMenu({
path: '/pages/market/webview/index?entry=specialist-payment',
icon: ''
}).icon,
'market-payment'
)
// 后端旧版对市场入口回落 apps-o 时,前端须覆盖为专用 PNG
assert.equal(
normalizeMenu({
path: '/pages/market/webview/index?entry=specialist-presign',
icon: 'apps-o'
}).icon,
'market-presign'
)
assert.equal(
normalizeMenu({ groupTitle: '市场部', icon: '' }).groupTitle,
'市场部'
)
// 测试库未重组目录 / 旧接口无 groupTitle 时,按 path 推断分区
assert.equal(
normalizeMenu({
path: '/pages/market/webview/index?entry=manager-freight',
icon: 'apps-o'
}).groupTitle,
'市场部'
)
assert.equal(
normalizeMenu({
path: '/pages/oa/pending/index',
icon: 'oa-pending'
}).groupTitle,
'OA工作流'
)
assert.equal(
normalizeMenu({
path: '/pages/demo/comps',
icon: 'apps-o'
}).groupTitle,
''
)
assert.equal(isOaHostWebviewRoute('pages/market/webview/index'), true)
assert.equal(isOaHostWebviewRoute('pages/index/index'), false)
const marketFrame = {}
const trustedMessage = {
origin: marketOrigin,
source: marketFrame,
data: { source: 'zkxw-oa-h5', action: 'market-close' }
}
assert.equal(isTrustedMarketCloseMessage(trustedMessage, marketFrame), true)
assert.equal(
isTrustedMarketCloseMessage(
{ ...trustedMessage, origin: 'https://evil.example' },
marketFrame
),
false
)
assert.equal(
isTrustedMarketCloseMessage(
{ ...trustedMessage, source: {} },
marketFrame
),
false
)
assert.equal(
isTrustedMarketCloseMessage(
{ ...trustedMessage, data: { source: 'zkxw-oa-h5', action: '' } },
marketFrame
),
false
)
assert.equal(
isTrustedMarketCloseMessage(
{
...trustedMessage,
data: { source: 'zkxw-oa-h5', action: 'oa-detail-close' }
},
marketFrame
),
false
)
assert.equal(canOpenMarketWebview(false, 'token'), true)
assert.equal(canOpenMarketWebview(true, 'token'), false)
assert.equal(canOpenMarketWebview(false, ''), false)
console.log('market-h5: ok')