activity-poster-time.test.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import fs from 'node:fs'
  4. import path from 'node:path'
  5. import vm from 'node:vm'
  6. const detailFile = path.resolve('pagesHome/activityDetail.vue')
  7. const dateFormatFile = path.resolve('common/utils/dateFormat.js')
  8. function loadActivityDetail (activityOverrides = {}) {
  9. const source = fs.readFileSync(detailFile, 'utf8')
  10. const start = source.indexOf('\tconst getActivityDetail = (id) => {')
  11. const end = source.indexOf('\n\twatch(()=>userStore.token', start)
  12. assert.notEqual(start, -1, '应找到活动详情加载方法')
  13. assert.notEqual(end, -1, '应找到活动详情加载方法的结束位置')
  14. const activityInfo = { value: {} }
  15. const posterData = {
  16. title: '默认标题',
  17. time: '默认时间',
  18. address: '默认地址',
  19. organizer: '默认组织者',
  20. mainImg: '默认封面'
  21. }
  22. const response = {
  23. code: 0,
  24. data: {
  25. id: 'activity-1',
  26. activityName: '测试活动',
  27. activityStartTime: '2026-10-12 09:30:00',
  28. activityEndTime: '2026-10-13 18:05:00',
  29. signupStartTime: '2026-10-01 09:00:00',
  30. signupEndTime: '2026-10-11 18:00:00',
  31. provinceName: '广东省',
  32. cityName: '深圳市',
  33. address: '测试地址',
  34. channelName: '测试机构',
  35. coverFile: 'cover.png',
  36. signupState: 0,
  37. activeState: 1,
  38. recruitmentNow: 0,
  39. recruitmentMax: 10,
  40. imageFiles: '',
  41. ...activityOverrides
  42. }
  43. }
  44. const context = {
  45. activityInfo,
  46. posterData,
  47. shareADId: { value: '' },
  48. imgList: { value: [] },
  49. avatars: { value: [] },
  50. proxy: {
  51. $api: { get: () => Promise.resolve({ data: response }) },
  52. $showToast: () => {}
  53. },
  54. uni: { showModal: () => {}, reLaunch: () => {} },
  55. console
  56. }
  57. vm.createContext(context)
  58. vm.runInContext(fs.readFileSync(dateFormatFile, 'utf8'), context)
  59. vm.runInContext(`${source.slice(start, end)}\nthis.getActivityDetail = getActivityDetail`, context)
  60. return { getActivityDetail: context.getActivityDetail, activityInfo, posterData }
  61. }
  62. test('海报使用接口原始活动时间生成有效的月日和时分', async () => {
  63. const { getActivityDetail, activityInfo, posterData } = loadActivityDetail()
  64. getActivityDetail('activity-1')
  65. await new Promise(resolve => setImmediate(resolve))
  66. assert.equal(activityInfo.value.activityStartTime, '2026年10月12日 09:30')
  67. assert.equal(activityInfo.value.activityEndTime, '2026年10月13日 18:05')
  68. assert.equal(posterData.time, '10.12-09:30 ~ 10.13-18:05')
  69. })
  70. test('活动时间无效时海报显示时间待定且不残留示例时间', async () => {
  71. const { getActivityDetail, posterData } = loadActivityDetail({
  72. activityStartTime: '2026-02-31 09:30:00',
  73. activityEndTime: '2026-03-01 18:00:00'
  74. })
  75. getActivityDetail('activity-1')
  76. await new Promise(resolve => setImmediate(resolve))
  77. assert.equal(posterData.time, '时间待定')
  78. assert.equal(posterData.time.includes('NaN'), false)
  79. })