menuComposer.test.ts 3.7 KB

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