abstractMenuBuilder.test.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  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. import {result} from 'lodash-es';
  10. class TestableAbstractMenuBuilder extends AbstractMenuBuilder {
  11. static readonly menuName = 'TestableMenu'
  12. public build(): MenuItem | MenuGroup | null {
  13. return { label: 'my_menu' }
  14. }
  15. public createGroup(
  16. label: string,
  17. icon?: IconItem,
  18. children: MenuItems = [],
  19. actions: Array<MenuItem> = [],
  20. ): MenuGroup {
  21. return super.createGroup(label, icon, children, actions)
  22. }
  23. public createItem(
  24. label: string,
  25. icon?: IconItem,
  26. to: string = '',
  27. type: MENU_LINK_TYPE = MENU_LINK_TYPE.INTERNAL,
  28. ): MenuItem {
  29. return super.createItem(label, icon, to, type)
  30. }
  31. public buildSubmenu(menuBuilder: typeof AbstractMenuBuilder) {
  32. return super.buildSubmenu(menuBuilder)
  33. }
  34. public addChildItemIfAllowed(
  35. children: MenuItems,
  36. pageName: string,
  37. icon?: IconItem,
  38. ) {
  39. return super.addChildItemIfAllowed(children, pageName, icon)
  40. }
  41. }
  42. let runtimeConfig: RuntimeConfig
  43. let ability: AnyAbility
  44. let organizationProfile: organizationState
  45. let accessProfile: AccessProfile
  46. let menuBuilder: TestableAbstractMenuBuilder
  47. let router: Router
  48. beforeEach(() => {
  49. runtimeConfig = vi.fn() as any as RuntimeConfig
  50. ability = vi.fn() as any as AnyAbility
  51. organizationProfile = vi.fn() as any as organizationState
  52. accessProfile = vi.fn() as any as AccessProfile
  53. // @ts-ignore
  54. router = vi.fn() as Router
  55. menuBuilder = new TestableAbstractMenuBuilder(
  56. runtimeConfig,
  57. ability,
  58. organizationProfile,
  59. accessProfile,
  60. router,
  61. )
  62. })
  63. describe('getMenuName', () => {
  64. test('get name', () => {
  65. expect(menuBuilder.getMenuName()).toEqual('TestableMenu')
  66. })
  67. })
  68. describe('createGroup', () => {
  69. test('simple group', () => {
  70. const label = 'my_menu'
  71. const icon = { name: 'my_icon' }
  72. const children = [
  73. { label: 'submenu', type: MENU_LINK_TYPE.INTERNAL, active: true },
  74. ]
  75. const actions = [
  76. { label: 'action', type: MENU_LINK_TYPE.INTERNAL, active: true },
  77. ]
  78. const result = menuBuilder.createGroup(label, icon, children, actions)
  79. expect(result).toEqual({ label, icon, children, actions })
  80. })
  81. test('default values', () => {
  82. const result = menuBuilder.createGroup('my_menu')
  83. expect(result).toEqual({
  84. label: 'my_menu',
  85. icon: undefined,
  86. children: [],
  87. actions: [],
  88. })
  89. })
  90. })
  91. describe('createItem', () => {
  92. test('simple item', () => {
  93. const label = 'my_menu'
  94. const icon = { name: 'my_icon' }
  95. const to = 'https://domain.com/foo/bar'
  96. const type = MENU_LINK_TYPE.EXTERNAL
  97. const result = menuBuilder.createItem(label, icon, to, type)
  98. expect(result).toEqual({ icon, label, to, type, active: false })
  99. })
  100. test('default values', () => {
  101. const result = menuBuilder.createItem('my_menu')
  102. expect(result).toEqual({
  103. label: 'my_menu',
  104. icon: undefined,
  105. to: '',
  106. type: MENU_LINK_TYPE.INTERNAL,
  107. active: false,
  108. })
  109. })
  110. test('prepend https on external url', () => {
  111. const item = menuBuilder.createItem(
  112. 'my_menu',
  113. undefined,
  114. 'domain.com',
  115. MENU_LINK_TYPE.EXTERNAL,
  116. )
  117. expect(item.to).toEqual('https://domain.com')
  118. })
  119. test('complete V1 links (server side)', () => {
  120. runtimeConfig.baseUrlAdminLegacy = 'https://admin.opentalent.fr'
  121. const item = menuBuilder.createItem(
  122. 'my_menu',
  123. undefined,
  124. '/my_page',
  125. MENU_LINK_TYPE.V1,
  126. )
  127. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  128. })
  129. test('complete V1 links (client side)', () => {
  130. runtimeConfig.baseUrlAdminLegacy = ''
  131. // @ts-ignore
  132. runtimeConfig.public = { baseUrlAdminLegacy: 'https://admin.opentalent.fr' }
  133. const item = menuBuilder.createItem(
  134. 'my_menu',
  135. undefined,
  136. '/my_page',
  137. MENU_LINK_TYPE.V1,
  138. )
  139. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  140. })
  141. })
  142. describe('buildSubmenu', () => {
  143. test('should call given menu build method', () => {
  144. expect(menuBuilder.buildSubmenu(TestableAbstractMenuBuilder)).toEqual({
  145. label: 'my_menu',
  146. })
  147. })
  148. })
  149. describe('addChildItemIfAllowed', () => {
  150. test('simple call', () => {
  151. ability.can = vi.fn(() => true)
  152. // @ts-ignore
  153. router.resolve = vi.fn(() => {
  154. return { href: 'foo' }
  155. })
  156. const children: MenuItems = []
  157. menuBuilder.addChildItemIfAllowed(children, 'foo_page')
  158. expect(children).toEqual([
  159. { label: 'foo_page', icon: undefined, to: 'foo', type: 0, active: false },
  160. ])
  161. })
  162. test('not allowed', () => {
  163. ability.can = vi.fn(() => false)
  164. const children: MenuItems = []
  165. menuBuilder.addChildItemIfAllowed(children, 'foo_page')
  166. expect(children).toEqual([])
  167. })
  168. test('unknown page name', () => {
  169. ability.can = vi.fn(() => true)
  170. // @ts-ignore
  171. router.resolve = vi.fn(() => {
  172. return null
  173. })
  174. const children: MenuItems = []
  175. expect(() =>
  176. menuBuilder.addChildItemIfAllowed(children, 'foo_page'),
  177. ).toThrowError()
  178. expect(children).toEqual([])
  179. })
  180. })