abstractMenuBuilder.test.ts 4.2 KB

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