abilityBuilder.test.ts 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. import { describe, test, expect } from 'vitest'
  2. import {MongoAbility} from "@casl/ability/dist/types/Ability";
  3. import {AbilitiesType, AccessProfile, organizationState} from "~/types/interfaces";
  4. import AbilityBuilder from "~/services/rights/abilityBuilder";
  5. import {ABILITIES} from "~/types/enum/enums";
  6. let ability: MongoAbility
  7. let accessProfile: AccessProfile
  8. let organizationProfile: organizationState
  9. let abilityBuilder: AbilityBuilder
  10. // Mock the content of the config yaml files
  11. // > This must be done in the global scope: https://vitest.dev/api/vi.html#vi-mock
  12. const doc = {
  13. abilities: {
  14. 'subject1': {
  15. action: ABILITIES.READ,
  16. conditions: [
  17. {
  18. 'function': 'fct1',
  19. 'parameters': ['param1'],
  20. 'expectedResult': true
  21. }
  22. ]
  23. },
  24. 'subject2': {
  25. action: ABILITIES.READ,
  26. conditions: {
  27. 'function': 'fct2',
  28. 'parameters': ['param2'],
  29. 'expectedResult': false
  30. }
  31. }
  32. }
  33. }
  34. vi.mock('yaml-import', async () => {
  35. return {
  36. default: { read: vi.fn((data: string) => doc) }
  37. }
  38. })
  39. beforeEach(() => {
  40. ability = vi.fn() as any as MongoAbility
  41. accessProfile = vi.fn() as any as AccessProfile
  42. organizationProfile = vi.fn() as any as organizationState
  43. abilityBuilder = new AbilityBuilder(ability, accessProfile, organizationProfile)
  44. })
  45. describe('buildAbilities', () => {
  46. test('base call', () => {
  47. const roleAbilities: Array<AbilitiesType> = [
  48. {action: ABILITIES.READ, subject: 'subject1'},
  49. {action: ABILITIES.READ, subject: 'subject2'}
  50. ]
  51. const configAbilities: Array<AbilitiesType> = [
  52. {action: ABILITIES.READ, subject: 'subject3'},
  53. {action: ABILITIES.READ, subject: 'subject4'}
  54. ]
  55. const allAbilities: Array<AbilitiesType> = roleAbilities.concat(configAbilities)
  56. abilityBuilder.buildAbilitiesFromRoles = vi.fn(() => roleAbilities)
  57. abilityBuilder.buildAbilitiesFromConfig = vi.fn(() => configAbilities)
  58. ability.update = vi.fn()
  59. const result = abilityBuilder.buildAbilities()
  60. expect(ability.update).toHaveBeenCalledTimes(2)
  61. expect(ability.update).toHaveBeenCalledWith(roleAbilities)
  62. expect(ability.update).toHaveBeenCalledWith(allAbilities)
  63. expect(abilityBuilder.buildAbilitiesFromRoles).toHaveBeenCalledOnce()
  64. expect(abilityBuilder.buildAbilitiesFromConfig).toHaveBeenCalledOnce()
  65. expect(result).toEqual(allAbilities)
  66. })
  67. })
  68. describe('buildAbilitiesFromRoles', () => {
  69. test('calls roleUtils', () => {
  70. accessProfile.roles = ['ROLE_EVENTS_VIEW', 'ROLE_COURSES', 'ROLE_TEACHER_CORE', 'ROLE_OTHER']
  71. const expected = [
  72. { subject: 'events', action: 'read' },
  73. { subject: 'courses', action: 'manage' },
  74. { subject: 'other', action: 'manage' },
  75. ]
  76. expect(abilityBuilder.buildAbilitiesFromRoles()).toEqual(expected)
  77. })
  78. })
  79. describe('buildAbilitiesFromConfig', () => {
  80. test('calls roleUtils', () => {
  81. abilityBuilder.hasConfigAbility = vi.fn(() => true)
  82. expect(abilityBuilder.buildAbilitiesFromConfig()).toEqual([
  83. { action: 'read', subject: 'subject1' },
  84. { action: 'read', subject: 'subject2' },
  85. ])
  86. })
  87. })
  88. describe('hasConfigAbility', () => {
  89. beforeEach(() => {
  90. accessProfile.isGuardian = true
  91. // @ts-ignore
  92. organizationProfile.isSchool = true
  93. // @ts-ignore
  94. organizationProfile.isCmf = false
  95. })
  96. test('fulfill all conditions', () => {
  97. const conditions = [
  98. {'function': 'accessHasAnyProfile', parameters: ['guardian', 'payer']},
  99. {'function': 'organizationIsSchool'},
  100. ]
  101. expect(abilityBuilder.hasConfigAbility(conditions)).toBeTruthy()
  102. })
  103. test('fulfill at least one condition', () => {
  104. const conditions = [
  105. {'function': 'accessHasAnyProfile', parameters: ['guardian', 'payer']},
  106. {'function': 'organizationIsCmf'},
  107. ]
  108. expect(abilityBuilder.hasConfigAbility(conditions)).toBeFalsy()
  109. })
  110. test('fulfill none of the conditions', () => {
  111. const conditions = [
  112. {'function': 'organizationIsCmf'},
  113. ]
  114. expect(abilityBuilder.hasConfigAbility(conditions)).toBeFalsy()
  115. })
  116. })
  117. describe('execAndValidateCondition', () => {
  118. test('accessHasAllRoleAbilities', () => {
  119. ability.can = vi.fn((action: string, subject: string) => {
  120. return action === 'read' && (subject === 'subject1' || subject === 'subject2')
  121. })
  122. expect(
  123. // @ts-ignore
  124. abilityBuilder.execAndValidateCondition(
  125. {
  126. 'function': 'accessHasAllRoleAbilities',
  127. parameters: [
  128. {action: ABILITIES.READ, subject: 'subject1'},
  129. {action: ABILITIES.READ, subject: 'subject2'},
  130. ]
  131. })
  132. ).toBeTruthy()
  133. expect(
  134. // @ts-ignore
  135. abilityBuilder.execAndValidateCondition(
  136. {
  137. 'function': 'accessHasAllRoleAbilities',
  138. parameters: [
  139. {action: ABILITIES.READ, subject: 'subject1'},
  140. {action: ABILITIES.READ, subject: 'subject3'}
  141. ]
  142. })
  143. ).toBeFalsy()
  144. })
  145. test('accessHasAnyRoleAbility', () => {
  146. ability.can = vi.fn((action: string, subject: string) => {
  147. return action === 'read' && subject === 'subject1'
  148. })
  149. expect(
  150. // @ts-ignore
  151. abilityBuilder.execAndValidateCondition(
  152. {
  153. 'function': 'accessHasAnyRoleAbility',
  154. parameters: [
  155. {action: ABILITIES.READ, subject: 'subject1'},
  156. {action: ABILITIES.READ, subject: 'subject2'},
  157. ]
  158. })
  159. ).toBeTruthy()
  160. expect(
  161. // @ts-ignore
  162. abilityBuilder.execAndValidateCondition(
  163. {'function': 'accessHasAnyRoleAbility', parameters: [{action: ABILITIES.READ, subject: 'subject2'}]})
  164. ).toBeFalsy()
  165. })
  166. test('accessHasAnyProfile', () => {
  167. accessProfile.isMember = true
  168. accessProfile.isGuardian = true
  169. accessProfile.isPayer = true
  170. expect(
  171. // @ts-ignore
  172. abilityBuilder.execAndValidateCondition(
  173. {'function': 'accessHasAnyProfile', parameters: ['guardian', 'payer']}
  174. )
  175. ).toBeTruthy()
  176. expect(
  177. // @ts-ignore
  178. abilityBuilder.execAndValidateCondition(
  179. {'function': 'accessHasAnyProfile', parameters: ['guardian', 'caMember']}
  180. )
  181. ).toBeTruthy()
  182. expect(
  183. // @ts-ignore
  184. abilityBuilder.execAndValidateCondition(
  185. {'function': 'accessHasAnyProfile', parameters: ['caMember']}
  186. )
  187. ).toBeFalsy()
  188. })
  189. test('organizationHasAllModules', () => {
  190. // @ts-ignore
  191. organizationProfile.hasModule = vi.fn(
  192. (module: string) => module === 'module1' || module === 'module2'
  193. )
  194. expect(
  195. // @ts-ignore
  196. abilityBuilder.execAndValidateCondition(
  197. {'function': 'organizationHasAllModules', parameters: ['module1', 'module2']}
  198. )
  199. ).toBeTruthy()
  200. expect(
  201. // @ts-ignore
  202. abilityBuilder.execAndValidateCondition(
  203. {'function': 'organizationHasAllModules', parameters: ['module1', 'module3']}
  204. )
  205. ).toBeFalsy()
  206. expect(
  207. // @ts-ignore
  208. abilityBuilder.execAndValidateCondition(
  209. {'function': 'organizationHasAllModules', parameters: ['module3']}
  210. )
  211. ).toBeFalsy()
  212. })
  213. test('organizationHasAnyModule', () => {
  214. // @ts-ignore
  215. organizationProfile.hasModule = vi.fn(
  216. (module: string) => module === 'module1' || module === 'module2'
  217. )
  218. expect(
  219. // @ts-ignore
  220. abilityBuilder.execAndValidateCondition(
  221. {'function': 'organizationHasAnyModule', parameters: ['module1', 'module2']}
  222. )
  223. ).toBeTruthy()
  224. expect(
  225. // @ts-ignore
  226. abilityBuilder.execAndValidateCondition(
  227. {'function': 'organizationHasAnyModule', parameters: ['module1', 'module3']}
  228. )
  229. ).toBeTruthy()
  230. expect(
  231. // @ts-ignore
  232. abilityBuilder.execAndValidateCondition(
  233. {'function': 'organizationHasAnyModule', parameters: ['module3']}
  234. )
  235. ).toBeFalsy()
  236. })
  237. test('organizationHasAnyModule', () => {
  238. // @ts-ignore
  239. accessProfile.isAdminAccount = true
  240. // @ts-ignore
  241. expect(abilityBuilder.execAndValidateCondition({'function': 'accessIsAdminAccount'})).toBeTruthy()
  242. // @ts-ignore
  243. accessProfile.isAdminAccount = false
  244. // @ts-ignore
  245. expect(abilityBuilder.execAndValidateCondition({'function': 'accessIsAdminAccount'})).toBeFalsy()
  246. })
  247. test('organizationIsSchool', () => {
  248. // @ts-ignore
  249. organizationProfile.isSchool = true
  250. // @ts-ignore
  251. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsSchool'})).toBeTruthy()
  252. // @ts-ignore
  253. organizationProfile.isSchool = false
  254. // @ts-ignore
  255. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsSchool'})).toBeFalsy()
  256. })
  257. test('organizationIsArtist', () => {
  258. // @ts-ignore
  259. organizationProfile.isArtist = true
  260. // @ts-ignore
  261. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsArtist'})).toBeTruthy()
  262. // @ts-ignore
  263. organizationProfile.isArtist = false
  264. // @ts-ignore
  265. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsArtist'})).toBeFalsy()
  266. })
  267. test('organizationIsManagerProduct', () => {
  268. // @ts-ignore
  269. organizationProfile.isManagerProduct = true
  270. // @ts-ignore
  271. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsManagerProduct'})).toBeTruthy()
  272. // @ts-ignore
  273. organizationProfile.isManagerProduct = false
  274. // @ts-ignore
  275. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsManagerProduct'})).toBeFalsy()
  276. })
  277. test('organizationHasChildren', () => {
  278. // @ts-ignore
  279. organizationProfile.hasChildren = true
  280. // @ts-ignore
  281. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationHasChildren'})).toBeTruthy()
  282. // @ts-ignore
  283. organizationProfile.hasChildren = false
  284. // @ts-ignore
  285. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationHasChildren'})).toBeFalsy()
  286. })
  287. test('organizationIsAssociation', () => {
  288. // @ts-ignore
  289. organizationProfile.isAssociation = true
  290. // @ts-ignore
  291. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsAssociation'})).toBeTruthy()
  292. // @ts-ignore
  293. organizationProfile.isAssociation = false
  294. // @ts-ignore
  295. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsAssociation'})).toBeFalsy()
  296. })
  297. test('organizationIsShowAdherentList', () => {
  298. // @ts-ignore
  299. organizationProfile.isShowAdherentList = true
  300. // @ts-ignore
  301. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsShowAdherentList'})).toBeTruthy()
  302. // @ts-ignore
  303. organizationProfile.isShowAdherentList = false
  304. // @ts-ignore
  305. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsShowAdherentList'})).toBeFalsy()
  306. })
  307. test('organizationIsCmf', () => {
  308. // @ts-ignore
  309. organizationProfile.isCmf = true
  310. // @ts-ignore
  311. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsCmf'})).toBeTruthy()
  312. // @ts-ignore
  313. organizationProfile.isCmf = false
  314. // @ts-ignore
  315. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationIsCmf'})).toBeFalsy()
  316. })
  317. test('organizationHasWebsite', () => {
  318. // @ts-ignore
  319. organizationProfile.getWebsite = true
  320. // @ts-ignore
  321. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationHasWebsite'})).toBeTruthy()
  322. // @ts-ignore
  323. organizationProfile.getWebsite = false
  324. // @ts-ignore
  325. expect(abilityBuilder.execAndValidateCondition({'function': 'organizationHasWebsite'})).toBeFalsy()
  326. })
  327. test('with expected result', () => {
  328. // @ts-ignore
  329. organizationProfile.getWebsite = true
  330. expect(
  331. // @ts-ignore
  332. abilityBuilder.execAndValidateCondition({'function': 'organizationHasWebsite', expectedResult: true})
  333. ).toBeTruthy()
  334. expect(
  335. // @ts-ignore
  336. abilityBuilder.execAndValidateCondition({'function': 'organizationHasWebsite', expectedResult: 'abc'})
  337. ).toBeFalsy()
  338. })
  339. test('invalid function', () => {
  340. expect(
  341. // @ts-ignore
  342. () => abilityBuilder.execAndValidateCondition({'function': 'invalid'})
  343. ).toThrowError('unknown condition function : invalid')
  344. })
  345. })
  346. describe('hasRoleAbility', () => {
  347. beforeEach(() => {
  348. ability.can = vi.fn((action: string, subject: string) => {
  349. return action === 'read' && subject === 'a_subject'
  350. })
  351. })
  352. test('owned ability', () => {
  353. expect(abilityBuilder.hasRoleAbility({action: ABILITIES.READ, subject: 'a_subject'})).toBeTruthy()
  354. })
  355. test('not owned ability', () => {
  356. expect(abilityBuilder.hasRoleAbility({action: ABILITIES.READ, subject: 'other_subject'})).toBeFalsy()
  357. })
  358. })
  359. describe('hasAllRoleAbilities', () => {
  360. beforeEach(() => {
  361. ability.can = vi.fn((action: string, subject: string) => {
  362. return action === 'read' && (subject === 'subject1' || subject === 'subject2')
  363. })
  364. })
  365. test('own all abilities', () => {
  366. const result = abilityBuilder.hasAllRoleAbilities(
  367. [
  368. {action: ABILITIES.READ, subject: 'subject1'},
  369. {action: ABILITIES.READ, subject: 'subject2'},
  370. ]
  371. )
  372. expect(result).toBeTruthy()
  373. })
  374. test('own at least one ability', () => {
  375. const result = abilityBuilder.hasAllRoleAbilities(
  376. [
  377. {action: ABILITIES.READ, subject: 'subject1'},
  378. {action: ABILITIES.READ, subject: 'subject3'},
  379. ]
  380. )
  381. expect(result).toBeFalsy()
  382. })
  383. test('own none of the abilities', () => {
  384. const result = abilityBuilder.hasAllRoleAbilities(
  385. [
  386. {action: ABILITIES.READ, subject: 'subject3'},
  387. {action: ABILITIES.READ, subject: 'subject4'},
  388. ]
  389. )
  390. expect(result).toBeFalsy()
  391. })
  392. })
  393. describe('hasAnyRoleAbility', () => {
  394. beforeEach(() => {
  395. ability.can = vi.fn((action: string, subject: string) => {
  396. return action === 'read' && (subject === 'subject1' || subject === 'subject2')
  397. })
  398. })
  399. test('has all abilities', () => {
  400. const result = abilityBuilder.hasAnyRoleAbility(
  401. [
  402. {action: ABILITIES.READ, subject: 'subject1'},
  403. {action: ABILITIES.READ, subject: 'subject2'},
  404. ]
  405. )
  406. expect(result).toBeTruthy()
  407. })
  408. test('has at least one ability', () => {
  409. const result = abilityBuilder.hasAnyRoleAbility(
  410. [
  411. {action: ABILITIES.READ, subject: 'subject1'},
  412. {action: ABILITIES.READ, subject: 'subject3'},
  413. ]
  414. )
  415. expect(result).toBeTruthy()
  416. })
  417. test('any none of the abilites', () => {
  418. const result = abilityBuilder.hasAnyRoleAbility(
  419. [
  420. {action: ABILITIES.READ, subject: 'subject3'},
  421. {action: ABILITIES.READ, subject: 'subject4'},
  422. ]
  423. )
  424. expect(result).toBeFalsy()
  425. })
  426. })
  427. describe('hasProfile', () => {
  428. test('owned profiles', () => {
  429. accessProfile.isAdmin = true
  430. accessProfile.isAdministratifManager = true
  431. accessProfile.isPedagogicManager = true
  432. accessProfile.isFinancialManager = true
  433. accessProfile.isCaMember = true
  434. accessProfile.isStudent = true
  435. accessProfile.isTeacher = true
  436. accessProfile.isMember = true
  437. accessProfile.isOther = true
  438. accessProfile.isGuardian = true
  439. accessProfile.isPayer = true
  440. expect(abilityBuilder.hasProfile('admin')).toBeTruthy()
  441. expect(abilityBuilder.hasProfile('administratifManager')).toBeTruthy()
  442. expect(abilityBuilder.hasProfile('pedagogicManager')).toBeTruthy()
  443. expect(abilityBuilder.hasProfile('financialManager')).toBeTruthy()
  444. expect(abilityBuilder.hasProfile('caMember')).toBeTruthy()
  445. expect(abilityBuilder.hasProfile('student')).toBeTruthy()
  446. expect(abilityBuilder.hasProfile('teacher')).toBeTruthy()
  447. expect(abilityBuilder.hasProfile('member')).toBeTruthy()
  448. expect(abilityBuilder.hasProfile('other')).toBeTruthy()
  449. expect(abilityBuilder.hasProfile('guardian')).toBeTruthy()
  450. expect(abilityBuilder.hasProfile('payor')).toBeTruthy()
  451. })
  452. test('not owned profiles', () => {
  453. accessProfile.isAdmin = false
  454. accessProfile.isAdministratifManager = false
  455. accessProfile.isPedagogicManager = false
  456. accessProfile.isFinancialManager = false
  457. accessProfile.isCaMember = false
  458. accessProfile.isStudent = false
  459. accessProfile.isTeacher = false
  460. accessProfile.isMember = false
  461. accessProfile.isOther = false
  462. accessProfile.isGuardian = false
  463. accessProfile.isPayer = false
  464. expect(abilityBuilder.hasProfile('admin')).toBeFalsy()
  465. expect(abilityBuilder.hasProfile('administratifManager')).toBeFalsy()
  466. expect(abilityBuilder.hasProfile('pedagogicManager')).toBeFalsy()
  467. expect(abilityBuilder.hasProfile('financialManager')).toBeFalsy()
  468. expect(abilityBuilder.hasProfile('caMember')).toBeFalsy()
  469. expect(abilityBuilder.hasProfile('student')).toBeFalsy()
  470. expect(abilityBuilder.hasProfile('teacher')).toBeFalsy()
  471. expect(abilityBuilder.hasProfile('member')).toBeFalsy()
  472. expect(abilityBuilder.hasProfile('other')).toBeFalsy()
  473. expect(abilityBuilder.hasProfile('guardian')).toBeFalsy()
  474. expect(abilityBuilder.hasProfile('payor')).toBeFalsy()
  475. })
  476. })
  477. describe('hasAnyProfile', () => {
  478. beforeEach(() => {
  479. accessProfile.isMember = true
  480. accessProfile.isGuardian = true
  481. accessProfile.isPayer = true
  482. })
  483. test('own all profiles', () => {
  484. expect(abilityBuilder.hasAnyProfile(['member', 'guardian', 'payor'])).toBeTruthy()
  485. })
  486. test('own at least one profile', () => {
  487. expect(abilityBuilder.hasAnyProfile(['member', 'caMember'])).toBeTruthy()
  488. })
  489. test('own none of the profiles', () => {
  490. expect(abilityBuilder.hasAnyProfile(['caMember', 'isFinancialManager'])).toBeFalsy()
  491. })
  492. })
  493. describe('hasAllProfiles', () => {
  494. beforeEach(() => {
  495. accessProfile.isMember = true
  496. accessProfile.isGuardian = true
  497. accessProfile.isPayer = true
  498. })
  499. test('own all profiles', () => {
  500. expect(abilityBuilder.hasAllProfiles(['member', 'guardian', 'payor'])).toBeTruthy()
  501. })
  502. test('own only one of the profiles', () => {
  503. expect(abilityBuilder.hasAllProfiles(['member', 'caMember'])).toBeFalsy()
  504. })
  505. test('own none of the profiles', () => {
  506. expect(abilityBuilder.hasAllProfiles(['caMember', 'isFinancialManager'])).toBeFalsy()
  507. })
  508. })
  509. describe('hasRole', () => {
  510. beforeEach(() => {
  511. // @ts-ignore
  512. accessProfile.hasRole = vi.fn((role: string) => role === 'foo')
  513. })
  514. test('has role', () => {
  515. expect(abilityBuilder.hasRole('foo')).toBeTruthy()
  516. })
  517. test('has not role', () => {
  518. expect(abilityBuilder.hasRole('bar')).toBeFalsy()
  519. })
  520. })
  521. describe('hasAnyRole', () => {
  522. beforeEach(() => {
  523. // @ts-ignore
  524. accessProfile.hasRole = vi.fn((role: string) => role === 'role1' || role === 'role2')
  525. })
  526. test('own all roles', () => {
  527. expect(abilityBuilder.hasAnyRole(['role1', 'role2'])).toBeTruthy()
  528. })
  529. test('own at least one role', () => {
  530. expect(abilityBuilder.hasAnyRole(['role1', 'role3'])).toBeTruthy()
  531. })
  532. test('own none of the roles', () => {
  533. expect(abilityBuilder.hasAnyRole(['role3'])).toBeFalsy()
  534. })
  535. })
  536. describe('hasAllRoles', () => {
  537. beforeEach(() => {
  538. // @ts-ignore
  539. accessProfile.hasRole = vi.fn((role: string) => role === 'role1' || role === 'role2')
  540. })
  541. test('own all roles', () => {
  542. expect(abilityBuilder.hasAllRoles(['role1', 'role2'])).toBeTruthy()
  543. })
  544. test('own at least one role', () => {
  545. expect(abilityBuilder.hasAllRoles(['role1', 'role3'])).toBeFalsy()
  546. })
  547. test('own none of the roles', () => {
  548. expect(abilityBuilder.hasAllRoles(['role3'])).toBeFalsy()
  549. })
  550. })
  551. describe('hasModule', () => {
  552. beforeEach(() => {
  553. // @ts-ignore
  554. organizationProfile.hasModule = vi.fn((module: string) => module === 'foo')
  555. })
  556. test('has module', () => {
  557. expect(abilityBuilder.hasModule('foo')).toBeTruthy()
  558. })
  559. test('has not module', () => {
  560. expect(abilityBuilder.hasModule('bar')).toBeFalsy()
  561. })
  562. })
  563. describe('hasAnyModule', () => {
  564. beforeEach(() => {
  565. // @ts-ignore
  566. organizationProfile.hasModule = vi.fn((Module: string) => Module === 'Module1' || Module === 'Module2')
  567. })
  568. test('own all modules', () => {
  569. expect(abilityBuilder.hasAnyModule(['Module1', 'Module2'])).toBeTruthy()
  570. })
  571. test('own at least one module', () => {
  572. expect(abilityBuilder.hasAnyModule(['Module1', 'Module3'])).toBeTruthy()
  573. })
  574. test('own none of the modules', () => {
  575. expect(abilityBuilder.hasAnyModule(['Module3'])).toBeFalsy()
  576. })
  577. })
  578. describe('hasAllModules', () => {
  579. beforeEach(() => {
  580. // @ts-ignore
  581. organizationProfile.hasModule = vi.fn((Module: string) => Module === 'Module1' || Module === 'Module2')
  582. })
  583. test('own all modules', () => {
  584. expect(abilityBuilder.hasAllModules(['Module1', 'Module2'])).toBeTruthy()
  585. })
  586. test('own at least one module', () => {
  587. expect(abilityBuilder.hasAllModules(['Module1', 'Module3'])).toBeFalsy()
  588. })
  589. test('own none of the modules', () => {
  590. expect(abilityBuilder.hasAllModules(['Module3'])).toBeFalsy()
  591. })
  592. })