wuxing-sandbox.test.js 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import {
  2. buildMemberOptions,
  3. dedupeMembers,
  4. nextSandboxSelection,
  5. resolveSandboxOverall,
  6. resolveSandboxScores
  7. } from '@/utils/wuxing-sandbox'
  8. const familyScores = {
  9. bodyScore: 59,
  10. mindScore: 0,
  11. wisdomScore: 8,
  12. actionScore: 0,
  13. wealthScore: 8,
  14. overallScore: 15
  15. }
  16. const personalData = {
  17. bodyScore: 75,
  18. mindScore: 0,
  19. wisdomScore: 3,
  20. actionScore: 0,
  21. wealthScore: 30,
  22. overallScore: 21,
  23. members: [{ memberId: 12, memberType: 'parent', name: '他爹' }]
  24. }
  25. const members = [
  26. { memberId: 12, memberType: 'parent', name: '他爹', bodyScore: 75, mindScore: 0, wisdomScore: 3, actionScore: 0, wealthScore: 30, overallScore: 21 },
  27. { memberId: 34, memberType: 'parent', name: '书宁宁', bodyScore: 78, mindScore: 0, wisdomScore: 10, actionScore: 0, wealthScore: 6, overallScore: 19 },
  28. { memberId: 78, memberType: 'parent', name: '云泽', bodyScore: 0, mindScore: 0, wisdomScore: 0, actionScore: 0, wealthScore: 0, overallScore: 0 },
  29. { memberId: 23, memberType: 'child', name: '老二', bodyScore: 0, mindScore: 0, wisdomScore: 43, actionScore: 0, wealthScore: 21, overallScore: 13 },
  30. // 完全重复的成员记录只能出现一次
  31. { memberId: 34, memberType: 'parent', name: '书宁宁', bodyScore: 78, mindScore: 0, wisdomScore: 10, actionScore: 0, wealthScore: 6, overallScore: 19 }
  32. ]
  33. describe('wuxing sandbox member selection', () => {
  34. test('dedupeMembers removes exact duplicate member rows', () => {
  35. expect(dedupeMembers(members).map(m => m.memberId)).toEqual([12, 34, 78, 23])
  36. })
  37. test('buildMemberOptions excludes self, dedupes members and appends family', () => {
  38. const options = buildMemberOptions(members, personalData)
  39. expect(options.map(o => o.label)).toEqual(['本人', '书宁宁', '云泽', '老二', '全家'])
  40. expect(options[0].viewMode).toBe('personal')
  41. expect(options[options.length - 1].viewMode).toBe('family')
  42. })
  43. test('member view uses the selected member scores instead of personalData', () => {
  44. const selected = members[1]
  45. expect(resolveSandboxScores('member', familyScores, personalData, selected)).toEqual([78, 0, 10, 0, 6])
  46. expect(resolveSandboxOverall('member', familyScores, personalData, selected)).toBe(19)
  47. })
  48. test('personal view keeps the login user scores', () => {
  49. expect(resolveSandboxScores('personal', familyScores, personalData, null)).toEqual([75, 0, 3, 0, 30])
  50. expect(resolveSandboxOverall('personal', familyScores, personalData, null)).toBe(21)
  51. })
  52. test('family view uses family aggregate scores', () => {
  53. expect(resolveSandboxScores('family', familyScores, personalData, null)).toEqual([59, 0, 8, 0, 8])
  54. expect(resolveSandboxOverall('family', familyScores, personalData, null)).toBe(15)
  55. })
  56. test('center click cycles personal -> other members -> family -> personal', () => {
  57. const options = buildMemberOptions(members, personalData)
  58. expect(nextSandboxSelection(options, 'personal', null)).toMatchObject({ viewMode: 'member', memberId: 34 })
  59. expect(nextSandboxSelection(options, 'member', 34)).toMatchObject({ viewMode: 'member', memberId: 78 })
  60. expect(nextSandboxSelection(options, 'member', 23)).toMatchObject({ viewMode: 'family' })
  61. expect(nextSandboxSelection(options, 'family', null)).toMatchObject({ viewMode: 'personal' })
  62. })
  63. test('only family and self falls back to self instead of showing an empty member', () => {
  64. const onlySelf = { ...personalData, members: [{ memberId: 12, memberType: 'parent', name: '他爹' }] }
  65. const options = buildMemberOptions([], onlySelf)
  66. expect(options.map(o => o.viewMode)).toEqual(['personal', 'family'])
  67. expect(nextSandboxSelection(options, 'personal', null)).toMatchObject({ viewMode: 'family' })
  68. })
  69. })