menuComposer.test.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { describe, test, expect, vi } 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 MenuComposer from '~/services/layout/menuComposer'
  6. import type {
  7. AccessProfile,
  8. LayoutState,
  9. organizationState,
  10. } from '~/types/interfaces'
  11. import type { MenuBuilder, MenuGroup, MenuItem } from '~/types/layout'
  12. import { MENU_LINK_TYPE } from '~/types/enum/layout'
  13. describe('build', () => {
  14. test('simple call', () => {
  15. // @ts-ignore
  16. const runtimeConfig = vi.fn() as RuntimeConfig
  17. // @ts-ignore
  18. const ability = vi.fn() as AnyAbility
  19. // @ts-ignore
  20. const organizationProfile = vi.fn() as organizationState
  21. // @ts-ignore
  22. const accessProfile = vi.fn() as AccessProfile
  23. // @ts-ignore
  24. const layoutState = vi.fn() as LayoutState
  25. // @ts-ignore
  26. const router = vi.fn() as Router
  27. layoutState.menus = {}
  28. layoutState.menusOpened = {}
  29. const item1 = { label: 'item1', type: MENU_LINK_TYPE.INTERNAL } as MenuItem
  30. const group1 = { label: 'group1', children: [] } as MenuGroup
  31. const group2 = {
  32. label: 'group1',
  33. children: [{ label: 'item2', type: MENU_LINK_TYPE.INTERNAL }],
  34. } as MenuGroup
  35. // @ts-ignore
  36. const dummyBuilder1 = vi.fn() as MenuBuilder
  37. const dummyBuilderClass1 = vi.fn(() => dummyBuilder1)
  38. dummyBuilder1.getMenuName = vi.fn(() => 'dummy1')
  39. dummyBuilder1.build = vi.fn(() => item1)
  40. // @ts-ignore
  41. const dummyBuilder2 = vi.fn() as MenuBuilder
  42. const dummyBuilderClass2 = vi.fn(() => dummyBuilder2)
  43. dummyBuilder2.getMenuName = vi.fn(() => 'dummy2')
  44. dummyBuilder2.build = vi.fn(() => group1)
  45. // @ts-ignore
  46. const dummyBuilder3 = vi.fn() as MenuBuilder
  47. const dummyBuilderClass3 = vi.fn(() => dummyBuilder3)
  48. dummyBuilder3.getMenuName = vi.fn(() => 'dummy3')
  49. dummyBuilder3.build = vi.fn(() => group2)
  50. // @ts-ignore
  51. const dummyBuilder4 = vi.fn() as MenuBuilder
  52. const dummyBuilderClass4 = vi.fn(() => dummyBuilder4)
  53. dummyBuilder4.getMenuName = vi.fn(() => 'dummy4')
  54. dummyBuilder4.build = vi.fn(() => null)
  55. // @ts-ignore
  56. MenuComposer.builders = [
  57. dummyBuilderClass1,
  58. dummyBuilderClass2,
  59. dummyBuilderClass3,
  60. dummyBuilderClass4,
  61. ]
  62. MenuComposer.build(
  63. runtimeConfig,
  64. ability,
  65. organizationProfile,
  66. accessProfile,
  67. router,
  68. layoutState,
  69. )
  70. expect(dummyBuilderClass1).toHaveBeenCalledOnce()
  71. expect(dummyBuilderClass1).toHaveBeenCalledWith(
  72. runtimeConfig,
  73. ability,
  74. organizationProfile,
  75. accessProfile,
  76. router,
  77. )
  78. expect(dummyBuilder1.build).toHaveBeenCalledOnce()
  79. expect(dummyBuilderClass2).toHaveBeenCalledOnce()
  80. expect(dummyBuilderClass2).toHaveBeenCalledWith(
  81. runtimeConfig,
  82. ability,
  83. organizationProfile,
  84. accessProfile,
  85. router,
  86. )
  87. expect(dummyBuilder2.build).toHaveBeenCalledOnce()
  88. expect(dummyBuilderClass3).toHaveBeenCalledOnce()
  89. expect(dummyBuilderClass3).toHaveBeenCalledWith(
  90. runtimeConfig,
  91. ability,
  92. organizationProfile,
  93. accessProfile,
  94. router,
  95. )
  96. expect(dummyBuilder3.build).toHaveBeenCalledOnce()
  97. expect(dummyBuilderClass4).toHaveBeenCalledOnce()
  98. expect(dummyBuilderClass4).toHaveBeenCalledWith(
  99. runtimeConfig,
  100. ability,
  101. organizationProfile,
  102. accessProfile,
  103. router,
  104. )
  105. expect(dummyBuilder4.build).toHaveBeenCalledOnce()
  106. expect(layoutState.menus).toEqual({
  107. dummy1: item1,
  108. dummy2: group1,
  109. dummy3: group2,
  110. })
  111. expect(layoutState.menusOpened).toEqual({
  112. dummy3: false,
  113. })
  114. })
  115. })