@nest-boot/permission 7.2.0 → 8.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decorators/can.decorator.d.ts +4 -4
- package/dist/decorators/can.decorator.js +5 -8
- package/dist/decorators/can.decorator.js.map +1 -1
- package/dist/enums/permission-action.enum.js +2 -5
- package/dist/enums/permission-action.enum.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/index.js +16 -32
- package/dist/index.js.map +1 -1
- package/dist/interfaces/can-options.interface.d.ts +2 -2
- package/dist/interfaces/can-options.interface.js +1 -2
- package/dist/interfaces/permission-module-options.interface.d.ts +1 -1
- package/dist/interfaces/permission-module-options.interface.js +1 -2
- package/dist/interfaces/route-argument-metadata-value.interface.js +1 -2
- package/dist/permission.ability-builder.d.ts +1 -1
- package/dist/permission.ability-builder.js +3 -7
- package/dist/permission.ability-builder.js.map +1 -1
- package/dist/permission.constants.js +7 -10
- package/dist/permission.constants.js.map +1 -1
- package/dist/permission.guard.d.ts +1 -1
- package/dist/permission.guard.js +39 -39
- package/dist/permission.guard.js.map +1 -1
- package/dist/permission.module-definition.d.ts +1 -1
- package/dist/permission.module-definition.js +4 -7
- package/dist/permission.module-definition.js.map +1 -1
- package/dist/permission.module.d.ts +1 -1
- package/dist/permission.module.js +10 -13
- package/dist/permission.module.js.map +1 -1
- package/dist/types/build-ability-callback.type.d.ts +1 -1
- package/dist/types/build-ability-callback.type.js +1 -2
- package/dist/types/can-subject-factory.type.js +1 -2
- package/dist/types/can-subject.type.d.ts +1 -1
- package/dist/types/can-subject.type.js +1 -2
- package/dist/types/permission-ability.type.d.ts +1 -1
- package/dist/types/permission-ability.type.js +1 -2
- package/dist/types/route-argument-metadata.type.d.ts +1 -1
- package/dist/types/route-argument-metadata.type.js +1 -2
- package/dist/utils/can.util.d.ts +1 -1
- package/dist/utils/can.util.js +3 -6
- package/dist/utils/can.util.js.map +1 -1
- package/dist/utils/get-permission-ability.util.d.ts +1 -1
- package/dist/utils/get-permission-ability.util.js +6 -10
- package/dist/utils/get-permission-ability.util.js.map +1 -1
- package/package.json +21 -24
- package/dist/decorators/can.decorator.spec.d.ts +0 -1
- package/dist/decorators/can.decorator.spec.js +0 -50
- package/dist/decorators/can.decorator.spec.js.map +0 -1
- package/dist/index.spec.d.ts +0 -0
- package/dist/index.spec.js +0 -47
- package/dist/index.spec.js.map +0 -1
- package/dist/permission.ability-builder.spec.d.ts +0 -1
- package/dist/permission.ability-builder.spec.js +0 -16
- package/dist/permission.ability-builder.spec.js.map +0 -1
- package/dist/permission.guard.spec.d.ts +0 -1
- package/dist/permission.guard.spec.js +0 -577
- package/dist/permission.guard.spec.js.map +0 -1
- package/dist/permission.module.spec.d.ts +0 -1
- package/dist/permission.module.spec.js +0 -12
- package/dist/permission.module.spec.js.map +0 -1
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/utils/can.util.spec.d.ts +0 -1
- package/dist/utils/can.util.spec.js +0 -34
- package/dist/utils/can.util.spec.js.map +0 -1
- package/dist/utils/get-permission-ability.util.spec.d.ts +0 -1
- package/dist/utils/get-permission-ability.util.spec.js +0 -27
- package/dist/utils/get-permission-ability.util.spec.js.map +0 -1
|
@@ -1,577 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const request_context_1 = require("@nest-boot/request-context");
|
|
4
|
-
const common_1 = require("@nestjs/common");
|
|
5
|
-
const core_1 = require("@nestjs/core");
|
|
6
|
-
const testing_1 = require("@nestjs/testing");
|
|
7
|
-
const permission_action_enum_1 = require("./enums/permission-action.enum");
|
|
8
|
-
const permission_constants_1 = require("./permission.constants");
|
|
9
|
-
const permission_guard_1 = require("./permission.guard");
|
|
10
|
-
const permission_module_definition_1 = require("./permission.module-definition");
|
|
11
|
-
const get_permission_ability_util_1 = require("./utils/get-permission-ability.util");
|
|
12
|
-
class Subject {
|
|
13
|
-
}
|
|
14
|
-
class Controller {
|
|
15
|
-
}
|
|
16
|
-
describe("PermissionGuard", () => {
|
|
17
|
-
afterEach(() => {
|
|
18
|
-
Reflect.deleteMetadata(permission_constants_1.ROUTE_ARGS_METADATA, Controller, "handler");
|
|
19
|
-
});
|
|
20
|
-
it("allows requests without permission metadata", async () => {
|
|
21
|
-
const { guard, reflector, buildAbility } = await createGuard();
|
|
22
|
-
reflector.getAllAndOverride.mockReturnValue(undefined);
|
|
23
|
-
await expect(guard.canActivate(createContext())).resolves.toBe(true);
|
|
24
|
-
expect(buildAbility).not.toHaveBeenCalled();
|
|
25
|
-
});
|
|
26
|
-
it("throws when permission metadata exists but no ability is available", async () => {
|
|
27
|
-
const { guard, reflector, buildAbility } = await createGuard();
|
|
28
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
29
|
-
action: permission_action_enum_1.PermissionAction.READ,
|
|
30
|
-
subject: Subject,
|
|
31
|
-
});
|
|
32
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
33
|
-
await expect(guard.canActivate(createContext())).rejects.toBeInstanceOf(common_1.ForbiddenException);
|
|
34
|
-
await expect(guard.canActivate(createContext())).rejects.toBeInstanceOf(common_1.ForbiddenException);
|
|
35
|
-
});
|
|
36
|
-
expect(buildAbility).toHaveBeenCalledTimes(1);
|
|
37
|
-
});
|
|
38
|
-
it("builds, caches, and checks ability against configured permission metadata", async () => {
|
|
39
|
-
const canMock = jest.fn(() => true);
|
|
40
|
-
const ability = {
|
|
41
|
-
can: canMock,
|
|
42
|
-
};
|
|
43
|
-
const { guard, reflector, buildAbility, req, res } = await createGuard(ability);
|
|
44
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
45
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
46
|
-
subject: Subject,
|
|
47
|
-
});
|
|
48
|
-
const context = createContext(req, res);
|
|
49
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
50
|
-
await expect(guard.canActivate(context)).resolves.toBe(true);
|
|
51
|
-
await expect(request_context_1.RequestContext.get(permission_constants_1.PERMISSION_ABILITY_PROMISE)).resolves.toBe(ability);
|
|
52
|
-
expect(request_context_1.RequestContext.get(permission_constants_1.PERMISSION_ABILITY)).toBe(ability);
|
|
53
|
-
expect((0, get_permission_ability_util_1.getPermissionAbility)()).toBe(ability);
|
|
54
|
-
});
|
|
55
|
-
expect(buildAbility).toHaveBeenCalledWith(context);
|
|
56
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.UPDATE, Subject);
|
|
57
|
-
});
|
|
58
|
-
it("passes GraphQL execution context to buildAbility", async () => {
|
|
59
|
-
const canMock = jest.fn(() => true);
|
|
60
|
-
const ability = {
|
|
61
|
-
can: canMock,
|
|
62
|
-
};
|
|
63
|
-
const { guard, reflector, buildAbility, req, res } = await createGuard(ability);
|
|
64
|
-
const gqlContext = { req, res };
|
|
65
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
66
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
67
|
-
subject: Subject,
|
|
68
|
-
});
|
|
69
|
-
const context = createContext(undefined, undefined, [undefined, {}, gqlContext, {}], "graphql");
|
|
70
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "graphql" }), async () => {
|
|
71
|
-
await expect(guard.canActivate(context)).resolves.toBe(true);
|
|
72
|
-
});
|
|
73
|
-
expect(buildAbility).toHaveBeenCalledWith(context);
|
|
74
|
-
});
|
|
75
|
-
it("uses cached ability before building a new one", async () => {
|
|
76
|
-
const canMock = jest.fn(() => true);
|
|
77
|
-
const ability = {
|
|
78
|
-
can: canMock,
|
|
79
|
-
};
|
|
80
|
-
const { guard, reflector, buildAbility } = await createGuard();
|
|
81
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
82
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
83
|
-
subject: Subject,
|
|
84
|
-
});
|
|
85
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), () => {
|
|
86
|
-
request_context_1.RequestContext.set(permission_constants_1.PERMISSION_ABILITY, ability);
|
|
87
|
-
return expect(guard.canActivate(createContext())).resolves.toBe(true);
|
|
88
|
-
});
|
|
89
|
-
expect(buildAbility).not.toHaveBeenCalled();
|
|
90
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.UPDATE, Subject);
|
|
91
|
-
});
|
|
92
|
-
it("checks ability against subject resolved from self and decorated method args", async () => {
|
|
93
|
-
const subjectInstance = new Subject();
|
|
94
|
-
const input = { id: 123 };
|
|
95
|
-
const handlerThis = {
|
|
96
|
-
workspaceMemberService: {
|
|
97
|
-
findOne: jest.fn((_id) => Promise.resolve(subjectInstance)),
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
const subjectFactory = jest.fn((self, params) => self.workspaceMemberService.findOne(params.input.id));
|
|
101
|
-
const canMock = jest.fn(() => true);
|
|
102
|
-
const ability = {
|
|
103
|
-
can: canMock,
|
|
104
|
-
};
|
|
105
|
-
const { guard, reflector, moduleRef } = await createGuard(ability, handlerThis);
|
|
106
|
-
setRouteArgsMetadata({
|
|
107
|
-
"3:0": {
|
|
108
|
-
index: 0,
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
112
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
113
|
-
subject: subjectFactory,
|
|
114
|
-
});
|
|
115
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
116
|
-
await expect(guard.canActivate(createContext({ headers: {}, body: { input } }, {}, []))).resolves.toBe(true);
|
|
117
|
-
});
|
|
118
|
-
expect(moduleRef.resolve).toHaveBeenCalledWith(Controller, expect.any(Object), { strict: false });
|
|
119
|
-
expect(subjectFactory.mock.contexts[0]).toBeUndefined();
|
|
120
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, { input });
|
|
121
|
-
expect(handlerThis.workspaceMemberService.findOne).toHaveBeenCalledWith(123);
|
|
122
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.UPDATE, subjectInstance);
|
|
123
|
-
});
|
|
124
|
-
it("passes GraphQL resolver arguments in decorated parameter order", async () => {
|
|
125
|
-
const input = { title: "New title" };
|
|
126
|
-
const subjectInstance = new Subject();
|
|
127
|
-
const handlerThis = {
|
|
128
|
-
postService: {
|
|
129
|
-
findOneOrFail: jest.fn((_id, _input) => subjectInstance),
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
const subjectFactory = jest.fn((self, id, params) => self.postService.findOneOrFail(id, params));
|
|
133
|
-
const canMock = jest.fn(() => true);
|
|
134
|
-
const ability = {
|
|
135
|
-
can: canMock,
|
|
136
|
-
};
|
|
137
|
-
const { guard, reflector, req, res } = await createGuard(ability, handlerThis);
|
|
138
|
-
setRouteArgsMetadata({
|
|
139
|
-
"3:0": {
|
|
140
|
-
index: 0,
|
|
141
|
-
data: "id",
|
|
142
|
-
},
|
|
143
|
-
"3:1": {
|
|
144
|
-
index: 1,
|
|
145
|
-
data: "input",
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
149
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
150
|
-
subject: subjectFactory,
|
|
151
|
-
});
|
|
152
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "graphql" }), async () => {
|
|
153
|
-
await expect(guard.canActivate(createContext(undefined, undefined, [undefined, { input, id: "post-1" }, { req, res }, {}], "graphql"))).resolves.toBe(true);
|
|
154
|
-
});
|
|
155
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, "post-1", input);
|
|
156
|
-
expect(handlerThis.postService.findOneOrFail).toHaveBeenCalledWith("post-1", input);
|
|
157
|
-
});
|
|
158
|
-
it("passes every GraphQL route argument source to subject factories", async () => {
|
|
159
|
-
const root = { root: true };
|
|
160
|
-
const info = { fieldName: "post" };
|
|
161
|
-
const subjectInstance = new Subject();
|
|
162
|
-
const handlerThis = {};
|
|
163
|
-
const subjectFactory = jest.fn(() => subjectInstance);
|
|
164
|
-
const canMock = jest.fn(() => true);
|
|
165
|
-
const ability = {
|
|
166
|
-
can: canMock,
|
|
167
|
-
};
|
|
168
|
-
const { guard, reflector, req } = await createGuard(ability, handlerThis);
|
|
169
|
-
setRouteArgsMetadata({
|
|
170
|
-
"0:0": {
|
|
171
|
-
index: 0,
|
|
172
|
-
},
|
|
173
|
-
"3:1": {
|
|
174
|
-
index: 1,
|
|
175
|
-
data: "id",
|
|
176
|
-
},
|
|
177
|
-
"1:2": {
|
|
178
|
-
index: 2,
|
|
179
|
-
data: "viewer",
|
|
180
|
-
},
|
|
181
|
-
"2:3": {
|
|
182
|
-
index: 3,
|
|
183
|
-
},
|
|
184
|
-
"99:4": {
|
|
185
|
-
index: 4,
|
|
186
|
-
},
|
|
187
|
-
});
|
|
188
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
189
|
-
action: permission_action_enum_1.PermissionAction.READ,
|
|
190
|
-
subject: subjectFactory,
|
|
191
|
-
});
|
|
192
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "graphql" }), async () => {
|
|
193
|
-
await expect(guard.canActivate(createContext(undefined, undefined, [root, { id: "post-1" }, { req, viewer: "user-1" }, info], "graphql"))).resolves.toBe(true);
|
|
194
|
-
});
|
|
195
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, root, "post-1", "user-1", info, undefined);
|
|
196
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.READ, subjectInstance);
|
|
197
|
-
});
|
|
198
|
-
it("passes HTTP controller arguments in decorated parameter order", async () => {
|
|
199
|
-
const input = { title: "New title" };
|
|
200
|
-
const subjectInstance = new Subject();
|
|
201
|
-
const handlerThis = {
|
|
202
|
-
postService: {
|
|
203
|
-
findOneOrFail: jest.fn((_id, _input) => subjectInstance),
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
const subjectFactory = jest.fn((self, id, params) => self.postService.findOneOrFail(id, params));
|
|
207
|
-
const canMock = jest.fn(() => true);
|
|
208
|
-
const ability = {
|
|
209
|
-
can: canMock,
|
|
210
|
-
};
|
|
211
|
-
const { guard, reflector } = await createGuard(ability, handlerThis);
|
|
212
|
-
setRouteArgsMetadata({
|
|
213
|
-
"5:0": {
|
|
214
|
-
index: 0,
|
|
215
|
-
data: "id",
|
|
216
|
-
},
|
|
217
|
-
"3:1": {
|
|
218
|
-
index: 1,
|
|
219
|
-
data: "input",
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
223
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
224
|
-
subject: subjectFactory,
|
|
225
|
-
});
|
|
226
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
227
|
-
await expect(guard.canActivate(createContext({
|
|
228
|
-
headers: {},
|
|
229
|
-
params: { id: "post-1" },
|
|
230
|
-
body: { input },
|
|
231
|
-
}, {}, []))).resolves.toBe(true);
|
|
232
|
-
});
|
|
233
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, "post-1", input);
|
|
234
|
-
expect(handlerThis.postService.findOneOrFail).toHaveBeenCalledWith("post-1", input);
|
|
235
|
-
});
|
|
236
|
-
it("passes every HTTP route argument source to subject factories", async () => {
|
|
237
|
-
const req = {
|
|
238
|
-
body: { input: { title: "Draft" } },
|
|
239
|
-
files: ["first-file"],
|
|
240
|
-
headers: { "x-user-id": "user-1" },
|
|
241
|
-
hosts: { account: "acme" },
|
|
242
|
-
ip: "127.0.0.1",
|
|
243
|
-
params: { id: "post-1" },
|
|
244
|
-
query: { preview: "true" },
|
|
245
|
-
rawBody: Buffer.from("raw"),
|
|
246
|
-
session: { id: "session-1" },
|
|
247
|
-
upload: { filename: "avatar.png" },
|
|
248
|
-
};
|
|
249
|
-
const res = {
|
|
250
|
-
locals: {},
|
|
251
|
-
};
|
|
252
|
-
const next = jest.fn();
|
|
253
|
-
const subjectInstance = new Subject();
|
|
254
|
-
const handlerThis = {};
|
|
255
|
-
const subjectFactory = jest.fn(() => subjectInstance);
|
|
256
|
-
const canMock = jest.fn(() => true);
|
|
257
|
-
const ability = {
|
|
258
|
-
can: canMock,
|
|
259
|
-
};
|
|
260
|
-
const { guard, reflector } = await createGuard(ability, handlerThis);
|
|
261
|
-
setRouteArgsMetadata({
|
|
262
|
-
"0:0": {
|
|
263
|
-
index: 0,
|
|
264
|
-
},
|
|
265
|
-
"1:1": {
|
|
266
|
-
index: 1,
|
|
267
|
-
},
|
|
268
|
-
"2:2": {
|
|
269
|
-
index: 2,
|
|
270
|
-
},
|
|
271
|
-
"3:3": {
|
|
272
|
-
index: 3,
|
|
273
|
-
},
|
|
274
|
-
"12:4": {
|
|
275
|
-
index: 4,
|
|
276
|
-
},
|
|
277
|
-
"5:5": {
|
|
278
|
-
index: 5,
|
|
279
|
-
data: "id",
|
|
280
|
-
},
|
|
281
|
-
"10:6": {
|
|
282
|
-
index: 6,
|
|
283
|
-
data: "account",
|
|
284
|
-
},
|
|
285
|
-
"4:7": {
|
|
286
|
-
index: 7,
|
|
287
|
-
data: "preview",
|
|
288
|
-
},
|
|
289
|
-
"6:8": {
|
|
290
|
-
index: 8,
|
|
291
|
-
data: "X-USER-ID",
|
|
292
|
-
},
|
|
293
|
-
"7:9": {
|
|
294
|
-
index: 9,
|
|
295
|
-
},
|
|
296
|
-
"8:10": {
|
|
297
|
-
index: 10,
|
|
298
|
-
data: "upload",
|
|
299
|
-
},
|
|
300
|
-
"8:11": {
|
|
301
|
-
index: 11,
|
|
302
|
-
},
|
|
303
|
-
"9:12": {
|
|
304
|
-
index: 12,
|
|
305
|
-
},
|
|
306
|
-
"11:13": {
|
|
307
|
-
index: 13,
|
|
308
|
-
},
|
|
309
|
-
"99:14": {
|
|
310
|
-
index: 14,
|
|
311
|
-
},
|
|
312
|
-
});
|
|
313
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
314
|
-
action: permission_action_enum_1.PermissionAction.READ,
|
|
315
|
-
subject: subjectFactory,
|
|
316
|
-
});
|
|
317
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
318
|
-
await expect(guard.canActivate(createContext(req, res, [undefined, undefined, next]))).resolves.toBe(true);
|
|
319
|
-
});
|
|
320
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, req, res, next, req.body, req.rawBody, "post-1", "acme", "true", "user-1", req.session, req.upload, undefined, req.files, req.ip, undefined);
|
|
321
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.READ, subjectInstance);
|
|
322
|
-
});
|
|
323
|
-
it("passes custom HTTP controller arguments to subject factories", async () => {
|
|
324
|
-
const workspace = { id: "workspace-1" };
|
|
325
|
-
const subjectInstance = new Subject();
|
|
326
|
-
const customFactory = jest.fn((_data, context) => context.switchToHttp().getRequest().headers["x-workspace-id"] === workspace.id
|
|
327
|
-
? workspace
|
|
328
|
-
: null);
|
|
329
|
-
const handlerThis = {
|
|
330
|
-
workspaceService: {
|
|
331
|
-
findSubject: jest.fn((_customWorkspace, _id) => subjectInstance),
|
|
332
|
-
},
|
|
333
|
-
};
|
|
334
|
-
const subjectFactory = jest.fn((self, currentWorkspace, id) => self.workspaceService.findSubject(currentWorkspace, id));
|
|
335
|
-
const canMock = jest.fn(() => true);
|
|
336
|
-
const ability = {
|
|
337
|
-
can: canMock,
|
|
338
|
-
};
|
|
339
|
-
const { guard, reflector } = await createGuard(ability, handlerThis);
|
|
340
|
-
setRouteArgsMetadata({
|
|
341
|
-
[`workspace${permission_constants_1.CUSTOM_ROUTE_ARGS_METADATA}:0`]: {
|
|
342
|
-
index: 0,
|
|
343
|
-
data: "workspace",
|
|
344
|
-
factory: customFactory,
|
|
345
|
-
},
|
|
346
|
-
"5:1": {
|
|
347
|
-
index: 1,
|
|
348
|
-
data: "id",
|
|
349
|
-
},
|
|
350
|
-
});
|
|
351
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
352
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
353
|
-
subject: subjectFactory,
|
|
354
|
-
});
|
|
355
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
356
|
-
await expect(guard.canActivate(createContext({
|
|
357
|
-
headers: { "x-workspace-id": workspace.id },
|
|
358
|
-
params: { id: "post-1" },
|
|
359
|
-
}, {}, []))).resolves.toBe(true);
|
|
360
|
-
});
|
|
361
|
-
expect(customFactory).toHaveBeenCalledWith("workspace", expect.any(Object));
|
|
362
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, workspace, "post-1");
|
|
363
|
-
expect(handlerThis.workspaceService.findSubject).toHaveBeenCalledWith(workspace, "post-1");
|
|
364
|
-
expect(canMock).toHaveBeenCalledWith(permission_action_enum_1.PermissionAction.UPDATE, subjectInstance);
|
|
365
|
-
});
|
|
366
|
-
it("awaits async custom controller arguments before invoking subject factories", async () => {
|
|
367
|
-
const workspace = { id: "workspace-1" };
|
|
368
|
-
const subjectInstance = new Subject();
|
|
369
|
-
const customFactory = jest.fn(() => Promise.resolve(workspace));
|
|
370
|
-
const handlerThis = {
|
|
371
|
-
workspaceService: {
|
|
372
|
-
findSubject: jest.fn((_customWorkspace, _id) => subjectInstance),
|
|
373
|
-
},
|
|
374
|
-
};
|
|
375
|
-
const subjectFactory = jest.fn((self, currentWorkspace, id) => self.workspaceService.findSubject(currentWorkspace, id));
|
|
376
|
-
const canMock = jest.fn(() => true);
|
|
377
|
-
const ability = {
|
|
378
|
-
can: canMock,
|
|
379
|
-
};
|
|
380
|
-
const { guard, reflector } = await createGuard(ability, handlerThis);
|
|
381
|
-
setRouteArgsMetadata({
|
|
382
|
-
[`workspace${permission_constants_1.CUSTOM_ROUTE_ARGS_METADATA}:0`]: {
|
|
383
|
-
index: 0,
|
|
384
|
-
data: "workspace",
|
|
385
|
-
factory: customFactory,
|
|
386
|
-
},
|
|
387
|
-
"5:1": {
|
|
388
|
-
index: 1,
|
|
389
|
-
data: "id",
|
|
390
|
-
},
|
|
391
|
-
});
|
|
392
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
393
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
394
|
-
subject: subjectFactory,
|
|
395
|
-
});
|
|
396
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
397
|
-
await expect(guard.canActivate(createContext({
|
|
398
|
-
headers: {},
|
|
399
|
-
params: { id: "post-1" },
|
|
400
|
-
}, {}, []))).resolves.toBe(true);
|
|
401
|
-
});
|
|
402
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis, workspace, "post-1");
|
|
403
|
-
expect(handlerThis.workspaceService.findSubject).toHaveBeenCalledWith(workspace, "post-1");
|
|
404
|
-
});
|
|
405
|
-
it("shares a pending ability build across concurrent checks", async () => {
|
|
406
|
-
const canMock = jest.fn(() => true);
|
|
407
|
-
const ability = {
|
|
408
|
-
can: canMock,
|
|
409
|
-
};
|
|
410
|
-
const { guard, reflector, buildAbility } = await createGuard();
|
|
411
|
-
let resolveAbility;
|
|
412
|
-
const abilityPromise = new Promise((resolve) => {
|
|
413
|
-
resolveAbility = resolve;
|
|
414
|
-
});
|
|
415
|
-
buildAbility.mockImplementation(() => abilityPromise);
|
|
416
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
417
|
-
action: permission_action_enum_1.PermissionAction.UPDATE,
|
|
418
|
-
subject: Subject,
|
|
419
|
-
});
|
|
420
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "graphql" }), async () => {
|
|
421
|
-
const first = guard.canActivate(createContext());
|
|
422
|
-
const second = guard.canActivate(createContext());
|
|
423
|
-
await Promise.resolve();
|
|
424
|
-
expect(buildAbility).toHaveBeenCalledTimes(1);
|
|
425
|
-
resolveAbility(ability);
|
|
426
|
-
await expect(Promise.all([first, second])).resolves.toEqual([
|
|
427
|
-
true,
|
|
428
|
-
true,
|
|
429
|
-
]);
|
|
430
|
-
});
|
|
431
|
-
expect(canMock).toHaveBeenCalledTimes(2);
|
|
432
|
-
});
|
|
433
|
-
it("passes no subject factory args when route metadata is missing", async () => {
|
|
434
|
-
const subjectInstance = new Subject();
|
|
435
|
-
const handlerThis = {};
|
|
436
|
-
const subjectFactory = jest.fn(() => subjectInstance);
|
|
437
|
-
const canMock = jest.fn(() => true);
|
|
438
|
-
const { guard, reflector, moduleRef } = await createGuard({
|
|
439
|
-
can: canMock,
|
|
440
|
-
}, handlerThis);
|
|
441
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
442
|
-
action: permission_action_enum_1.PermissionAction.READ,
|
|
443
|
-
subject: subjectFactory,
|
|
444
|
-
});
|
|
445
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "rpc" }), async () => {
|
|
446
|
-
await expect(guard.canActivate(createContext(undefined, undefined, [], "rpc"))).resolves.toBe(true);
|
|
447
|
-
});
|
|
448
|
-
expect(moduleRef.resolve).toHaveBeenCalledWith(Controller, undefined, {
|
|
449
|
-
strict: false,
|
|
450
|
-
});
|
|
451
|
-
expect(subjectFactory).toHaveBeenCalledWith(handlerThis);
|
|
452
|
-
});
|
|
453
|
-
it("falls back to prototype lookup and null when handler names are unavailable", async () => {
|
|
454
|
-
const subjectInstance = new Subject();
|
|
455
|
-
const handlerThis = {};
|
|
456
|
-
const subjectFactory = jest.fn(() => subjectInstance);
|
|
457
|
-
const canMock = jest.fn(() => true);
|
|
458
|
-
const { guard, reflector } = await createGuard({
|
|
459
|
-
can: canMock,
|
|
460
|
-
}, handlerThis);
|
|
461
|
-
const matchedHandler = createUnnamedHandler();
|
|
462
|
-
const unmatchedHandler = createUnnamedHandler();
|
|
463
|
-
Object.defineProperty(Controller.prototype, "matched", {
|
|
464
|
-
configurable: true,
|
|
465
|
-
value: matchedHandler,
|
|
466
|
-
});
|
|
467
|
-
Reflect.defineMetadata(permission_constants_1.ROUTE_ARGS_METADATA, {
|
|
468
|
-
"3:0": {
|
|
469
|
-
index: 0,
|
|
470
|
-
data: 1,
|
|
471
|
-
},
|
|
472
|
-
}, Controller, "matched");
|
|
473
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
474
|
-
action: permission_action_enum_1.PermissionAction.READ,
|
|
475
|
-
subject: subjectFactory,
|
|
476
|
-
});
|
|
477
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
478
|
-
const matchedContext = createContext({
|
|
479
|
-
body: { input: true },
|
|
480
|
-
headers: {},
|
|
481
|
-
}, {});
|
|
482
|
-
matchedContext.getHandler = jest.fn(() => matchedHandler);
|
|
483
|
-
await expect(guard.canActivate(matchedContext)).resolves.toBe(true);
|
|
484
|
-
const unmatchedContext = createContext({
|
|
485
|
-
body: "not-an-object",
|
|
486
|
-
headers: {},
|
|
487
|
-
}, {});
|
|
488
|
-
unmatchedContext.getHandler = jest.fn(() => unmatchedHandler);
|
|
489
|
-
await expect(guard.canActivate(unmatchedContext)).resolves.toBe(true);
|
|
490
|
-
});
|
|
491
|
-
expect(subjectFactory).toHaveBeenNthCalledWith(1, handlerThis, {
|
|
492
|
-
input: true,
|
|
493
|
-
});
|
|
494
|
-
expect(subjectFactory).toHaveBeenNthCalledWith(2, handlerThis);
|
|
495
|
-
Reflect.deleteMetadata(permission_constants_1.ROUTE_ARGS_METADATA, Controller, "matched");
|
|
496
|
-
delete Controller.prototype.matched;
|
|
497
|
-
});
|
|
498
|
-
it("returns false when ability denies the permission", async () => {
|
|
499
|
-
const canMock = jest.fn(() => false);
|
|
500
|
-
const { guard, reflector } = await createGuard({
|
|
501
|
-
can: canMock,
|
|
502
|
-
});
|
|
503
|
-
reflector.getAllAndOverride.mockReturnValue({
|
|
504
|
-
action: permission_action_enum_1.PermissionAction.DELETE,
|
|
505
|
-
subject: Subject,
|
|
506
|
-
});
|
|
507
|
-
await request_context_1.RequestContext.run(new request_context_1.RequestContext({ type: "http" }), async () => {
|
|
508
|
-
await expect(guard.canActivate(createContext())).resolves.toBe(false);
|
|
509
|
-
});
|
|
510
|
-
});
|
|
511
|
-
});
|
|
512
|
-
async function createGuard(ability = null, handlerThis = {}) {
|
|
513
|
-
const reflector = {
|
|
514
|
-
getAllAndOverride: jest.fn(),
|
|
515
|
-
};
|
|
516
|
-
const buildAbility = jest.fn((_ctx) => ability);
|
|
517
|
-
const moduleRefMock = {
|
|
518
|
-
resolve: jest.fn(() => Promise.resolve(handlerThis)),
|
|
519
|
-
};
|
|
520
|
-
const req = {
|
|
521
|
-
headers: {},
|
|
522
|
-
};
|
|
523
|
-
const res = {};
|
|
524
|
-
const testingModule = await testing_1.Test.createTestingModule({
|
|
525
|
-
providers: [
|
|
526
|
-
permission_guard_1.PermissionGuard,
|
|
527
|
-
{
|
|
528
|
-
provide: core_1.Reflector,
|
|
529
|
-
useValue: reflector,
|
|
530
|
-
},
|
|
531
|
-
{
|
|
532
|
-
provide: permission_module_definition_1.MODULE_OPTIONS_TOKEN,
|
|
533
|
-
useValue: {
|
|
534
|
-
buildAbility,
|
|
535
|
-
},
|
|
536
|
-
},
|
|
537
|
-
{
|
|
538
|
-
provide: core_1.ModuleRef,
|
|
539
|
-
useValue: moduleRefMock,
|
|
540
|
-
},
|
|
541
|
-
],
|
|
542
|
-
}).compile();
|
|
543
|
-
return {
|
|
544
|
-
guard: testingModule.get(permission_guard_1.PermissionGuard),
|
|
545
|
-
reflector,
|
|
546
|
-
buildAbility,
|
|
547
|
-
moduleRef: moduleRefMock,
|
|
548
|
-
req,
|
|
549
|
-
res,
|
|
550
|
-
};
|
|
551
|
-
}
|
|
552
|
-
function createContext(req, res, args = [], type = "http") {
|
|
553
|
-
const resolvedReq = arguments.length >= 1 ? req : { headers: {} };
|
|
554
|
-
const resolvedRes = arguments.length >= 2 ? res : {};
|
|
555
|
-
return {
|
|
556
|
-
getType: jest.fn(() => type),
|
|
557
|
-
switchToHttp: () => ({
|
|
558
|
-
getRequest: () => resolvedReq,
|
|
559
|
-
getResponse: () => resolvedRes,
|
|
560
|
-
getNext: () => args[2],
|
|
561
|
-
}),
|
|
562
|
-
getArgs: jest.fn(() => args),
|
|
563
|
-
getHandler: jest.fn(() => function handler() {
|
|
564
|
-
return undefined;
|
|
565
|
-
}),
|
|
566
|
-
getClass: jest.fn(() => Controller),
|
|
567
|
-
};
|
|
568
|
-
}
|
|
569
|
-
function setRouteArgsMetadata(metadata) {
|
|
570
|
-
Reflect.defineMetadata(permission_constants_1.ROUTE_ARGS_METADATA, metadata, Controller, "handler");
|
|
571
|
-
}
|
|
572
|
-
function createUnnamedHandler() {
|
|
573
|
-
return function () {
|
|
574
|
-
return undefined;
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
//# sourceMappingURL=permission.guard.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permission.guard.spec.js","sourceRoot":"","sources":["../src/permission.guard.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const permission_module_1 = require("./permission.module");
|
|
4
|
-
describe("PermissionModule", () => {
|
|
5
|
-
it("creates the configurable permission module", () => {
|
|
6
|
-
const dynamicModule = permission_module_1.PermissionModule.forRoot({
|
|
7
|
-
buildAbility: jest.fn(() => null),
|
|
8
|
-
});
|
|
9
|
-
expect(dynamicModule.module).toBe(permission_module_1.PermissionModule);
|
|
10
|
-
});
|
|
11
|
-
});
|
|
12
|
-
//# sourceMappingURL=permission.module.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permission.module.spec.js","sourceRoot":"","sources":["../src/permission.module.spec.ts"],"names":[],"mappings":";;AAAA,2DAAuD;AAEvD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,aAAa,GAAG,oCAAgB,CAAC,OAAO,CAAC;YAC7C,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,oCAAgB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|