abstractMenuBuilder.test.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import { describe, test, expect, vi, beforeEach } from 'vitest'
  2. import type { RuntimeConfig } from '@nuxt/schema'
  3. import type { AnyAbility } from '@casl/ability'
  4. import type { Router } from 'vue-router'
  5. import AbstractMenuBuilder from '~/services/layout/menuBuilder/abstractMenuBuilder'
  6. import type { IconItem, MenuGroup, MenuItem, MenuItems } from '~/types/layout'
  7. import { MENU_LINK_TYPE } from '~/types/enum/layout'
  8. import type { AccessProfile, organizationState } from '~/types/interfaces'
  9. class TestableAbstractMenuBuilder extends AbstractMenuBuilder {
  10. static readonly menuName = 'TestableMenu'
  11. public build(): MenuItem | MenuGroup | null {
  12. return { label: 'my_menu' }
  13. }
  14. public createGroup(
  15. label: string,
  16. icon?: IconItem,
  17. children: MenuItems = [],
  18. actions: Array<MenuItem> = [],
  19. ): MenuGroup {
  20. return super.createGroup(label, icon, children, actions)
  21. }
  22. public createItem(
  23. label: string,
  24. icon?: IconItem,
  25. to: string = '',
  26. type: MENU_LINK_TYPE = MENU_LINK_TYPE.INTERNAL,
  27. ): MenuItem {
  28. return super.createItem(label, icon, to, type)
  29. }
  30. public buildSubmenu(menuBuilder: typeof AbstractMenuBuilder) {
  31. return super.buildSubmenu(menuBuilder)
  32. }
  33. }
  34. let runtimeConfig: RuntimeConfig
  35. let ability: AnyAbility
  36. let organizationProfile: organizationState
  37. let accessProfile: AccessProfile
  38. let menuBuilder: TestableAbstractMenuBuilder
  39. let router: Router
  40. beforeEach(() => {
  41. runtimeConfig = vi.fn() as any as RuntimeConfig
  42. ability = vi.fn() as any as AnyAbility
  43. organizationProfile = vi.fn() as any as organizationState
  44. accessProfile = vi.fn() as any as AccessProfile
  45. // @ts-ignore
  46. router = vi.fn() as Router
  47. menuBuilder = new TestableAbstractMenuBuilder(
  48. runtimeConfig,
  49. ability,
  50. organizationProfile,
  51. accessProfile,
  52. router,
  53. )
  54. })
  55. describe('getMenuName', () => {
  56. test('get name', () => {
  57. expect(menuBuilder.getMenuName()).toEqual('TestableMenu')
  58. })
  59. })
  60. describe('createGroup', () => {
  61. test('simple group', () => {
  62. const label = 'my_menu'
  63. const icon = { name: 'my_icon' }
  64. const children = [
  65. { label: 'submenu', type: MENU_LINK_TYPE.INTERNAL, active: true },
  66. ]
  67. const actions = [
  68. { label: 'action', type: MENU_LINK_TYPE.INTERNAL, active: true },
  69. ]
  70. const result = menuBuilder.createGroup(label, icon, children, actions)
  71. expect(result).toEqual({ label, icon, children, actions })
  72. })
  73. test('default values', () => {
  74. const result = menuBuilder.createGroup('my_menu')
  75. expect(result).toEqual({
  76. label: 'my_menu',
  77. icon: undefined,
  78. children: [],
  79. actions: [],
  80. })
  81. })
  82. })
  83. describe('createItem', () => {
  84. test('simple item', () => {
  85. const label = 'my_menu'
  86. const icon = { name: 'my_icon' }
  87. const to = 'https://domain.com/foo/bar'
  88. const type = MENU_LINK_TYPE.EXTERNAL
  89. const result = menuBuilder.createItem(label, icon, to, type)
  90. expect(result).toEqual({ icon, label, to, type, active: false })
  91. })
  92. test('default values', () => {
  93. const result = menuBuilder.createItem('my_menu')
  94. expect(result).toEqual({
  95. label: 'my_menu',
  96. icon: undefined,
  97. to: '',
  98. type: MENU_LINK_TYPE.INTERNAL,
  99. active: false,
  100. })
  101. })
  102. test('prepend https on external url', () => {
  103. const item = menuBuilder.createItem(
  104. 'my_menu',
  105. undefined,
  106. 'domain.com',
  107. MENU_LINK_TYPE.EXTERNAL,
  108. )
  109. expect(item.to).toEqual('https://domain.com')
  110. })
  111. test('complete V1 links (server side)', () => {
  112. runtimeConfig.baseUrlAdminLegacy = 'https://admin.opentalent.fr'
  113. const item = menuBuilder.createItem(
  114. 'my_menu',
  115. undefined,
  116. '/my_page',
  117. MENU_LINK_TYPE.V1,
  118. )
  119. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  120. })
  121. test('complete V1 links (client side)', () => {
  122. runtimeConfig.baseUrlAdminLegacy = ''
  123. // @ts-ignore
  124. runtimeConfig.public = { baseUrlAdminLegacy: 'https://admin.opentalent.fr' }
  125. const item = menuBuilder.createItem(
  126. 'my_menu',
  127. undefined,
  128. '/my_page',
  129. MENU_LINK_TYPE.V1,
  130. )
  131. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  132. })
  133. })
  134. describe('buildSubmenu', () => {
  135. test('should call given menu build method', () => {
  136. expect(menuBuilder.buildSubmenu(TestableAbstractMenuBuilder)).toEqual({
  137. label: 'my_menu',
  138. })
  139. })
  140. })
  141. describe('addChildItemIfAllowed', () => {
  142. test('simple call', () => {})
  143. })