configurationMenuBuilder.test.ts 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. import { describe, test, vi, expect, beforeEach } from 'vitest'
  2. import type { RuntimeConfig } from '@nuxt/schema'
  3. import type { AnyAbility } from '@casl/ability/dist/types'
  4. import type { Router } from 'vue-router'
  5. import type { AccessProfile, organizationState } from '~/types/interfaces'
  6. import ConfigurationMenuBuilder from '~/services/layout/menuBuilder/configurationMenuBuilder'
  7. import type { MenuGroup } from '~/types/layout'
  8. import { MENU_LINK_TYPE } from '~/types/enum/layout'
  9. let runtimeConfig: RuntimeConfig
  10. let ability: AnyAbility
  11. let organizationProfile: organizationState
  12. let accessProfile: AccessProfile
  13. let menuBuilder: ConfigurationMenuBuilder
  14. let router: Router
  15. beforeEach(() => {
  16. runtimeConfig = vi.fn() as any as RuntimeConfig
  17. ability = vi.fn() as any as AnyAbility
  18. organizationProfile = vi.fn() as any as organizationState
  19. accessProfile = vi.fn() as any as AccessProfile
  20. // @ts-ignore
  21. router = vi.fn() as Router
  22. runtimeConfig.baseUrlAdminLegacy = 'https://mydomain.com/'
  23. router.resolve = vi.fn(() => {
  24. return 'some_route'
  25. })
  26. menuBuilder = new ConfigurationMenuBuilder(
  27. runtimeConfig,
  28. ability,
  29. organizationProfile,
  30. accessProfile,
  31. router,
  32. )
  33. })
  34. describe('getMenuName', () => {
  35. test('validate name', () => {
  36. expect(menuBuilder.getMenuName()).toEqual('Configuration')
  37. })
  38. })
  39. describe('build', () => {
  40. test('has all items', () => {
  41. ability.can = vi.fn(() => true)
  42. // Should return a MenuGroup
  43. const result = menuBuilder.build() as MenuGroup
  44. expect(result.label).toEqual('configuration')
  45. expect(result.icon).toEqual({ name: 'fas fa-cogs' })
  46. // @ts-ignore
  47. expect(result.children.length).toEqual(17)
  48. })
  49. test('has no items', () => {
  50. ability.can = vi.fn(() => false)
  51. expect(menuBuilder.build()).toEqual(null)
  52. })
  53. test('has only rights for menu organization_page', () => {
  54. ability.can = vi.fn(
  55. (action: string, subject: string) =>
  56. action === 'display' && subject === 'organization_page',
  57. )
  58. organizationProfile.id = 123
  59. const result = menuBuilder.build()
  60. expect(result).toHaveProperty('label', 'organization_page')
  61. expect(result).toHaveProperty('icon', undefined)
  62. expect(result).toHaveProperty(
  63. 'to',
  64. 'https://mydomain.com/#/main/organizations/123/dashboard',
  65. )
  66. expect(result).toHaveProperty('target', '_self')
  67. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  68. expect(result).toHaveProperty('active', false)
  69. expect(result).toHaveProperty('endOfSubsection', false)
  70. })
  71. test('has only rights for menu cmf_licence_generate', () => {
  72. ability.can = vi.fn(
  73. (action: string, subject: string) =>
  74. action === 'display' && subject === 'cmf_licence_page',
  75. )
  76. const result = menuBuilder.build()
  77. expect(result).toHaveProperty('label', 'cmf_licence_generate')
  78. expect(result).toHaveProperty('icon', undefined)
  79. expect(result).toHaveProperty(
  80. 'to',
  81. 'https://mydomain.com/#/licence_cmf/organization',
  82. )
  83. expect(result).toHaveProperty('target', '_self')
  84. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  85. expect(result).toHaveProperty('active', false)
  86. expect(result).toHaveProperty('endOfSubsection', false)
  87. //
  88. // expect(menuBuilder.build()).toEqual({
  89. // label: 'cmf_licence_generate',
  90. // icon: undefined,
  91. // to: '/cmf_licence_structure',
  92. // type: MENU_LINK_TYPE.INTERNAL,
  93. // active: false,
  94. // })
  95. })
  96. test('has only rights for menu parameters', () => {
  97. ability.can = vi.fn(
  98. (action: string, subject: string) =>
  99. action === 'display' && subject === 'parameters_page',
  100. )
  101. menuBuilder.organizationProfile.id = 123
  102. const result = menuBuilder.build()
  103. expect(result).toHaveProperty('label', 'parameters_page')
  104. expect(result).toHaveProperty('icon', undefined)
  105. expect(result).toHaveProperty('type', MENU_LINK_TYPE.INTERNAL)
  106. expect(result).toHaveProperty('active', false)
  107. expect(result).toHaveProperty('endOfSubsection', true)
  108. // expect(menuBuilder.build()).toEqual({
  109. // label: 'parameters',
  110. // icon: undefined,
  111. // to: '/parameters',
  112. // type: MENU_LINK_TYPE.INTERNAL,
  113. // active: false,
  114. // })
  115. })
  116. test('has only rights for menu place', () => {
  117. ability.can = vi.fn(
  118. (action: string, subject: string) =>
  119. action === 'display' && subject === 'place_page',
  120. )
  121. const result = menuBuilder.build()
  122. expect(result).toHaveProperty('label', 'places')
  123. expect(result).toHaveProperty('icon', undefined)
  124. expect(result).toHaveProperty('to', 'https://mydomain.com/#/places/list/')
  125. expect(result).toHaveProperty('target', '_self')
  126. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  127. expect(result).toHaveProperty('active', false)
  128. expect(result).toHaveProperty('endOfSubsection', false)
  129. })
  130. test('has only rights for menu education', () => {
  131. ability.can = vi.fn(
  132. (action: string, subject: string) =>
  133. action === 'display' && subject === 'education_page',
  134. )
  135. const result = menuBuilder.build()
  136. expect(result).toHaveProperty('label', 'education')
  137. expect(result).toHaveProperty('icon', undefined)
  138. expect(result).toHaveProperty(
  139. 'to',
  140. 'https://mydomain.com/#/educations/list/',
  141. )
  142. expect(result).toHaveProperty('target', '_self')
  143. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  144. expect(result).toHaveProperty('active', false)
  145. expect(result).toHaveProperty('endOfSubsection', false)
  146. })
  147. test('has only rights for menu tag', () => {
  148. ability.can = vi.fn(
  149. (action: string, subject: string) =>
  150. action === 'display' && subject === 'tag_page',
  151. )
  152. const result = menuBuilder.build()
  153. expect(result).toHaveProperty('label', 'tags')
  154. expect(result).toHaveProperty('icon', undefined)
  155. expect(result).toHaveProperty('to', 'https://mydomain.com/#/taggs/list/')
  156. expect(result).toHaveProperty('target', '_self')
  157. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  158. expect(result).toHaveProperty('active', false)
  159. expect(result).toHaveProperty('endOfSubsection', false)
  160. })
  161. test('has only rights for menu activities', () => {
  162. ability.can = vi.fn(
  163. (action: string, subject: string) =>
  164. action === 'display' && subject === 'activities_page',
  165. )
  166. const result = menuBuilder.build()
  167. expect(result).toHaveProperty('label', 'activities')
  168. expect(result).toHaveProperty('icon', undefined)
  169. expect(result).toHaveProperty(
  170. 'to',
  171. 'https://mydomain.com/#/activities/list/',
  172. )
  173. expect(result).toHaveProperty('target', '_self')
  174. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  175. expect(result).toHaveProperty('active', false)
  176. expect(result).toHaveProperty('endOfSubsection', false)
  177. })
  178. test('has only rights for menu course_duplication', () => {
  179. ability.can = vi.fn(
  180. (action: string, subject: string) =>
  181. action === 'display' && subject === 'course_duplication_page',
  182. )
  183. const result = menuBuilder.build()
  184. expect(result).toHaveProperty('label', 'course_duplication')
  185. expect(result).toHaveProperty('icon', undefined)
  186. expect(result).toHaveProperty(
  187. 'to',
  188. 'https://mydomain.com/#/duplicate_courses',
  189. )
  190. expect(result).toHaveProperty('target', '_self')
  191. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  192. expect(result).toHaveProperty('active', false)
  193. expect(result).toHaveProperty('endOfSubsection', true)
  194. })
  195. test('has only rights for menu import', () => {
  196. ability.can = vi.fn(
  197. (action: string, subject: string) =>
  198. action === 'display' && subject === 'import_page',
  199. )
  200. const result = menuBuilder.build()
  201. expect(result).toHaveProperty('label', 'import')
  202. expect(result).toHaveProperty('icon', undefined)
  203. expect(result).toHaveProperty('to', 'https://mydomain.com/#/import/all')
  204. expect(result).toHaveProperty('target', '_self')
  205. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  206. expect(result).toHaveProperty('active', false)
  207. expect(result).toHaveProperty('endOfSubsection', false)
  208. })
  209. test('has only rights for menu parcours', () => {
  210. ability.can = vi.fn(
  211. (action: string, subject: string) =>
  212. action === 'display' && subject === 'parcours_page',
  213. )
  214. const result = menuBuilder.build()
  215. expect(result).toHaveProperty('label', 'parcours')
  216. expect(result).toHaveProperty('icon', undefined)
  217. expect(result).toHaveProperty(
  218. 'to',
  219. 'https://mydomain.com/#/family_quotient_models/list/',
  220. )
  221. expect(result).toHaveProperty('target', '_self')
  222. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  223. expect(result).toHaveProperty('active', false)
  224. expect(result).toHaveProperty('endOfSubsection', false)
  225. })
  226. test('has only rights for menu family_quotient_models', () => {
  227. ability.can = vi.fn(
  228. (action: string, subject: string) =>
  229. action === 'display' && subject === 'family_quotient_models_page',
  230. )
  231. const result = menuBuilder.build()
  232. expect(result).toHaveProperty('label', 'family_quotient_models')
  233. expect(result).toHaveProperty('icon', undefined)
  234. expect(result).toHaveProperty(
  235. 'to',
  236. 'https://mydomain.com/#/family_quotient_models/list/',
  237. )
  238. expect(result).toHaveProperty('target', '_self')
  239. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  240. expect(result).toHaveProperty('active', false)
  241. expect(result).toHaveProperty('endOfSubsection', false)
  242. })
  243. test('has only rights for menu billing_schedules', () => {
  244. ability.can = vi.fn(
  245. (action: string, subject: string) =>
  246. action === 'display' && subject === 'billing_schedules_settings_page',
  247. )
  248. const result = menuBuilder.build()
  249. expect(result).toHaveProperty('label', 'billing_schedules')
  250. expect(result).toHaveProperty('icon', undefined)
  251. expect(result).toHaveProperty(
  252. 'to',
  253. 'https://mydomain.com/#/bill_schedules/list/',
  254. )
  255. expect(result).toHaveProperty('target', '_self')
  256. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  257. expect(result).toHaveProperty('active', false)
  258. expect(result).toHaveProperty('endOfSubsection', true)
  259. })
  260. test('has only rights for menu pseudonymization', () => {
  261. ability.can = vi.fn(
  262. (action: string, subject: string) =>
  263. action === 'display' && subject === 'pseudonymization_page',
  264. )
  265. const result = menuBuilder.build()
  266. expect(result).toHaveProperty('label', 'pseudonymization')
  267. expect(result).toHaveProperty('icon', undefined)
  268. expect(result).toHaveProperty(
  269. 'to',
  270. 'https://mydomain.com/#/pseudonymizationList/list/',
  271. )
  272. expect(result).toHaveProperty('target', '_self')
  273. expect(result).toHaveProperty('type', MENU_LINK_TYPE.V1)
  274. expect(result).toHaveProperty('active', false)
  275. expect(result).toHaveProperty('endOfSubsection', false)
  276. })
  277. })