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')