menuComposer.test.ts 3.5 KB

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