201 lines
5.1 KiB
JavaScript
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')
|