market-h5.test.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import assert from 'node:assert/strict'
  2. import { OA_H5_ORIGIN } from './config.js'
  3. import {
  4. MARKET_ENTRIES,
  5. buildMarketH5Url,
  6. canOpenMarketWebview,
  7. isTrustedMarketCloseMessage,
  8. resolveHttpOrigin,
  9. resolveMarketBackFallback,
  10. resolveMarketEntry,
  11. resolveMarketReturnPath
  12. } from './market-h5.js'
  13. import { normalizeMenu } from './menu.js'
  14. import { isOaHostWebviewRoute } from './oa-navigate-back.js'
  15. const marketOrigin = resolveHttpOrigin(OA_H5_ORIGIN)
  16. const marketBase = String(OA_H5_ORIGIN || '').replace(/\/$/, '')
  17. assert.equal(resolveHttpOrigin('https://xwyd.zkxw.cn/oa-h5'), 'https://xwyd.zkxw.cn')
  18. assert.equal(
  19. resolveHttpOrigin('http://127.0.0.1:5178/oa-h5/'),
  20. 'http://127.0.0.1:5178'
  21. )
  22. assert.equal(resolveHttpOrigin(''), '')
  23. assert.equal(resolveHttpOrigin('not-a-url'), '')
  24. assert.ok(marketOrigin)
  25. const expectedEntries = [
  26. 'specialist-presign',
  27. 'specialist-protocol',
  28. 'specialist-payment-chase',
  29. 'specialist-payment',
  30. 'specialist-freight',
  31. 'manager-presign',
  32. 'manager-protocol',
  33. 'manager-payment-chase',
  34. 'manager-payment',
  35. 'manager-freight'
  36. ]
  37. assert.deepEqual(Object.keys(MARKET_ENTRIES), expectedEntries)
  38. assert.equal(MARKET_ENTRIES['specialist-presign'].title, '预签约订单(专员)')
  39. assert.equal(MARKET_ENTRIES['specialist-presign'].groupTitle, '市场部')
  40. assert.equal(MARKET_ENTRIES['manager-freight'].title, '运费信息(经理)')
  41. assert.equal(MARKET_ENTRIES['manager-freight'].groupTitle, '市场部')
  42. assert.equal(
  43. resolveMarketEntry('specialist-presign').path,
  44. '/market/specialist/presign'
  45. )
  46. assert.equal(
  47. resolveMarketEntry('manager-freight').path,
  48. '/market/manager/freight'
  49. )
  50. assert.equal(resolveMarketEntry('https://evil.example'), null)
  51. assert.equal(resolveMarketEntry('../manager/freight'), null)
  52. assert.equal(resolveMarketEntry('specialist-presign?scope=manager'), null)
  53. assert.equal(
  54. resolveMarketReturnPath({ returnPath: '/pages/index/index?tab=market' }),
  55. '/pages/index/index?tab=market'
  56. )
  57. assert.equal(
  58. resolveMarketReturnPath({ returnPath: 'https://evil.example/callback' }),
  59. '/pages/index/index'
  60. )
  61. assert.equal(
  62. resolveMarketReturnPath({ returnPath: '/pages/../evil' }),
  63. '/pages/index/index'
  64. )
  65. assert.equal(
  66. resolveMarketBackFallback('/pages/index/index?tab=market'),
  67. '/pages/index/index?tab=market'
  68. )
  69. assert.equal(
  70. resolveMarketBackFallback('https://evil.example/callback'),
  71. '/pages/index/index'
  72. )
  73. const marketUrl = buildMarketH5Url({
  74. entry: 'manager-payment-chase',
  75. token: 'token +&',
  76. returnPath: '/pages/index/index?tab=market'
  77. })
  78. assert.equal(
  79. marketUrl,
  80. marketBase +
  81. '/market/manager/payment-chase' +
  82. '?token=token%20%2B%26&returnPath=%2Fpages%2Findex%2Findex%3Ftab%3Dmarket'
  83. )
  84. assert.equal(
  85. buildMarketH5Url({
  86. entry: 'https://evil.example',
  87. token: 'token',
  88. returnPath: '/pages/index/index'
  89. }),
  90. ''
  91. )
  92. assert.equal(normalizeMenu({ icon: '' }).icon, '')
  93. assert.equal(
  94. normalizeMenu({
  95. path: '/pages/market/webview/index?entry=specialist-presign',
  96. icon: ''
  97. }).icon,
  98. 'market-presign'
  99. )
  100. assert.equal(
  101. normalizeMenu({
  102. path: 'pages/market/webview/index?entry=manager-payment-chase',
  103. icon: ''
  104. }).icon,
  105. 'market-payment-chase'
  106. )
  107. assert.equal(
  108. normalizeMenu({
  109. path: '/pages/market/webview/index?entry=specialist-payment',
  110. icon: ''
  111. }).icon,
  112. 'market-payment'
  113. )
  114. // 后端旧版对市场入口回落 apps-o 时,前端须覆盖为专用 PNG
  115. assert.equal(
  116. normalizeMenu({
  117. path: '/pages/market/webview/index?entry=specialist-presign',
  118. icon: 'apps-o'
  119. }).icon,
  120. 'market-presign'
  121. )
  122. assert.equal(
  123. normalizeMenu({ groupTitle: '市场部', icon: '' }).groupTitle,
  124. '市场部'
  125. )
  126. // 测试库未重组目录 / 旧接口无 groupTitle 时,按 path 推断分区
  127. assert.equal(
  128. normalizeMenu({
  129. path: '/pages/market/webview/index?entry=manager-freight',
  130. icon: 'apps-o'
  131. }).groupTitle,
  132. '市场部'
  133. )
  134. assert.equal(
  135. normalizeMenu({
  136. path: '/pages/oa/pending/index',
  137. icon: 'oa-pending'
  138. }).groupTitle,
  139. 'OA工作流'
  140. )
  141. assert.equal(
  142. normalizeMenu({
  143. path: '/pages/demo/comps',
  144. icon: 'apps-o'
  145. }).groupTitle,
  146. ''
  147. )
  148. assert.equal(isOaHostWebviewRoute('pages/market/webview/index'), true)
  149. assert.equal(isOaHostWebviewRoute('pages/index/index'), false)
  150. const marketFrame = {}
  151. const trustedMessage = {
  152. origin: marketOrigin,
  153. source: marketFrame,
  154. data: { source: 'zkxw-oa-h5', action: 'market-close' }
  155. }
  156. assert.equal(isTrustedMarketCloseMessage(trustedMessage, marketFrame), true)
  157. assert.equal(
  158. isTrustedMarketCloseMessage(
  159. { ...trustedMessage, origin: 'https://evil.example' },
  160. marketFrame
  161. ),
  162. false
  163. )
  164. assert.equal(
  165. isTrustedMarketCloseMessage(
  166. { ...trustedMessage, source: {} },
  167. marketFrame
  168. ),
  169. false
  170. )
  171. assert.equal(
  172. isTrustedMarketCloseMessage(
  173. { ...trustedMessage, data: { source: 'zkxw-oa-h5', action: '' } },
  174. marketFrame
  175. ),
  176. false
  177. )
  178. assert.equal(
  179. isTrustedMarketCloseMessage(
  180. {
  181. ...trustedMessage,
  182. data: { source: 'zkxw-oa-h5', action: 'oa-detail-close' }
  183. },
  184. marketFrame
  185. ),
  186. false
  187. )
  188. assert.equal(canOpenMarketWebview(false, 'token'), true)
  189. assert.equal(canOpenMarketWebview(true, 'token'), false)
  190. assert.equal(canOpenMarketWebview(false, ''), false)
  191. console.log('market-h5: ok')