@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,421 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ReactorSubgraph } from "../src/graphql/reactor/subgraph.js";
|
|
3
|
+
import { runMigrations } from "../src/migrations/index.js";
|
|
4
|
+
import { DocumentPermissionService } from "../src/services/document-permission.service.js";
|
|
5
|
+
import { getDbClient } from "../src/utils/db.js";
|
|
6
|
+
/**
|
|
7
|
+
* Integration tests for document permissions with the ReactorSubgraph.
|
|
8
|
+
* These tests use a real DocumentPermissionService with an in-memory database.
|
|
9
|
+
*/
|
|
10
|
+
describe("Permissions Integration Tests", () => {
|
|
11
|
+
let documentPermissionService;
|
|
12
|
+
let mockReactorClient;
|
|
13
|
+
let reactorSubgraph;
|
|
14
|
+
let db;
|
|
15
|
+
// Mock document data
|
|
16
|
+
const createMockDocument = (id, name) => ({
|
|
17
|
+
header: {
|
|
18
|
+
id,
|
|
19
|
+
slug: id,
|
|
20
|
+
name,
|
|
21
|
+
documentType: "powerhouse/document-drive",
|
|
22
|
+
revision: { global: 1 },
|
|
23
|
+
createdAtUtcIso: new Date().toISOString(),
|
|
24
|
+
lastModifiedAtUtcIso: new Date().toISOString(),
|
|
25
|
+
},
|
|
26
|
+
state: {
|
|
27
|
+
global: { name },
|
|
28
|
+
local: {},
|
|
29
|
+
},
|
|
30
|
+
initialState: {
|
|
31
|
+
global: { name },
|
|
32
|
+
local: {},
|
|
33
|
+
},
|
|
34
|
+
operations: {
|
|
35
|
+
global: [],
|
|
36
|
+
local: [],
|
|
37
|
+
},
|
|
38
|
+
attachments: {},
|
|
39
|
+
clipboard: [],
|
|
40
|
+
});
|
|
41
|
+
const mockDocument = createMockDocument("doc-123", "Test Document");
|
|
42
|
+
const mockChildDocument = createMockDocument("child-doc", "Child Document");
|
|
43
|
+
const mockParentDocument = createMockDocument("parent-doc", "Parent Document");
|
|
44
|
+
// Context factory
|
|
45
|
+
const createContext = (options) => ({
|
|
46
|
+
user: options.userAddress ? { address: options.userAddress } : undefined,
|
|
47
|
+
isAdmin: () => options.isAdmin ?? false,
|
|
48
|
+
isUser: () => options.isUser ?? false,
|
|
49
|
+
isGuest: () => options.isGuest ?? false,
|
|
50
|
+
});
|
|
51
|
+
beforeEach(async () => {
|
|
52
|
+
vi.clearAllMocks();
|
|
53
|
+
// Create real in-memory database and permission service
|
|
54
|
+
const { db: dbClient } = getDbClient();
|
|
55
|
+
db = dbClient;
|
|
56
|
+
await runMigrations(db);
|
|
57
|
+
documentPermissionService = new DocumentPermissionService(db);
|
|
58
|
+
// Create mock ReactorClient with parent hierarchy
|
|
59
|
+
mockReactorClient = {
|
|
60
|
+
get: vi.fn().mockImplementation(async (id) => {
|
|
61
|
+
if (id === "doc-123")
|
|
62
|
+
return { document: mockDocument, childIds: [] };
|
|
63
|
+
if (id === "child-doc")
|
|
64
|
+
return { document: mockChildDocument, childIds: [] };
|
|
65
|
+
if (id === "parent-doc")
|
|
66
|
+
return { document: mockParentDocument, childIds: ["child-doc"] };
|
|
67
|
+
return { document: null, childIds: [] };
|
|
68
|
+
}),
|
|
69
|
+
getChildren: vi.fn().mockResolvedValue({
|
|
70
|
+
results: [],
|
|
71
|
+
options: { limit: 10, cursor: "" },
|
|
72
|
+
}),
|
|
73
|
+
getParents: vi.fn().mockImplementation(async (id) => {
|
|
74
|
+
// child-doc has parent-doc as parent
|
|
75
|
+
if (id === "child-doc") {
|
|
76
|
+
return {
|
|
77
|
+
results: [mockParentDocument],
|
|
78
|
+
options: { limit: 10, cursor: "" },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
results: [],
|
|
83
|
+
options: { limit: 10, cursor: "" },
|
|
84
|
+
};
|
|
85
|
+
}),
|
|
86
|
+
find: vi.fn().mockResolvedValue({
|
|
87
|
+
results: [mockDocument],
|
|
88
|
+
options: { limit: 10, cursor: "" },
|
|
89
|
+
}),
|
|
90
|
+
create: vi.fn().mockResolvedValue(mockDocument),
|
|
91
|
+
createEmpty: vi.fn().mockResolvedValue(mockDocument),
|
|
92
|
+
execute: vi.fn().mockResolvedValue(mockDocument),
|
|
93
|
+
executeAsync: vi.fn().mockResolvedValue("job-123"),
|
|
94
|
+
rename: vi.fn().mockResolvedValue(mockDocument),
|
|
95
|
+
addChildren: vi.fn().mockResolvedValue(mockParentDocument),
|
|
96
|
+
removeChildren: vi.fn().mockResolvedValue(mockParentDocument),
|
|
97
|
+
moveChildren: vi.fn().mockResolvedValue({
|
|
98
|
+
source: mockParentDocument,
|
|
99
|
+
target: mockParentDocument,
|
|
100
|
+
}),
|
|
101
|
+
deleteDocument: vi.fn().mockResolvedValue(true),
|
|
102
|
+
deleteDocuments: vi.fn().mockResolvedValue(true),
|
|
103
|
+
getDocumentModels: vi
|
|
104
|
+
.fn()
|
|
105
|
+
.mockResolvedValue({ results: [], options: {} }),
|
|
106
|
+
getJobStatus: vi.fn(),
|
|
107
|
+
waitForJob: vi.fn(),
|
|
108
|
+
subscribe: vi.fn(),
|
|
109
|
+
};
|
|
110
|
+
reactorSubgraph = new ReactorSubgraph({
|
|
111
|
+
reactorClient: mockReactorClient,
|
|
112
|
+
documentPermissionService,
|
|
113
|
+
reactor: {},
|
|
114
|
+
relationalDb: {},
|
|
115
|
+
analyticsStore: {},
|
|
116
|
+
graphqlManager: {},
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
afterEach(async () => {
|
|
120
|
+
await db.destroy();
|
|
121
|
+
});
|
|
122
|
+
describe("Document Query with Real Permission Service", () => {
|
|
123
|
+
const callDocument = async (ctx, identifier) => {
|
|
124
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
125
|
+
return query(null, { identifier }, ctx);
|
|
126
|
+
};
|
|
127
|
+
it("should deny access when user has no permission", async () => {
|
|
128
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
129
|
+
await expect(callDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
|
|
130
|
+
});
|
|
131
|
+
it("should allow access when user has READ permission", async () => {
|
|
132
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
133
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
134
|
+
const result = await callDocument(ctx, "doc-123");
|
|
135
|
+
expect(result).toBeDefined();
|
|
136
|
+
expect(result.document.id).toBe("doc-123");
|
|
137
|
+
});
|
|
138
|
+
it("should allow access when user has WRITE permission", async () => {
|
|
139
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
|
|
140
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
141
|
+
const result = await callDocument(ctx, "doc-123");
|
|
142
|
+
expect(result).toBeDefined();
|
|
143
|
+
});
|
|
144
|
+
it("should allow access when user has ADMIN permission", async () => {
|
|
145
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "ADMIN", "0xadmin");
|
|
146
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
147
|
+
const result = await callDocument(ctx, "doc-123");
|
|
148
|
+
expect(result).toBeDefined();
|
|
149
|
+
});
|
|
150
|
+
it("should allow access via group permission", async () => {
|
|
151
|
+
const group = await documentPermissionService.createGroup("Readers");
|
|
152
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
153
|
+
await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
|
|
154
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
155
|
+
const result = await callDocument(ctx, "doc-123");
|
|
156
|
+
expect(result).toBeDefined();
|
|
157
|
+
});
|
|
158
|
+
it("should be case-insensitive for user addresses", async () => {
|
|
159
|
+
await documentPermissionService.grantPermission("doc-123", "0xABCDEF", "READ", "0xadmin");
|
|
160
|
+
const ctx = createContext({ userAddress: "0xabcdef" });
|
|
161
|
+
const result = await callDocument(ctx, "doc-123");
|
|
162
|
+
expect(result).toBeDefined();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("Permission Inheritance via Parent Hierarchy", () => {
|
|
166
|
+
const callDocument = async (ctx, identifier) => {
|
|
167
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
168
|
+
return query(null, { identifier }, ctx);
|
|
169
|
+
};
|
|
170
|
+
it("should allow access to child when user has permission on parent", async () => {
|
|
171
|
+
// Grant permission on parent document
|
|
172
|
+
await documentPermissionService.grantPermission("parent-doc", "0xuser", "READ", "0xadmin");
|
|
173
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
174
|
+
// Should be able to access child document via inheritance
|
|
175
|
+
const result = await callDocument(ctx, "child-doc");
|
|
176
|
+
expect(result).toBeDefined();
|
|
177
|
+
expect(result.document.id).toBe("child-doc");
|
|
178
|
+
});
|
|
179
|
+
it("should deny access to child when user has no permission in hierarchy", async () => {
|
|
180
|
+
// Grant permission on different document (not in hierarchy)
|
|
181
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
182
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
183
|
+
// Should not be able to access child document
|
|
184
|
+
await expect(callDocument(ctx, "child-doc")).rejects.toThrow("Forbidden");
|
|
185
|
+
});
|
|
186
|
+
it("should allow direct permission even without parent permission", async () => {
|
|
187
|
+
// Grant permission directly on child
|
|
188
|
+
await documentPermissionService.grantPermission("child-doc", "0xuser", "READ", "0xadmin");
|
|
189
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
190
|
+
const result = await callDocument(ctx, "child-doc");
|
|
191
|
+
expect(result).toBeDefined();
|
|
192
|
+
});
|
|
193
|
+
it("should allow child access via group permission on parent", async () => {
|
|
194
|
+
const group = await documentPermissionService.createGroup("ParentReaders");
|
|
195
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
196
|
+
await documentPermissionService.grantGroupPermission("parent-doc", group.id, "READ", "0xadmin");
|
|
197
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
198
|
+
const result = await callDocument(ctx, "child-doc");
|
|
199
|
+
expect(result).toBeDefined();
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
describe("Mutation Permissions with Real Permission Service", () => {
|
|
203
|
+
describe("deleteDocument", () => {
|
|
204
|
+
const callDeleteDocument = async (ctx, identifier) => {
|
|
205
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
206
|
+
?.deleteDocument;
|
|
207
|
+
return mutation(null, { identifier }, ctx);
|
|
208
|
+
};
|
|
209
|
+
it("should deny delete when user has only READ permission", async () => {
|
|
210
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
211
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
212
|
+
await expect(callDeleteDocument(ctx, "doc-123")).rejects.toThrow("Forbidden");
|
|
213
|
+
});
|
|
214
|
+
it("should allow delete when user has WRITE permission", async () => {
|
|
215
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
|
|
216
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
217
|
+
const result = await callDeleteDocument(ctx, "doc-123");
|
|
218
|
+
expect(result).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
it("should allow delete when user has ADMIN permission", async () => {
|
|
221
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "ADMIN", "0xadmin");
|
|
222
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
223
|
+
const result = await callDeleteDocument(ctx, "doc-123");
|
|
224
|
+
expect(result).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
it("should allow delete via group WRITE permission", async () => {
|
|
227
|
+
const group = await documentPermissionService.createGroup("Writers");
|
|
228
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
229
|
+
await documentPermissionService.grantGroupPermission("doc-123", group.id, "WRITE", "0xadmin");
|
|
230
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
231
|
+
const result = await callDeleteDocument(ctx, "doc-123");
|
|
232
|
+
expect(result).toBe(true);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe("moveChildren", () => {
|
|
236
|
+
const callMoveChildren = async (ctx, sourceId, targetId) => {
|
|
237
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
238
|
+
?.moveChildren;
|
|
239
|
+
return mutation(null, {
|
|
240
|
+
sourceParentIdentifier: sourceId,
|
|
241
|
+
targetParentIdentifier: targetId,
|
|
242
|
+
documentIdentifiers: ["child-doc"],
|
|
243
|
+
}, ctx);
|
|
244
|
+
};
|
|
245
|
+
it("should deny move when user lacks write permission on source", async () => {
|
|
246
|
+
await documentPermissionService.grantPermission("parent-doc", "0xuser", "READ", "0xadmin");
|
|
247
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
|
|
248
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
249
|
+
await expect(callMoveChildren(ctx, "parent-doc", "doc-123")).rejects.toThrow("Forbidden");
|
|
250
|
+
});
|
|
251
|
+
it("should deny move when user lacks write permission on target", async () => {
|
|
252
|
+
await documentPermissionService.grantPermission("parent-doc", "0xuser", "WRITE", "0xadmin");
|
|
253
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
254
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
255
|
+
await expect(callMoveChildren(ctx, "parent-doc", "doc-123")).rejects.toThrow("Forbidden");
|
|
256
|
+
});
|
|
257
|
+
it("should allow move when user has write permission on both", async () => {
|
|
258
|
+
await documentPermissionService.grantPermission("parent-doc", "0xuser", "WRITE", "0xadmin");
|
|
259
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "WRITE", "0xadmin");
|
|
260
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
261
|
+
const result = await callMoveChildren(ctx, "parent-doc", "doc-123");
|
|
262
|
+
expect(result).toBeDefined();
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe("findDocuments Filtering with Real Permission Service", () => {
|
|
267
|
+
const callFindDocuments = async (ctx) => {
|
|
268
|
+
const query = reactorSubgraph.resolvers.Query?.findDocuments;
|
|
269
|
+
return query(null, { search: { type: "powerhouse/document-drive" } }, ctx);
|
|
270
|
+
};
|
|
271
|
+
beforeEach(() => {
|
|
272
|
+
// Setup find to return multiple documents
|
|
273
|
+
const doc1 = createMockDocument("doc-1", "Doc 1");
|
|
274
|
+
const doc2 = createMockDocument("doc-2", "Doc 2");
|
|
275
|
+
const doc3 = createMockDocument("doc-3", "Doc 3");
|
|
276
|
+
vi.mocked(mockReactorClient.find).mockResolvedValue({
|
|
277
|
+
results: [doc1, doc2, doc3],
|
|
278
|
+
options: { limit: 10 },
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
it("should filter results based on user permissions", async () => {
|
|
282
|
+
// Grant permission only on doc-1 and doc-3
|
|
283
|
+
await documentPermissionService.grantPermission("doc-1", "0xuser", "READ", "0xadmin");
|
|
284
|
+
await documentPermissionService.grantPermission("doc-3", "0xuser", "READ", "0xadmin");
|
|
285
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
286
|
+
const result = await callFindDocuments(ctx);
|
|
287
|
+
expect(result.items).toHaveLength(2);
|
|
288
|
+
expect(result.items.map((d) => d.id).sort()).toEqual([
|
|
289
|
+
"doc-1",
|
|
290
|
+
"doc-3",
|
|
291
|
+
]);
|
|
292
|
+
});
|
|
293
|
+
it("should return empty when user has no permissions", async () => {
|
|
294
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
295
|
+
const result = await callFindDocuments(ctx);
|
|
296
|
+
expect(result.items).toHaveLength(0);
|
|
297
|
+
});
|
|
298
|
+
it("should include documents accessible via groups", async () => {
|
|
299
|
+
const group = await documentPermissionService.createGroup("DocReaders");
|
|
300
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
301
|
+
await documentPermissionService.grantGroupPermission("doc-2", group.id, "READ", "0xadmin");
|
|
302
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
303
|
+
const result = await callFindDocuments(ctx);
|
|
304
|
+
expect(result.items).toHaveLength(1);
|
|
305
|
+
expect(result.items[0].id).toBe("doc-2");
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe("Global Role Override", () => {
|
|
309
|
+
const callDocument = async (ctx) => {
|
|
310
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
311
|
+
return query(null, { identifier: "doc-123" }, ctx);
|
|
312
|
+
};
|
|
313
|
+
it("should allow admin access without document permission", async () => {
|
|
314
|
+
// No document permission granted
|
|
315
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
316
|
+
const result = await callDocument(ctx);
|
|
317
|
+
expect(result).toBeDefined();
|
|
318
|
+
});
|
|
319
|
+
it("should allow user access without document permission", async () => {
|
|
320
|
+
// No document permission granted
|
|
321
|
+
const ctx = createContext({ isUser: true, userAddress: "0xuser" });
|
|
322
|
+
const result = await callDocument(ctx);
|
|
323
|
+
expect(result).toBeDefined();
|
|
324
|
+
});
|
|
325
|
+
it("should allow guest read access without document permission", async () => {
|
|
326
|
+
// No document permission granted
|
|
327
|
+
const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
|
|
328
|
+
const result = await callDocument(ctx);
|
|
329
|
+
expect(result).toBeDefined();
|
|
330
|
+
});
|
|
331
|
+
it("global role should take precedence over document permission check", async () => {
|
|
332
|
+
// Grant conflicting permission (just to show global role wins)
|
|
333
|
+
await documentPermissionService.grantPermission("doc-123", "0xother", "READ", "0xadmin");
|
|
334
|
+
// This user has global admin but no document permission
|
|
335
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
336
|
+
const result = await callDocument(ctx);
|
|
337
|
+
expect(result).toBeDefined();
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe("Permission Revocation Flow", () => {
|
|
341
|
+
const callDocument = async (ctx) => {
|
|
342
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
343
|
+
return query(null, { identifier: "doc-123" }, ctx);
|
|
344
|
+
};
|
|
345
|
+
it("should deny access after permission is revoked", async () => {
|
|
346
|
+
// Grant permission
|
|
347
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
348
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
349
|
+
// Should have access
|
|
350
|
+
const result1 = await callDocument(ctx);
|
|
351
|
+
expect(result1).toBeDefined();
|
|
352
|
+
// Revoke permission
|
|
353
|
+
await documentPermissionService.revokePermission("doc-123", "0xuser");
|
|
354
|
+
// Should no longer have access
|
|
355
|
+
await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
|
|
356
|
+
});
|
|
357
|
+
it("should deny access after group membership is removed", async () => {
|
|
358
|
+
const group = await documentPermissionService.createGroup("TempReaders");
|
|
359
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
360
|
+
await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
|
|
361
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
362
|
+
// Should have access via group
|
|
363
|
+
const result1 = await callDocument(ctx);
|
|
364
|
+
expect(result1).toBeDefined();
|
|
365
|
+
// Remove from group
|
|
366
|
+
await documentPermissionService.removeUserFromGroup("0xuser", group.id);
|
|
367
|
+
// Should no longer have access
|
|
368
|
+
await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
|
|
369
|
+
});
|
|
370
|
+
it("should deny access after group permission is revoked", async () => {
|
|
371
|
+
const group = await documentPermissionService.createGroup("TempReaders");
|
|
372
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
373
|
+
await documentPermissionService.grantGroupPermission("doc-123", group.id, "READ", "0xadmin");
|
|
374
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
375
|
+
// Should have access via group
|
|
376
|
+
const result1 = await callDocument(ctx);
|
|
377
|
+
expect(result1).toBeDefined();
|
|
378
|
+
// Revoke group permission
|
|
379
|
+
await documentPermissionService.revokeGroupPermission("doc-123", group.id);
|
|
380
|
+
// Should no longer have access
|
|
381
|
+
await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
describe("Complex Permission Scenarios", () => {
|
|
385
|
+
it("should use highest permission from multiple groups", async () => {
|
|
386
|
+
const readersGroup = await documentPermissionService.createGroup("Readers");
|
|
387
|
+
const writersGroup = await documentPermissionService.createGroup("Writers");
|
|
388
|
+
await documentPermissionService.addUserToGroup("0xuser", readersGroup.id);
|
|
389
|
+
await documentPermissionService.addUserToGroup("0xuser", writersGroup.id);
|
|
390
|
+
await documentPermissionService.grantGroupPermission("doc-123", readersGroup.id, "READ", "0xadmin");
|
|
391
|
+
await documentPermissionService.grantGroupPermission("doc-123", writersGroup.id, "WRITE", "0xadmin");
|
|
392
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
393
|
+
// Should be able to delete (requires WRITE)
|
|
394
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
395
|
+
?.deleteDocument;
|
|
396
|
+
const result = await mutation(null, { identifier: "doc-123" }, ctx);
|
|
397
|
+
expect(result).toBe(true);
|
|
398
|
+
});
|
|
399
|
+
it("should combine direct and group permissions", async () => {
|
|
400
|
+
// User has direct READ on doc-123
|
|
401
|
+
await documentPermissionService.grantPermission("doc-123", "0xuser", "READ", "0xadmin");
|
|
402
|
+
// User is in group with WRITE on different document (parent-doc)
|
|
403
|
+
const group = await documentPermissionService.createGroup("ParentWriters");
|
|
404
|
+
await documentPermissionService.addUserToGroup("0xuser", group.id);
|
|
405
|
+
await documentPermissionService.grantGroupPermission("parent-doc", group.id, "WRITE", "0xadmin");
|
|
406
|
+
const ctx = createContext({ userAddress: "0xuser" });
|
|
407
|
+
// Can read doc-123 (direct permission)
|
|
408
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
409
|
+
const readResult = await query(null, { identifier: "doc-123" }, ctx);
|
|
410
|
+
expect(readResult).toBeDefined();
|
|
411
|
+
// Cannot write doc-123 (only has READ)
|
|
412
|
+
const deleteMutation = reactorSubgraph.resolvers.Mutation
|
|
413
|
+
?.deleteDocument;
|
|
414
|
+
await expect(deleteMutation(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
|
|
415
|
+
// Can write parent-doc (group permission)
|
|
416
|
+
const deleteParent = await deleteMutation(null, { identifier: "parent-doc" }, ctx);
|
|
417
|
+
expect(deleteParent).toBe(true);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
//# sourceMappingURL=permissions-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions-integration.test.js","sourceRoot":"","sources":["../../test/permissions-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor-subgraph-permissions.test.d.ts","sourceRoot":"","sources":["../../test/reactor-subgraph-permissions.test.ts"],"names":[],"mappings":""}
|