|
@@ -1,8 +1,9 @@
|
|
|
import { describe, test, it, expect } from 'vitest'
|
|
import { describe, test, it, expect } from 'vitest'
|
|
|
import {MongoAbility} from "@casl/ability/dist/types/Ability";
|
|
import {MongoAbility} from "@casl/ability/dist/types/Ability";
|
|
|
-import {AccessProfile, organizationState} from "~/types/interfaces";
|
|
|
|
|
|
|
+import {AbilitiesType, AccessProfile, organizationState} from "~/types/interfaces";
|
|
|
import AbilityBuilder from "~/services/rights/abilityBuilder";
|
|
import AbilityBuilder from "~/services/rights/abilityBuilder";
|
|
|
import {ABILITIES} from "~/types/enum/enums";
|
|
import {ABILITIES} from "~/types/enum/enums";
|
|
|
|
|
+import yaml from "yaml-import";
|
|
|
|
|
|
|
|
let ability: MongoAbility
|
|
let ability: MongoAbility
|
|
|
let accessProfile: AccessProfile
|
|
let accessProfile: AccessProfile
|
|
@@ -13,6 +14,35 @@ class TestableAbilityBuilder extends AbilityBuilder {
|
|
|
public execAndValidateCondition(condition: any, subject: string = '') { return super.execAndValidateCondition(condition, subject) }
|
|
public execAndValidateCondition(condition: any, subject: string = '') { return super.execAndValidateCondition(condition, subject) }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// Mock the content of the config yaml files
|
|
|
|
|
+// > This must be done in the global scope: https://vitest.dev/api/vi.html#vi-mock
|
|
|
|
|
+const doc = {
|
|
|
|
|
+ abilities: {
|
|
|
|
|
+ 'subject1': {
|
|
|
|
|
+ action: ABILITIES.READ,
|
|
|
|
|
+ conditions: [
|
|
|
|
|
+ {
|
|
|
|
|
+ 'function': 'fct1',
|
|
|
|
|
+ 'parameters': ['param1'],
|
|
|
|
|
+ 'expectedResult': true
|
|
|
|
|
+ }
|
|
|
|
|
+ ]
|
|
|
|
|
+ },
|
|
|
|
|
+ 'subject2': {
|
|
|
|
|
+ action: ABILITIES.READ,
|
|
|
|
|
+ conditions: {
|
|
|
|
|
+ 'function': 'fct2',
|
|
|
|
|
+ 'parameters': ['param2'],
|
|
|
|
|
+ 'expectedResult': false
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+vi.mock('yaml-import', async () => {
|
|
|
|
|
+ return {
|
|
|
|
|
+ default: { read: vi.fn((data: string) => doc) }
|
|
|
|
|
+ }
|
|
|
|
|
+})
|
|
|
|
|
|
|
|
beforeEach(() => {
|
|
beforeEach(() => {
|
|
|
ability = vi.fn() as any as MongoAbility
|
|
ability = vi.fn() as any as MongoAbility
|
|
@@ -23,13 +53,60 @@ beforeEach(() => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
describe('buildAbilities', () => {
|
|
describe('buildAbilities', () => {
|
|
|
- // test('base call', () => {
|
|
|
|
|
- // abilityBuilder.buildAbilities()
|
|
|
|
|
- //
|
|
|
|
|
- // expect(ability.update).toHaveBeenCalledTimes(1)
|
|
|
|
|
- // // @ts-ignore
|
|
|
|
|
- // expect(organizationProfile.$onAction).toHaveBeenCalledTimes(1)
|
|
|
|
|
- // })
|
|
|
|
|
|
|
+ test('base call', () => {
|
|
|
|
|
+
|
|
|
|
|
+ const roleAbilities: Array<AbilitiesType> = [
|
|
|
|
|
+ {action: ABILITIES.READ, subject: 'subject1'},
|
|
|
|
|
+ {action: ABILITIES.READ, subject: 'subject2'}
|
|
|
|
|
+ ]
|
|
|
|
|
+ const configAbilities: Array<AbilitiesType> = [
|
|
|
|
|
+ {action: ABILITIES.READ, subject: 'subject3'},
|
|
|
|
|
+ {action: ABILITIES.READ, subject: 'subject4'}
|
|
|
|
|
+ ]
|
|
|
|
|
+ const allAbilities: Array<AbilitiesType> = roleAbilities.concat(configAbilities)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ abilityBuilder.buildAbilitiesFromRoles = vi.fn(() => roleAbilities)
|
|
|
|
|
+ abilityBuilder.buildAbilitiesFromConfig = vi.fn(() => configAbilities)
|
|
|
|
|
+
|
|
|
|
|
+ ability.update = vi.fn()
|
|
|
|
|
+
|
|
|
|
|
+ const result = abilityBuilder.buildAbilities()
|
|
|
|
|
+
|
|
|
|
|
+ expect(ability.update).toHaveBeenCalledTimes(2)
|
|
|
|
|
+ expect(ability.update).toHaveBeenCalledWith(roleAbilities)
|
|
|
|
|
+ expect(ability.update).toHaveBeenCalledWith(allAbilities)
|
|
|
|
|
+
|
|
|
|
|
+ expect(abilityBuilder.buildAbilitiesFromRoles).toHaveBeenCalledOnce()
|
|
|
|
|
+ expect(abilityBuilder.buildAbilitiesFromConfig).toHaveBeenCalledOnce()
|
|
|
|
|
+
|
|
|
|
|
+ expect(result).toEqual(allAbilities)
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+describe('buildAbilitiesFromRoles', () => {
|
|
|
|
|
+ test('calls roleUtils', () => {
|
|
|
|
|
+ accessProfile.roles = ['ROLE_EVENTS_VIEW', 'ROLE_COURSES', 'ROLE_TEACHER_CORE', 'ROLE_OTHER']
|
|
|
|
|
+
|
|
|
|
|
+ const expected = [
|
|
|
|
|
+ { subject: 'events', action: 'read' },
|
|
|
|
|
+ { subject: 'courses', action: 'manage' },
|
|
|
|
|
+ { subject: 'other', action: 'manage' },
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
|
|
+ expect(abilityBuilder.buildAbilitiesFromRoles()).toEqual(expected)
|
|
|
|
|
+ })
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
|
|
+describe('buildAbilitiesFromConfig', () => {
|
|
|
|
|
+ test('calls roleUtils', () => {
|
|
|
|
|
+ abilityBuilder.hasConfigAbility = vi.fn(() => true)
|
|
|
|
|
+
|
|
|
|
|
+ expect(abilityBuilder.buildAbilitiesFromConfig()).toEqual([
|
|
|
|
|
+ { action: 'read', subject: 'subject1' },
|
|
|
|
|
+ { action: 'read', subject: 'subject2' },
|
|
|
|
|
+ ])
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
describe('hasConfigAbility', () => {
|
|
describe('hasConfigAbility', () => {
|