abstractMenuBuilder.test.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { describe, test, it, expect } from 'vitest'
  2. import AbstractMenuBuilder from "~/services/layout/menuBuilder/abstractMenuBuilder";
  3. import {IconItem, MenuGroup, MenuItem, MenuItems} from "~/types/layout";
  4. import {MENU_LINK_TYPE} from "~/types/enum/layout";
  5. import {RuntimeConfig} from "@nuxt/schema";
  6. import {AnyAbility} from "@casl/ability";
  7. import {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(runtimeConfig, ability, organizationProfile, accessProfile)
  44. })
  45. describe('getMenuName', () => {
  46. test('get name', () => {
  47. expect(menuBuilder.getMenuName()).toEqual('TestableMenu')
  48. })
  49. })
  50. describe('createGroup', () => {
  51. test('simple group', () => {
  52. const label = 'my_menu'
  53. const icon = {name: 'my_icon'}
  54. const children = [{label: 'submenu', type: MENU_LINK_TYPE.INTERNAL, active: true}]
  55. const actions = [{label: 'action', type: MENU_LINK_TYPE.INTERNAL, active: true}]
  56. const result = menuBuilder.createGroup(label, icon, children, actions)
  57. expect(result).toEqual({label, icon, children, actions})
  58. })
  59. test('default values', () => {
  60. const result = menuBuilder.createGroup('my_menu')
  61. expect(result).toEqual(
  62. {label: 'my_menu', icon: undefined, children: [], actions: []}
  63. )
  64. })
  65. })
  66. describe('createItem', () => {
  67. test('simple item', () => {
  68. const label = 'my_menu'
  69. const icon = {name: 'my_icon'}
  70. const to = 'https://domain.com/foo/bar'
  71. const type = MENU_LINK_TYPE.EXTERNAL
  72. const result = menuBuilder.createItem(label, icon, to, type)
  73. expect(result).toEqual({ icon, label, to, type, active: false })
  74. })
  75. test('default values', () => {
  76. const result = menuBuilder.createItem('my_menu')
  77. expect(result).toEqual(
  78. {label: 'my_menu', icon: undefined, to: '', type: MENU_LINK_TYPE.INTERNAL, active: false}
  79. )
  80. })
  81. test('prepend https on external url', () => {
  82. const item = menuBuilder.createItem('my_menu', undefined, 'domain.com', MENU_LINK_TYPE.EXTERNAL)
  83. expect(item.to).toEqual('https://domain.com')
  84. })
  85. test('complete V1 links (server side)', () => {
  86. runtimeConfig.baseUrlAdminLegacy = 'https://admin.opentalent.fr'
  87. const item = menuBuilder.createItem('my_menu', undefined, '/my_page', MENU_LINK_TYPE.V1)
  88. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  89. })
  90. test('complete V1 links (client side)', () => {
  91. runtimeConfig.baseUrlAdminLegacy = ''
  92. // @ts-ignore
  93. runtimeConfig.public = {baseUrlAdminLegacy: 'https://admin.opentalent.fr'}
  94. const item = menuBuilder.createItem('my_menu', undefined, '/my_page', MENU_LINK_TYPE.V1)
  95. expect(item.to).toEqual('https://admin.opentalent.fr/#/my_page')
  96. })
  97. })
  98. describe('buildSubmenu', () => {
  99. test('should call given menu build method', () => {
  100. expect(menuBuilder.buildSubmenu(TestableAbstractMenuBuilder)).toEqual({ label: 'my_menu' })
  101. })
  102. })