@powerhousedao/reactor-api 5.1.0-staging.0 → 5.2.0-staging.1
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/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/src/graphql/auth/index.d.ts +2 -0
- package/dist/src/graphql/auth/index.d.ts.map +1 -0
- package/dist/src/graphql/auth/index.js +2 -0
- package/dist/src/graphql/auth/index.js.map +1 -0
- package/dist/src/graphql/auth/resolvers.d.ts +149 -0
- package/dist/src/graphql/auth/resolvers.d.ts.map +1 -0
- package/dist/src/graphql/auth/resolvers.js +173 -0
- package/dist/src/graphql/auth/resolvers.js.map +1 -0
- package/dist/src/graphql/auth/schema.graphql +173 -0
- package/dist/src/graphql/auth/subgraph.d.ts +177 -0
- package/dist/src/graphql/auth/subgraph.d.ts.map +1 -0
- package/dist/src/graphql/auth/subgraph.js +340 -0
- package/dist/src/graphql/auth/subgraph.js.map +1 -0
- package/dist/src/graphql/base-subgraph.d.ts +3 -1
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +2 -0
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +51 -0
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -0
- package/dist/src/graphql/document-model-subgraph.js +104 -0
- package/dist/src/graphql/document-model-subgraph.js.map +1 -0
- package/dist/src/graphql/drive-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/drive-subgraph.js +51 -10
- package/dist/src/graphql/drive-subgraph.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +11 -3
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +72 -16
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +1 -0
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +1 -0
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +6 -1
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +18 -2
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +4 -4
- package/dist/src/graphql/reactor/subgraph.d.ts +34 -0
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +258 -21
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +62 -62
- package/dist/src/graphql/system/system-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/types.d.ts +4 -1
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +1 -1
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/migrations/001_create_document_permissions.d.ts +4 -0
- package/dist/src/migrations/001_create_document_permissions.d.ts.map +1 -0
- package/dist/src/migrations/001_create_document_permissions.js +91 -0
- package/dist/src/migrations/001_create_document_permissions.js.map +1 -0
- package/dist/src/migrations/index.d.ts +10 -0
- package/dist/src/migrations/index.d.ts.map +1 -0
- package/dist/src/migrations/index.js +59 -0
- package/dist/src/migrations/index.js.map +1 -0
- package/dist/src/packages/util.js +1 -1
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/server.d.ts +17 -4
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +45 -16
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +1 -0
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +30 -16
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/document-permission.service.d.ts +201 -0
- package/dist/src/services/document-permission.service.d.ts.map +1 -0
- package/dist/src/services/document-permission.service.js +636 -0
- package/dist/src/services/document-permission.service.js.map +1 -0
- package/dist/src/utils/create-schema.d.ts +4 -3
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +100 -3
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/db.d.ts +65 -1
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js.map +1 -1
- package/dist/test/document-permission.service.test.d.ts +2 -0
- package/dist/test/document-permission.service.test.d.ts.map +1 -0
- package/dist/test/document-permission.service.test.js +480 -0
- package/dist/test/document-permission.service.test.js.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/drive-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/drive-subgraph-permissions.test.js +195 -0
- package/dist/test/drive-subgraph-permissions.test.js.map +1 -0
- package/dist/test/identity-integration.test.d.ts +2 -0
- package/dist/test/identity-integration.test.d.ts.map +1 -0
- package/dist/test/identity-integration.test.js +349 -0
- package/dist/test/identity-integration.test.js.map +1 -0
- package/dist/test/permissions-integration.test.d.ts +2 -0
- package/dist/test/permissions-integration.test.d.ts.map +1 -0
- package/dist/test/permissions-integration.test.js +421 -0
- package/dist/test/permissions-integration.test.js.map +1 -0
- package/dist/test/reactor-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/reactor-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/reactor-subgraph-permissions.test.js +400 -0
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -0
- package/dist/test/two-reactor-gql-sync.test.js +11 -9
- package/dist/test/two-reactor-gql-sync.test.js.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +4 -4
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
+
import { runMigrations } from "../src/migrations/index.js";
|
|
3
|
+
import { DocumentPermissionService } from "../src/services/document-permission.service.js";
|
|
4
|
+
import { getDbClient } from "../src/utils/db.js";
|
|
5
|
+
describe("DocumentPermissionService", () => {
|
|
6
|
+
let service;
|
|
7
|
+
let db;
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
// Create in-memory PGlite database for testing
|
|
10
|
+
const { db: dbClient } = getDbClient();
|
|
11
|
+
db = dbClient;
|
|
12
|
+
await runMigrations(db);
|
|
13
|
+
service = new DocumentPermissionService(db);
|
|
14
|
+
});
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
await db.destroy();
|
|
17
|
+
});
|
|
18
|
+
describe("User Permissions", () => {
|
|
19
|
+
const documentId = "doc-123";
|
|
20
|
+
const userAddress = "0xUser1";
|
|
21
|
+
const adminAddress = "0xAdmin";
|
|
22
|
+
describe("grantPermission", () => {
|
|
23
|
+
it("should grant READ permission to a user", async () => {
|
|
24
|
+
const result = await service.grantPermission(documentId, userAddress, "READ", adminAddress);
|
|
25
|
+
expect(result.documentId).toBe(documentId);
|
|
26
|
+
expect(result.userAddress).toBe(userAddress.toLowerCase());
|
|
27
|
+
expect(result.permission).toBe("READ");
|
|
28
|
+
expect(result.grantedBy).toBe(adminAddress.toLowerCase());
|
|
29
|
+
});
|
|
30
|
+
it("should grant WRITE permission to a user", async () => {
|
|
31
|
+
const result = await service.grantPermission(documentId, userAddress, "WRITE", adminAddress);
|
|
32
|
+
expect(result.permission).toBe("WRITE");
|
|
33
|
+
});
|
|
34
|
+
it("should grant ADMIN permission to a user", async () => {
|
|
35
|
+
const result = await service.grantPermission(documentId, userAddress, "ADMIN", adminAddress);
|
|
36
|
+
expect(result.permission).toBe("ADMIN");
|
|
37
|
+
});
|
|
38
|
+
it("should update permission when granting to same user", async () => {
|
|
39
|
+
await service.grantPermission(documentId, userAddress, "READ", adminAddress);
|
|
40
|
+
const result = await service.grantPermission(documentId, userAddress, "WRITE", adminAddress);
|
|
41
|
+
expect(result.permission).toBe("WRITE");
|
|
42
|
+
const permissions = await service.getDocumentPermissions(documentId);
|
|
43
|
+
expect(permissions).toHaveLength(1);
|
|
44
|
+
});
|
|
45
|
+
it("should normalize user addresses to lowercase", async () => {
|
|
46
|
+
const result = await service.grantPermission(documentId, "0xABCDEF", "READ", "0xGRANTER");
|
|
47
|
+
expect(result.userAddress).toBe("0xabcdef");
|
|
48
|
+
expect(result.grantedBy).toBe("0xgranter");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("getUserPermission", () => {
|
|
52
|
+
it("should return null when no permission exists", async () => {
|
|
53
|
+
const result = await service.getUserPermission(documentId, userAddress);
|
|
54
|
+
expect(result).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
it("should return the permission level when it exists", async () => {
|
|
57
|
+
await service.grantPermission(documentId, userAddress, "WRITE", adminAddress);
|
|
58
|
+
const result = await service.getUserPermission(documentId, userAddress);
|
|
59
|
+
expect(result).toBe("WRITE");
|
|
60
|
+
});
|
|
61
|
+
it("should be case-insensitive for user addresses", async () => {
|
|
62
|
+
await service.grantPermission(documentId, "0xabc", "READ", adminAddress);
|
|
63
|
+
const result = await service.getUserPermission(documentId, "0xABC");
|
|
64
|
+
expect(result).toBe("READ");
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe("revokePermission", () => {
|
|
68
|
+
it("should remove a user's permission", async () => {
|
|
69
|
+
await service.grantPermission(documentId, userAddress, "READ", adminAddress);
|
|
70
|
+
await service.revokePermission(documentId, userAddress);
|
|
71
|
+
const result = await service.getUserPermission(documentId, userAddress);
|
|
72
|
+
expect(result).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
it("should not fail when revoking non-existent permission", async () => {
|
|
75
|
+
await expect(service.revokePermission(documentId, userAddress)).resolves.not.toThrow();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe("getDocumentPermissions", () => {
|
|
79
|
+
it("should return empty array when no permissions exist", async () => {
|
|
80
|
+
const result = await service.getDocumentPermissions(documentId);
|
|
81
|
+
expect(result).toEqual([]);
|
|
82
|
+
});
|
|
83
|
+
it("should return all permissions for a document", async () => {
|
|
84
|
+
await service.grantPermission(documentId, "0xuser1", "READ", adminAddress);
|
|
85
|
+
await service.grantPermission(documentId, "0xuser2", "WRITE", adminAddress);
|
|
86
|
+
await service.grantPermission(documentId, "0xuser3", "ADMIN", adminAddress);
|
|
87
|
+
const result = await service.getDocumentPermissions(documentId);
|
|
88
|
+
expect(result).toHaveLength(3);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe("getUserDocuments", () => {
|
|
92
|
+
it("should return all documents a user has access to", async () => {
|
|
93
|
+
await service.grantPermission("doc-1", userAddress, "READ", adminAddress);
|
|
94
|
+
await service.grantPermission("doc-2", userAddress, "WRITE", adminAddress);
|
|
95
|
+
await service.grantPermission("doc-3", "0xOtherUser", "READ", adminAddress);
|
|
96
|
+
const result = await service.getUserDocuments(userAddress);
|
|
97
|
+
expect(result).toHaveLength(2);
|
|
98
|
+
expect(result.map((r) => r.documentId).sort()).toEqual([
|
|
99
|
+
"doc-1",
|
|
100
|
+
"doc-2",
|
|
101
|
+
]);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe("Access Control Checks", () => {
|
|
106
|
+
const documentId = "doc-123";
|
|
107
|
+
const adminAddress = "0xAdmin";
|
|
108
|
+
describe("canReadDocument", () => {
|
|
109
|
+
it("should return false for undefined user", async () => {
|
|
110
|
+
const result = await service.canReadDocument(documentId, undefined);
|
|
111
|
+
expect(result).toBe(false);
|
|
112
|
+
});
|
|
113
|
+
it("should return false when user has no permission", async () => {
|
|
114
|
+
const result = await service.canReadDocument(documentId, "0xunknown");
|
|
115
|
+
expect(result).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
it("should return true when user has READ permission", async () => {
|
|
118
|
+
await service.grantPermission(documentId, "0xuser", "READ", adminAddress);
|
|
119
|
+
const result = await service.canReadDocument(documentId, "0xuser");
|
|
120
|
+
expect(result).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
it("should return true when user has WRITE permission", async () => {
|
|
123
|
+
await service.grantPermission(documentId, "0xuser", "WRITE", adminAddress);
|
|
124
|
+
const result = await service.canReadDocument(documentId, "0xuser");
|
|
125
|
+
expect(result).toBe(true);
|
|
126
|
+
});
|
|
127
|
+
it("should return true when user has ADMIN permission", async () => {
|
|
128
|
+
await service.grantPermission(documentId, "0xuser", "ADMIN", adminAddress);
|
|
129
|
+
const result = await service.canReadDocument(documentId, "0xuser");
|
|
130
|
+
expect(result).toBe(true);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe("canWriteDocument", () => {
|
|
134
|
+
it("should return false for undefined user", async () => {
|
|
135
|
+
const result = await service.canWriteDocument(documentId, undefined);
|
|
136
|
+
expect(result).toBe(false);
|
|
137
|
+
});
|
|
138
|
+
it("should return false when user has no permission", async () => {
|
|
139
|
+
const result = await service.canWriteDocument(documentId, "0xunknown");
|
|
140
|
+
expect(result).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it("should return false when user has only READ permission", async () => {
|
|
143
|
+
await service.grantPermission(documentId, "0xuser", "READ", adminAddress);
|
|
144
|
+
const result = await service.canWriteDocument(documentId, "0xuser");
|
|
145
|
+
expect(result).toBe(false);
|
|
146
|
+
});
|
|
147
|
+
it("should return true when user has WRITE permission", async () => {
|
|
148
|
+
await service.grantPermission(documentId, "0xuser", "WRITE", adminAddress);
|
|
149
|
+
const result = await service.canWriteDocument(documentId, "0xuser");
|
|
150
|
+
expect(result).toBe(true);
|
|
151
|
+
});
|
|
152
|
+
it("should return true when user has ADMIN permission", async () => {
|
|
153
|
+
await service.grantPermission(documentId, "0xuser", "ADMIN", adminAddress);
|
|
154
|
+
const result = await service.canWriteDocument(documentId, "0xuser");
|
|
155
|
+
expect(result).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("canManageDocument", () => {
|
|
159
|
+
it("should return false for undefined user", async () => {
|
|
160
|
+
const result = await service.canManageDocument(documentId, undefined);
|
|
161
|
+
expect(result).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
it("should return false when user has only READ permission", async () => {
|
|
164
|
+
await service.grantPermission(documentId, "0xuser", "READ", adminAddress);
|
|
165
|
+
const result = await service.canManageDocument(documentId, "0xuser");
|
|
166
|
+
expect(result).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
it("should return false when user has only WRITE permission", async () => {
|
|
169
|
+
await service.grantPermission(documentId, "0xuser", "WRITE", adminAddress);
|
|
170
|
+
const result = await service.canManageDocument(documentId, "0xuser");
|
|
171
|
+
expect(result).toBe(false);
|
|
172
|
+
});
|
|
173
|
+
it("should return true when user has ADMIN permission", async () => {
|
|
174
|
+
await service.grantPermission(documentId, "0xuser", "ADMIN", adminAddress);
|
|
175
|
+
const result = await service.canManageDocument(documentId, "0xuser");
|
|
176
|
+
expect(result).toBe(true);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe("Permission Inheritance (canRead/canWrite with parent hierarchy)", () => {
|
|
181
|
+
const adminAddress = "0xAdmin";
|
|
182
|
+
const userAddress = "0xUser";
|
|
183
|
+
// Simple parent hierarchy for testing
|
|
184
|
+
const parentHierarchy = {
|
|
185
|
+
"child-doc": ["parent-doc"],
|
|
186
|
+
"grandchild-doc": ["child-doc"],
|
|
187
|
+
"parent-doc": [],
|
|
188
|
+
"orphan-doc": [],
|
|
189
|
+
};
|
|
190
|
+
const getParentIds = async (documentId) => {
|
|
191
|
+
return parentHierarchy[documentId] ?? [];
|
|
192
|
+
};
|
|
193
|
+
describe("canRead", () => {
|
|
194
|
+
it("should return true when user has direct permission", async () => {
|
|
195
|
+
await service.grantPermission("child-doc", userAddress, "READ", adminAddress);
|
|
196
|
+
const result = await service.canRead("child-doc", userAddress, getParentIds);
|
|
197
|
+
expect(result).toBe(true);
|
|
198
|
+
});
|
|
199
|
+
it("should return true when user has permission on parent", async () => {
|
|
200
|
+
await service.grantPermission("parent-doc", userAddress, "READ", adminAddress);
|
|
201
|
+
const result = await service.canRead("child-doc", userAddress, getParentIds);
|
|
202
|
+
expect(result).toBe(true);
|
|
203
|
+
});
|
|
204
|
+
it("should return true when user has permission on grandparent", async () => {
|
|
205
|
+
await service.grantPermission("parent-doc", userAddress, "READ", adminAddress);
|
|
206
|
+
const result = await service.canRead("grandchild-doc", userAddress, getParentIds);
|
|
207
|
+
expect(result).toBe(true);
|
|
208
|
+
});
|
|
209
|
+
it("should return false when user has no permission in hierarchy", async () => {
|
|
210
|
+
const result = await service.canRead("child-doc", userAddress, getParentIds);
|
|
211
|
+
expect(result).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
it("should return false for orphan document without direct permission", async () => {
|
|
214
|
+
const result = await service.canRead("orphan-doc", userAddress, getParentIds);
|
|
215
|
+
expect(result).toBe(false);
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
describe("canWrite", () => {
|
|
219
|
+
it("should return true when user has direct write permission", async () => {
|
|
220
|
+
await service.grantPermission("child-doc", userAddress, "WRITE", adminAddress);
|
|
221
|
+
const result = await service.canWrite("child-doc", userAddress, getParentIds);
|
|
222
|
+
expect(result).toBe(true);
|
|
223
|
+
});
|
|
224
|
+
it("should return false when user has only READ permission on parent", async () => {
|
|
225
|
+
await service.grantPermission("parent-doc", userAddress, "READ", adminAddress);
|
|
226
|
+
const result = await service.canWrite("child-doc", userAddress, getParentIds);
|
|
227
|
+
expect(result).toBe(false);
|
|
228
|
+
});
|
|
229
|
+
it("should return true when user has WRITE permission on parent", async () => {
|
|
230
|
+
await service.grantPermission("parent-doc", userAddress, "WRITE", adminAddress);
|
|
231
|
+
const result = await service.canWrite("child-doc", userAddress, getParentIds);
|
|
232
|
+
expect(result).toBe(true);
|
|
233
|
+
});
|
|
234
|
+
it("should return true when user has ADMIN permission on grandparent", async () => {
|
|
235
|
+
await service.grantPermission("parent-doc", userAddress, "ADMIN", adminAddress);
|
|
236
|
+
const result = await service.canWrite("grandchild-doc", userAddress, getParentIds);
|
|
237
|
+
expect(result).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
describe("filterReadableDocuments", () => {
|
|
241
|
+
it("should filter documents based on permissions", async () => {
|
|
242
|
+
await service.grantPermission("doc-1", userAddress, "READ", adminAddress);
|
|
243
|
+
await service.grantPermission("doc-3", userAddress, "WRITE", adminAddress);
|
|
244
|
+
const result = await service.filterReadableDocuments(["doc-1", "doc-2", "doc-3", "doc-4"], userAddress, async () => []);
|
|
245
|
+
expect(result).toEqual(["doc-1", "doc-3"]);
|
|
246
|
+
});
|
|
247
|
+
it("should include documents accessible via parent hierarchy", async () => {
|
|
248
|
+
await service.grantPermission("parent-doc", userAddress, "READ", adminAddress);
|
|
249
|
+
const result = await service.filterReadableDocuments(["child-doc", "orphan-doc"], userAddress, getParentIds);
|
|
250
|
+
expect(result).toEqual(["child-doc"]);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe("Group Management", () => {
|
|
255
|
+
describe("createGroup", () => {
|
|
256
|
+
it("should create a group with name and description", async () => {
|
|
257
|
+
const result = await service.createGroup("Editors", "Can edit documents");
|
|
258
|
+
expect(result.name).toBe("Editors");
|
|
259
|
+
expect(result.description).toBe("Can edit documents");
|
|
260
|
+
expect(result.id).toBeDefined();
|
|
261
|
+
});
|
|
262
|
+
it("should create a group without description", async () => {
|
|
263
|
+
const result = await service.createGroup("Viewers");
|
|
264
|
+
expect(result.name).toBe("Viewers");
|
|
265
|
+
expect(result.description).toBeNull();
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
describe("getGroup", () => {
|
|
269
|
+
it("should return null for non-existent group", async () => {
|
|
270
|
+
const result = await service.getGroup(999);
|
|
271
|
+
expect(result).toBeNull();
|
|
272
|
+
});
|
|
273
|
+
it("should return group by ID", async () => {
|
|
274
|
+
const created = await service.createGroup("Test Group");
|
|
275
|
+
const result = await service.getGroup(created.id);
|
|
276
|
+
expect(result?.name).toBe("Test Group");
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe("listGroups", () => {
|
|
280
|
+
it("should return all groups", async () => {
|
|
281
|
+
await service.createGroup("Group1");
|
|
282
|
+
await service.createGroup("Group2");
|
|
283
|
+
await service.createGroup("Group3");
|
|
284
|
+
const result = await service.listGroups();
|
|
285
|
+
expect(result).toHaveLength(3);
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
describe("deleteGroup", () => {
|
|
289
|
+
it("should delete group and all associations", async () => {
|
|
290
|
+
const group = await service.createGroup("ToDelete");
|
|
291
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
292
|
+
await service.grantGroupPermission("doc-1", group.id, "READ", "0xadmin");
|
|
293
|
+
await service.deleteGroup(group.id);
|
|
294
|
+
const result = await service.getGroup(group.id);
|
|
295
|
+
expect(result).toBeNull();
|
|
296
|
+
const userGroups = await service.getUserGroups("0xuser");
|
|
297
|
+
expect(userGroups).toHaveLength(0);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe("User-Group membership", () => {
|
|
301
|
+
it("should add user to group", async () => {
|
|
302
|
+
const group = await service.createGroup("Editors");
|
|
303
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
304
|
+
const userGroups = await service.getUserGroups("0xuser");
|
|
305
|
+
expect(userGroups).toHaveLength(1);
|
|
306
|
+
expect(userGroups[0].name).toBe("Editors");
|
|
307
|
+
});
|
|
308
|
+
it("should remove user from group", async () => {
|
|
309
|
+
const group = await service.createGroup("Editors");
|
|
310
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
311
|
+
await service.removeUserFromGroup("0xuser", group.id);
|
|
312
|
+
const userGroups = await service.getUserGroups("0xuser");
|
|
313
|
+
expect(userGroups).toHaveLength(0);
|
|
314
|
+
});
|
|
315
|
+
it("should get group members", async () => {
|
|
316
|
+
const group = await service.createGroup("Editors");
|
|
317
|
+
await service.addUserToGroup("0xuser1", group.id);
|
|
318
|
+
await service.addUserToGroup("0xuser2", group.id);
|
|
319
|
+
const members = await service.getGroupMembers(group.id);
|
|
320
|
+
expect(members.sort()).toEqual(["0xuser1", "0xuser2"]);
|
|
321
|
+
});
|
|
322
|
+
it("should normalize user addresses in group membership", async () => {
|
|
323
|
+
const group = await service.createGroup("Test");
|
|
324
|
+
await service.addUserToGroup("0xABCDEF", group.id);
|
|
325
|
+
const members = await service.getGroupMembers(group.id);
|
|
326
|
+
expect(members).toEqual(["0xabcdef"]);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
});
|
|
330
|
+
describe("Group Document Permissions", () => {
|
|
331
|
+
const adminAddress = "0xAdmin";
|
|
332
|
+
const documentId = "doc-123";
|
|
333
|
+
it("should grant group permission on document", async () => {
|
|
334
|
+
const group = await service.createGroup("Editors");
|
|
335
|
+
const result = await service.grantGroupPermission(documentId, group.id, "WRITE", adminAddress);
|
|
336
|
+
expect(result.documentId).toBe(documentId);
|
|
337
|
+
expect(result.groupId).toBe(group.id);
|
|
338
|
+
expect(result.permission).toBe("WRITE");
|
|
339
|
+
});
|
|
340
|
+
it("should allow user to read via group permission", async () => {
|
|
341
|
+
const group = await service.createGroup("Readers");
|
|
342
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
343
|
+
await service.grantGroupPermission(documentId, group.id, "READ", adminAddress);
|
|
344
|
+
const result = await service.canReadDocument(documentId, "0xuser");
|
|
345
|
+
expect(result).toBe(true);
|
|
346
|
+
});
|
|
347
|
+
it("should allow user to write via group permission", async () => {
|
|
348
|
+
const group = await service.createGroup("Writers");
|
|
349
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
350
|
+
await service.grantGroupPermission(documentId, group.id, "WRITE", adminAddress);
|
|
351
|
+
const result = await service.canWriteDocument(documentId, "0xuser");
|
|
352
|
+
expect(result).toBe(true);
|
|
353
|
+
});
|
|
354
|
+
it("should return highest group permission level", async () => {
|
|
355
|
+
const readersGroup = await service.createGroup("Readers");
|
|
356
|
+
const writersGroup = await service.createGroup("Writers");
|
|
357
|
+
await service.addUserToGroup("0xuser", readersGroup.id);
|
|
358
|
+
await service.addUserToGroup("0xuser", writersGroup.id);
|
|
359
|
+
await service.grantGroupPermission(documentId, readersGroup.id, "READ", adminAddress);
|
|
360
|
+
await service.grantGroupPermission(documentId, writersGroup.id, "WRITE", adminAddress);
|
|
361
|
+
const groupPermission = await service.getUserGroupPermission(documentId, "0xuser");
|
|
362
|
+
expect(groupPermission).toBe("WRITE");
|
|
363
|
+
});
|
|
364
|
+
it("should revoke group permission", async () => {
|
|
365
|
+
const group = await service.createGroup("TempGroup");
|
|
366
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
367
|
+
await service.grantGroupPermission(documentId, group.id, "READ", adminAddress);
|
|
368
|
+
await service.revokeGroupPermission(documentId, group.id);
|
|
369
|
+
const result = await service.canReadDocument(documentId, "0xuser");
|
|
370
|
+
expect(result).toBe(false);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
describe("Operation Permissions", () => {
|
|
374
|
+
const documentId = "doc-123";
|
|
375
|
+
const operationType = "SET_NAME";
|
|
376
|
+
const adminAddress = "0xAdmin";
|
|
377
|
+
describe("User operation permissions", () => {
|
|
378
|
+
it("should grant operation permission to user", async () => {
|
|
379
|
+
const result = await service.grantOperationPermission(documentId, operationType, "0xuser", adminAddress);
|
|
380
|
+
expect(result.documentId).toBe(documentId);
|
|
381
|
+
expect(result.operationType).toBe(operationType);
|
|
382
|
+
expect(result.userAddress).toBe("0xuser");
|
|
383
|
+
});
|
|
384
|
+
it("should check if user can execute operation", async () => {
|
|
385
|
+
await service.grantOperationPermission(documentId, operationType, "0xuser", adminAddress);
|
|
386
|
+
const result = await service.canExecuteOperation(documentId, operationType, "0xuser");
|
|
387
|
+
expect(result).toBe(true);
|
|
388
|
+
});
|
|
389
|
+
it("should return false when user has no operation permission", async () => {
|
|
390
|
+
const result = await service.canExecuteOperation(documentId, operationType, "0xunknown");
|
|
391
|
+
expect(result).toBe(false);
|
|
392
|
+
});
|
|
393
|
+
it("should revoke operation permission", async () => {
|
|
394
|
+
await service.grantOperationPermission(documentId, operationType, "0xuser", adminAddress);
|
|
395
|
+
await service.revokeOperationPermission(documentId, operationType, "0xuser");
|
|
396
|
+
const result = await service.canExecuteOperation(documentId, operationType, "0xuser");
|
|
397
|
+
expect(result).toBe(false);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
describe("Group operation permissions", () => {
|
|
401
|
+
it("should grant operation permission to group", async () => {
|
|
402
|
+
const group = await service.createGroup("Operators");
|
|
403
|
+
const result = await service.grantGroupOperationPermission(documentId, operationType, group.id, adminAddress);
|
|
404
|
+
expect(result.documentId).toBe(documentId);
|
|
405
|
+
expect(result.operationType).toBe(operationType);
|
|
406
|
+
expect(result.groupId).toBe(group.id);
|
|
407
|
+
});
|
|
408
|
+
it("should allow user to execute operation via group", async () => {
|
|
409
|
+
const group = await service.createGroup("Operators");
|
|
410
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
411
|
+
await service.grantGroupOperationPermission(documentId, operationType, group.id, adminAddress);
|
|
412
|
+
const result = await service.canExecuteOperation(documentId, operationType, "0xuser");
|
|
413
|
+
expect(result).toBe(true);
|
|
414
|
+
});
|
|
415
|
+
it("should revoke group operation permission", async () => {
|
|
416
|
+
const group = await service.createGroup("TempOps");
|
|
417
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
418
|
+
await service.grantGroupOperationPermission(documentId, operationType, group.id, adminAddress);
|
|
419
|
+
await service.revokeGroupOperationPermission(documentId, operationType, group.id);
|
|
420
|
+
const result = await service.canExecuteOperation(documentId, operationType, "0xuser");
|
|
421
|
+
expect(result).toBe(false);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
describe("isOperationRestricted", () => {
|
|
425
|
+
it("should return false when no permissions are set", async () => {
|
|
426
|
+
const result = await service.isOperationRestricted(documentId, operationType);
|
|
427
|
+
expect(result).toBe(false);
|
|
428
|
+
});
|
|
429
|
+
it("should return true when user permission is set", async () => {
|
|
430
|
+
await service.grantOperationPermission(documentId, operationType, "0xuser", adminAddress);
|
|
431
|
+
const result = await service.isOperationRestricted(documentId, operationType);
|
|
432
|
+
expect(result).toBe(true);
|
|
433
|
+
});
|
|
434
|
+
it("should return true when group permission is set", async () => {
|
|
435
|
+
const group = await service.createGroup("Operators");
|
|
436
|
+
await service.grantGroupOperationPermission(documentId, operationType, group.id, adminAddress);
|
|
437
|
+
const result = await service.isOperationRestricted(documentId, operationType);
|
|
438
|
+
expect(result).toBe(true);
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
describe("Delete All Document Permissions", () => {
|
|
443
|
+
it("should delete all permissions for a document", async () => {
|
|
444
|
+
const documentId = "doc-to-delete";
|
|
445
|
+
const adminAddress = "0xAdmin";
|
|
446
|
+
// Create various permissions
|
|
447
|
+
await service.grantPermission(documentId, "0xuser1", "READ", adminAddress);
|
|
448
|
+
await service.grantPermission(documentId, "0xuser2", "WRITE", adminAddress);
|
|
449
|
+
const group = await service.createGroup("TestGroup");
|
|
450
|
+
await service.grantGroupPermission(documentId, group.id, "READ", adminAddress);
|
|
451
|
+
await service.grantOperationPermission(documentId, "SET_NAME", "0xuser1", adminAddress);
|
|
452
|
+
await service.grantGroupOperationPermission(documentId, "SET_NAME", group.id, adminAddress);
|
|
453
|
+
// Delete all permissions
|
|
454
|
+
await service.deleteAllDocumentPermissions(documentId);
|
|
455
|
+
// Verify all permissions are gone
|
|
456
|
+
const userPermissions = await service.getDocumentPermissions(documentId);
|
|
457
|
+
expect(userPermissions).toHaveLength(0);
|
|
458
|
+
const groupPermissions = await service.getDocumentGroupPermissions(documentId);
|
|
459
|
+
expect(groupPermissions).toHaveLength(0);
|
|
460
|
+
const opUserPerms = await service.getOperationUserPermissions(documentId, "SET_NAME");
|
|
461
|
+
expect(opUserPerms).toHaveLength(0);
|
|
462
|
+
const opGroupPerms = await service.getOperationGroupPermissions(documentId, "SET_NAME");
|
|
463
|
+
expect(opGroupPerms).toHaveLength(0);
|
|
464
|
+
});
|
|
465
|
+
});
|
|
466
|
+
describe("Edge Cases", () => {
|
|
467
|
+
it("should handle empty user address for canExecuteOperation", async () => {
|
|
468
|
+
const result = await service.canExecuteOperation("doc", "op", undefined);
|
|
469
|
+
expect(result).toBe(false);
|
|
470
|
+
});
|
|
471
|
+
it("should handle duplicate group membership gracefully", async () => {
|
|
472
|
+
const group = await service.createGroup("Test");
|
|
473
|
+
await service.addUserToGroup("0xuser", group.id);
|
|
474
|
+
await service.addUserToGroup("0xuser", group.id); // Duplicate
|
|
475
|
+
const members = await service.getGroupMembers(group.id);
|
|
476
|
+
expect(members).toHaveLength(1);
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
});
|
|
480
|
+
//# sourceMappingURL=document-permission.service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-permission.service.test.js","sourceRoot":"","sources":["../../test/document-permission.service.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive-subgraph-permissions.test.d.ts","sourceRoot":"","sources":["../../test/drive-subgraph-permissions.test.ts"],"names":[],"mappings":""}
|