mainMenuBuilder.test.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. import { describe, test, expect, vi, beforeEach } from 'vitest'
  2. import type { RuntimeConfig } from '@nuxt/schema'
  3. import type { AnyAbility } from '@casl/ability/dist/types'
  4. import type { Router } from 'vue-router'
  5. import type { AccessProfile, organizationState } from '~/types/interfaces'
  6. import MainMenuBuilder from '~/services/layout/menuBuilder/mainMenuBuilder'
  7. import type { MenuGroup } from '~/types/layout'
  8. import { MENU_LINK_TYPE } from '~/types/enum/layout'
  9. import type AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
  10. import AccessMenuBuilder from '~/services/layout/menuBuilder/accessMenuBuilder'
  11. import AgendaMenuBuilder from '~/services/layout/menuBuilder/agendaMenuBuilder'
  12. import EquipmentMenuBuilder from '~/services/layout/menuBuilder/equipmentMenuBuilder'
  13. import EducationalMenuBuilder from '~/services/layout/menuBuilder/educationalMenuBuilder'
  14. import BillingMenuBuilder from '~/services/layout/menuBuilder/billingMenuBuilder'
  15. import CommunicationMenuBuilder from '~/services/layout/menuBuilder/communicationMenuBuilder'
  16. import DonorsMenuBuilder from '~/services/layout/menuBuilder/donorsMenuBuilder'
  17. import RewardsMenuBuilder from '~/services/layout/menuBuilder/rewardsMenuBuilder'
  18. import WebsiteAdminMenuBuilder from '~/services/layout/menuBuilder/websiteAdminMenuBuilder'
  19. import CotisationsMenuBuilder from '~/services/layout/menuBuilder/cotisationsMenuBuilder'
  20. import StatsMenuBuilder from '~/services/layout/menuBuilder/statsMenuBuilder'
  21. import Admin2iosMenuBuilder from '~/services/layout/menuBuilder/admin2iosMenuBuilder'
  22. let runtimeConfig: RuntimeConfig
  23. let ability: AnyAbility
  24. let organizationProfile: organizationState
  25. let accessProfile: AccessProfile
  26. let menuBuilder: MainMenuBuilder
  27. let router: Router
  28. beforeEach(() => {
  29. runtimeConfig = vi.fn() as any as RuntimeConfig
  30. ability = vi.fn() as any as AnyAbility
  31. organizationProfile = vi.fn() as any as organizationState
  32. accessProfile = vi.fn() as any as AccessProfile
  33. // @ts-ignore
  34. router = vi.fn() as Router
  35. runtimeConfig.baseUrlAdminLegacy = 'https://mydomain.com/'
  36. menuBuilder = new MainMenuBuilder(
  37. runtimeConfig,
  38. ability,
  39. organizationProfile,
  40. accessProfile,
  41. router,
  42. )
  43. })
  44. describe('getMenuName', () => {
  45. test('validate name', () => {
  46. expect(menuBuilder.getMenuName()).toEqual('Main')
  47. })
  48. })
  49. describe('build', () => {
  50. test('return all menus', () => {
  51. // @ts-ignore
  52. menuBuilder.buildSubmenu = vi.fn(
  53. (menuBuilder: typeof AbstractMenuBuilder): MenuGroup => {
  54. return { label: 'foo' }
  55. },
  56. )
  57. const result = menuBuilder.build() as MenuGroup
  58. // @ts-ignore
  59. expect(menuBuilder.buildSubmenu).toBeCalledWith(AccessMenuBuilder)
  60. // @ts-ignore
  61. expect(menuBuilder.buildSubmenu).toBeCalledWith(AgendaMenuBuilder)
  62. // @ts-ignore
  63. expect(menuBuilder.buildSubmenu).toBeCalledWith(EquipmentMenuBuilder)
  64. // @ts-ignore
  65. expect(menuBuilder.buildSubmenu).toBeCalledWith(EducationalMenuBuilder)
  66. // @ts-ignore
  67. expect(menuBuilder.buildSubmenu).toBeCalledWith(BillingMenuBuilder)
  68. // @ts-ignore
  69. expect(menuBuilder.buildSubmenu).toBeCalledWith(CommunicationMenuBuilder)
  70. // @ts-ignore
  71. expect(menuBuilder.buildSubmenu).toBeCalledWith(DonorsMenuBuilder)
  72. // @ts-ignore
  73. expect(menuBuilder.buildSubmenu).toBeCalledWith(RewardsMenuBuilder)
  74. // @ts-ignore
  75. expect(menuBuilder.buildSubmenu).toBeCalledWith(WebsiteAdminMenuBuilder)
  76. // @ts-ignore
  77. expect(menuBuilder.buildSubmenu).toBeCalledWith(CotisationsMenuBuilder)
  78. // @ts-ignore
  79. expect(menuBuilder.buildSubmenu).toBeCalledWith(StatsMenuBuilder)
  80. // @ts-ignore
  81. expect(menuBuilder.buildSubmenu).toBeCalledWith(Admin2iosMenuBuilder)
  82. expect(result.label).toEqual('main')
  83. expect(result.icon).toEqual(undefined)
  84. expect((result.children ?? []).length).toEqual(13)
  85. })
  86. test('return a single group', () => {
  87. // @ts-ignore
  88. menuBuilder.buildSubmenu = vi.fn(
  89. (menuBuilder: typeof AbstractMenuBuilder): MenuGroup | null => {
  90. if (menuBuilder.menuName === 'Access') {
  91. return {
  92. label: 'submenu',
  93. children: [
  94. { label: 'item1', type: MENU_LINK_TYPE.INTERNAL, active: true },
  95. { label: 'item2', type: MENU_LINK_TYPE.INTERNAL, active: true },
  96. { label: 'item3', type: MENU_LINK_TYPE.INTERNAL, active: true },
  97. ],
  98. }
  99. }
  100. return null
  101. },
  102. )
  103. const result = menuBuilder.build() as MenuGroup
  104. expect(result.label).toEqual('submenu')
  105. expect((result.children ?? []).length).toEqual(3)
  106. })
  107. test('return null', () => {
  108. // @ts-ignore
  109. menuBuilder.buildSubmenu = vi.fn(
  110. (menuBuilder: typeof AbstractMenuBuilder): MenuGroup | null => {
  111. return null
  112. },
  113. )
  114. const result = menuBuilder.build() as MenuGroup
  115. expect(result).toEqual(null)
  116. })
  117. })