memberNormalize.resolveCheckin.test.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /**
  2. * Tests for cfc-frontend utils/memberNormalize.js — resolveCheckinMemberId
  3. *
  4. * 背景:三个健康打卡页(diet/exercise/sleep-checkin)onLoad 里
  5. * `if (role !== 'child') { memberId = options.memberId || currentMemberId || null }`
  6. * 与首页 growth-main 的 `currentChildId || currentMemberId || userId` 解析不一致:
  7. * 1) role==='child' 时 memberId 恒为 null(打卡页根本拿不到成员)
  8. * 2) parent 角色缺 currentChildId / userId 兜底
  9. * 导致:无当日未完成任务(URL 不带 memberId)+ currentMemberId 为空时,
  10. * 提交被 `if (!memberId)` 拦截提示"成员ID无效"。
  11. *
  12. * 本测试规定 resolveCheckinMemberId 的统一解析行为(与首页 growth-main 对齐):
  13. * options.memberId > currentChildId > currentMemberId > userId > null
  14. * 不再受 role 限制。
  15. */
  16. describe('resolveCheckinMemberId', () => {
  17. let normalize
  18. beforeAll(() => {
  19. normalize = require('@/utils/memberNormalize')
  20. })
  21. test('URL 参数 options.memberId 优先(首页 tile 带 taskId 进入)', () => {
  22. expect(normalize.resolveCheckinMemberId(
  23. { memberId: '21', taskId: '4040' },
  24. { currentChildId: '10', currentMemberId: '9', userId: '12' }
  25. )).toBe('21')
  26. })
  27. test('无 URL 参数时回退 currentChildId(parent 切到孩子视角)', () => {
  28. expect(normalize.resolveCheckinMemberId(
  29. {},
  30. { currentChildId: '21', currentMemberId: '', userId: '12' }
  31. )).toBe('21')
  32. })
  33. test('再回退 currentMemberId', () => {
  34. expect(normalize.resolveCheckinMemberId(
  35. {},
  36. { currentChildId: '', currentMemberId: '21', userId: '12' }
  37. )).toBe('21')
  38. })
  39. test('最后回退 userId(首页与打卡页解析一致的兜底)', () => {
  40. expect(normalize.resolveCheckinMemberId(
  41. {},
  42. { currentChildId: '', currentMemberId: '', userId: '12' }
  43. )).toBe('12')
  44. })
  45. test('child 角色不返回 null(修复原 if(role!=="child") 恒 null 缺陷)', () => {
  46. expect(normalize.resolveCheckinMemberId(
  47. {},
  48. { currentRole: 'child', currentChildId: '21', currentMemberId: '', userId: '12' }
  49. )).toBe('21')
  50. })
  51. test('child 角色无 currentChildId 时回退 userId', () => {
  52. expect(normalize.resolveCheckinMemberId(
  53. {},
  54. { currentRole: 'child', currentChildId: '', currentMemberId: '', userId: '12' }
  55. )).toBe('12')
  56. })
  57. test('全部为空返回 null(保持提交拦截语义,由后端/调用方给出明确提示)', () => {
  58. expect(normalize.resolveCheckinMemberId({}, {})).toBeNull()
  59. expect(normalize.resolveCheckinMemberId(null, null)).toBeNull()
  60. })
  61. })