@powerhousedao/reactor-api 5.1.0 → 5.2.0-staging.2
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/codegen.js +2 -2
- package/dist/codegen.js.map +1 -1
- 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 +4 -1
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +4 -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 -15
- 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/adapters.js +1 -1
- package/dist/src/graphql/reactor/adapters.js.map +1 -1
- package/dist/src/graphql/reactor/factory.d.ts +4 -4
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +295 -64
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +121 -8
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +253 -0
- package/dist/src/graphql/reactor/pubsub.d.ts +2 -2
- package/dist/src/graphql/reactor/pubsub.d.ts.map +1 -1
- package/dist/src/graphql/reactor/pubsub.js +2 -1
- package/dist/src/graphql/reactor/pubsub.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +48 -17
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +114 -34
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +429 -0
- 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 +325 -22
- 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 +5 -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 -7
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +49 -27
- 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 +32 -22
- 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 +5 -4
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +110 -4
- 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-adapters.test.js +2 -2
- package/dist/test/reactor-adapters.test.js.map +1 -1
- package/dist/test/reactor-resolvers.test.js +24 -24
- package/dist/test/reactor-resolvers.test.js.map +1 -1
- 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.d.ts +2 -0
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +1 -0
- package/dist/test/two-reactor-gql-sync.test.js +298 -0
- package/dist/test/two-reactor-gql-sync.test.js.map +1 -0
- package/dist/test/utils/gql-resolver-bridge.d.ts +12 -0
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -0
- package/dist/test/utils/gql-resolver-bridge.js +60 -0
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -9
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { ReactorSubgraph } from "../src/graphql/reactor/subgraph.js";
|
|
3
|
+
describe("ReactorSubgraph Permission Checks", () => {
|
|
4
|
+
let mockDocumentPermissionService;
|
|
5
|
+
let mockReactorClient;
|
|
6
|
+
let reactorSubgraph;
|
|
7
|
+
// Mock document data with full structure expected by resolvers
|
|
8
|
+
const createMockDocument = (id, name) => ({
|
|
9
|
+
header: {
|
|
10
|
+
id,
|
|
11
|
+
slug: id,
|
|
12
|
+
name,
|
|
13
|
+
documentType: "test/document",
|
|
14
|
+
revision: { global: 1 },
|
|
15
|
+
createdAtUtcIso: new Date().toISOString(),
|
|
16
|
+
lastModifiedAtUtcIso: new Date().toISOString(),
|
|
17
|
+
},
|
|
18
|
+
state: {
|
|
19
|
+
global: { name },
|
|
20
|
+
local: {},
|
|
21
|
+
},
|
|
22
|
+
initialState: {
|
|
23
|
+
global: { name },
|
|
24
|
+
local: {},
|
|
25
|
+
},
|
|
26
|
+
operations: {
|
|
27
|
+
global: [],
|
|
28
|
+
local: [],
|
|
29
|
+
},
|
|
30
|
+
attachments: {},
|
|
31
|
+
clipboard: [],
|
|
32
|
+
});
|
|
33
|
+
const mockDocument = createMockDocument("doc-123", "Test Document");
|
|
34
|
+
const mockParentDocument = createMockDocument("parent-123", "Parent Document");
|
|
35
|
+
// Helper to create context with different permission levels
|
|
36
|
+
const createContext = (options) => ({
|
|
37
|
+
user: options.userAddress ? { address: options.userAddress } : undefined,
|
|
38
|
+
isAdmin: () => options.isAdmin ?? false,
|
|
39
|
+
isUser: () => options.isUser ?? false,
|
|
40
|
+
isGuest: () => options.isGuest ?? false,
|
|
41
|
+
});
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
vi.clearAllMocks();
|
|
44
|
+
// Create mock DocumentPermissionService
|
|
45
|
+
mockDocumentPermissionService = {
|
|
46
|
+
canReadDocument: vi.fn().mockResolvedValue(false),
|
|
47
|
+
canWriteDocument: vi.fn().mockResolvedValue(false),
|
|
48
|
+
canRead: vi.fn().mockResolvedValue(false),
|
|
49
|
+
canWrite: vi.fn().mockResolvedValue(false),
|
|
50
|
+
};
|
|
51
|
+
// Create mock ReactorClient
|
|
52
|
+
// Note: get() returns { document, childIds }
|
|
53
|
+
mockReactorClient = {
|
|
54
|
+
get: vi.fn().mockResolvedValue({ document: mockDocument, childIds: [] }),
|
|
55
|
+
getChildren: vi.fn().mockResolvedValue({
|
|
56
|
+
results: [],
|
|
57
|
+
options: { limit: 10, cursor: "" },
|
|
58
|
+
}),
|
|
59
|
+
getParents: vi.fn().mockResolvedValue({
|
|
60
|
+
results: [],
|
|
61
|
+
options: { limit: 10, cursor: "" },
|
|
62
|
+
}),
|
|
63
|
+
find: vi.fn().mockResolvedValue({
|
|
64
|
+
results: [mockDocument],
|
|
65
|
+
options: { limit: 10, cursor: "" },
|
|
66
|
+
}),
|
|
67
|
+
create: vi.fn().mockResolvedValue(mockDocument),
|
|
68
|
+
createEmpty: vi.fn().mockResolvedValue(mockDocument),
|
|
69
|
+
execute: vi.fn().mockResolvedValue(mockDocument),
|
|
70
|
+
executeAsync: vi.fn().mockResolvedValue("job-123"),
|
|
71
|
+
rename: vi.fn().mockResolvedValue(mockDocument),
|
|
72
|
+
addChildren: vi.fn().mockResolvedValue(mockParentDocument),
|
|
73
|
+
removeChildren: vi.fn().mockResolvedValue(mockParentDocument),
|
|
74
|
+
moveChildren: vi.fn().mockResolvedValue({
|
|
75
|
+
source: mockParentDocument,
|
|
76
|
+
target: mockParentDocument,
|
|
77
|
+
}),
|
|
78
|
+
deleteDocument: vi.fn().mockResolvedValue(true),
|
|
79
|
+
deleteDocuments: vi.fn().mockResolvedValue(true),
|
|
80
|
+
getDocumentModels: vi
|
|
81
|
+
.fn()
|
|
82
|
+
.mockResolvedValue({ results: [], options: {} }),
|
|
83
|
+
getJobStatus: vi.fn(),
|
|
84
|
+
waitForJob: vi.fn(),
|
|
85
|
+
subscribe: vi.fn(),
|
|
86
|
+
};
|
|
87
|
+
reactorSubgraph = new ReactorSubgraph({
|
|
88
|
+
reactorClient: mockReactorClient,
|
|
89
|
+
documentPermissionService: mockDocumentPermissionService,
|
|
90
|
+
reactor: {},
|
|
91
|
+
relationalDb: {},
|
|
92
|
+
analyticsStore: {},
|
|
93
|
+
graphqlManager: {},
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
describe("Query: document", () => {
|
|
97
|
+
const callDocument = async (ctx) => {
|
|
98
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
99
|
+
return query(null, { identifier: "doc-123" }, ctx);
|
|
100
|
+
};
|
|
101
|
+
describe("Global Role Access", () => {
|
|
102
|
+
it("should allow access when user is global admin", async () => {
|
|
103
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
104
|
+
const result = await callDocument(ctx);
|
|
105
|
+
expect(result).toBeDefined();
|
|
106
|
+
expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
it("should allow access when user is global user", async () => {
|
|
109
|
+
const ctx = createContext({ isUser: true, userAddress: "0xuser" });
|
|
110
|
+
const result = await callDocument(ctx);
|
|
111
|
+
expect(result).toBeDefined();
|
|
112
|
+
expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
it("should allow access when user is global guest", async () => {
|
|
115
|
+
const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
|
|
116
|
+
const result = await callDocument(ctx);
|
|
117
|
+
expect(result).toBeDefined();
|
|
118
|
+
expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("Document Permission Access", () => {
|
|
122
|
+
it("should allow access when user has document read permission", async () => {
|
|
123
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
|
|
124
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
125
|
+
const result = await callDocument(ctx);
|
|
126
|
+
expect(result).toBeDefined();
|
|
127
|
+
expect(mockDocumentPermissionService.canRead).toHaveBeenCalled();
|
|
128
|
+
});
|
|
129
|
+
it("should deny access when user has no permissions", async () => {
|
|
130
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
|
|
131
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
132
|
+
await expect(callDocument(ctx)).rejects.toThrow("Forbidden");
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
describe("Query: documentChildren", () => {
|
|
137
|
+
const callDocumentChildren = async (ctx) => {
|
|
138
|
+
const query = reactorSubgraph.resolvers.Query?.documentChildren;
|
|
139
|
+
return query(null, { parentIdentifier: "parent-123" }, ctx);
|
|
140
|
+
};
|
|
141
|
+
it("should allow access when user is global admin", async () => {
|
|
142
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
143
|
+
const result = await callDocumentChildren(ctx);
|
|
144
|
+
expect(result).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
it("should check permission on parent document", async () => {
|
|
147
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
|
|
148
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
149
|
+
await callDocumentChildren(ctx);
|
|
150
|
+
expect(mockDocumentPermissionService.canRead).toHaveBeenCalled();
|
|
151
|
+
});
|
|
152
|
+
it("should deny access when user cannot read parent", async () => {
|
|
153
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
|
|
154
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
155
|
+
await expect(callDocumentChildren(ctx)).rejects.toThrow("Forbidden");
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe("Query: findDocuments", () => {
|
|
159
|
+
const callFindDocuments = async (ctx) => {
|
|
160
|
+
const query = reactorSubgraph.resolvers.Query?.findDocuments;
|
|
161
|
+
return query(null, { search: { type: "test/document" } }, ctx);
|
|
162
|
+
};
|
|
163
|
+
it("should return all results for global admin", async () => {
|
|
164
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
165
|
+
const result = await callFindDocuments(ctx);
|
|
166
|
+
expect(result.items).toHaveLength(1);
|
|
167
|
+
expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
it("should filter results based on permissions when no global access", async () => {
|
|
170
|
+
// First document: user has permission
|
|
171
|
+
// Setup: canRead returns true for first call
|
|
172
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
|
|
173
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
174
|
+
const result = await callFindDocuments(ctx);
|
|
175
|
+
expect(result.items).toHaveLength(1);
|
|
176
|
+
expect(mockDocumentPermissionService.canRead).toHaveBeenCalled();
|
|
177
|
+
});
|
|
178
|
+
it("should return empty results when user has no permissions", async () => {
|
|
179
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(false);
|
|
180
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
181
|
+
const result = await callFindDocuments(ctx);
|
|
182
|
+
expect(result.items).toHaveLength(0);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe("Mutation: createDocument", () => {
|
|
186
|
+
const callCreateDocument = async (ctx, parentIdentifier) => {
|
|
187
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
188
|
+
?.createDocument;
|
|
189
|
+
return mutation(null, {
|
|
190
|
+
document: { documentType: "test/document", state: {} },
|
|
191
|
+
parentIdentifier,
|
|
192
|
+
}, ctx);
|
|
193
|
+
};
|
|
194
|
+
// Helper to verify permission passed (may fail later validation, but NOT due to "Forbidden")
|
|
195
|
+
const expectPermissionPassed = async (promise) => {
|
|
196
|
+
try {
|
|
197
|
+
await promise;
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
// If we get here, make sure it's NOT a permission error
|
|
201
|
+
expect(error.message).not.toContain("Forbidden");
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
describe("Without Parent", () => {
|
|
205
|
+
it("should allow when user is global admin", async () => {
|
|
206
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
207
|
+
// Permission check passes, may fail later validation
|
|
208
|
+
await expectPermissionPassed(callCreateDocument(ctx));
|
|
209
|
+
expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
|
|
210
|
+
});
|
|
211
|
+
it("should allow when user is global user", async () => {
|
|
212
|
+
const ctx = createContext({ isUser: true, userAddress: "0xuser" });
|
|
213
|
+
// Permission check passes, may fail later validation
|
|
214
|
+
await expectPermissionPassed(callCreateDocument(ctx));
|
|
215
|
+
expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
|
|
216
|
+
});
|
|
217
|
+
it("should deny when user is only guest", async () => {
|
|
218
|
+
const ctx = createContext({ isGuest: true, userAddress: "0xguest" });
|
|
219
|
+
await expect(callCreateDocument(ctx)).rejects.toThrow("Forbidden");
|
|
220
|
+
});
|
|
221
|
+
it("should deny when no global access", async () => {
|
|
222
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
223
|
+
await expect(callCreateDocument(ctx)).rejects.toThrow("Forbidden");
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe("With Parent", () => {
|
|
227
|
+
it("should check write permission on parent", async () => {
|
|
228
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
|
|
229
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
230
|
+
// Permission check passes, may fail later validation
|
|
231
|
+
await expectPermissionPassed(callCreateDocument(ctx, "parent-123"));
|
|
232
|
+
expect(mockDocumentPermissionService.canWrite).toHaveBeenCalled();
|
|
233
|
+
});
|
|
234
|
+
it("should deny when user cannot write to parent", async () => {
|
|
235
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
|
|
236
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
237
|
+
await expect(callCreateDocument(ctx, "parent-123")).rejects.toThrow("Forbidden");
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe("Mutation: mutateDocument", () => {
|
|
242
|
+
const callMutateDocument = async (ctx) => {
|
|
243
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
244
|
+
?.mutateDocument;
|
|
245
|
+
return mutation(null, { documentIdentifier: "doc-123", actions: [] }, ctx);
|
|
246
|
+
};
|
|
247
|
+
// Helper to verify permission passed (may fail later validation, but NOT due to "Forbidden")
|
|
248
|
+
const expectPermissionPassed = async (promise) => {
|
|
249
|
+
try {
|
|
250
|
+
await promise;
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
// If we get here, make sure it's NOT a permission error
|
|
254
|
+
expect(error.message).not.toContain("Forbidden");
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
it("should allow when user is global admin", async () => {
|
|
258
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
259
|
+
// Permission check passes, may fail later validation (document model not found)
|
|
260
|
+
await expectPermissionPassed(callMutateDocument(ctx));
|
|
261
|
+
expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
|
|
262
|
+
});
|
|
263
|
+
it("should allow when user has write permission", async () => {
|
|
264
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
|
|
265
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
266
|
+
// Permission check passes, may fail later validation
|
|
267
|
+
await expectPermissionPassed(callMutateDocument(ctx));
|
|
268
|
+
expect(mockDocumentPermissionService.canWrite).toHaveBeenCalled();
|
|
269
|
+
});
|
|
270
|
+
it("should deny when user has no write permission", async () => {
|
|
271
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
|
|
272
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
273
|
+
await expect(callMutateDocument(ctx)).rejects.toThrow("Forbidden");
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe("Mutation: deleteDocument", () => {
|
|
277
|
+
const callDeleteDocument = async (ctx) => {
|
|
278
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
279
|
+
?.deleteDocument;
|
|
280
|
+
return mutation(null, { identifier: "doc-123" }, ctx);
|
|
281
|
+
};
|
|
282
|
+
it("should allow when user is global admin", async () => {
|
|
283
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
284
|
+
const result = await callDeleteDocument(ctx);
|
|
285
|
+
expect(result).toBe(true);
|
|
286
|
+
});
|
|
287
|
+
it("should allow when user has write permission", async () => {
|
|
288
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
|
|
289
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
290
|
+
const result = await callDeleteDocument(ctx);
|
|
291
|
+
expect(result).toBe(true);
|
|
292
|
+
});
|
|
293
|
+
it("should deny when user has no write permission", async () => {
|
|
294
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(false);
|
|
295
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
296
|
+
await expect(callDeleteDocument(ctx)).rejects.toThrow("Forbidden");
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
describe("Mutation: moveChildren", () => {
|
|
300
|
+
const callMoveChildren = async (ctx) => {
|
|
301
|
+
const mutation = reactorSubgraph.resolvers.Mutation
|
|
302
|
+
?.moveChildren;
|
|
303
|
+
return mutation(null, {
|
|
304
|
+
sourceParentIdentifier: "parent-123",
|
|
305
|
+
targetParentIdentifier: "parent-456",
|
|
306
|
+
documentIdentifiers: ["doc-123"],
|
|
307
|
+
}, ctx);
|
|
308
|
+
};
|
|
309
|
+
it("should allow when user is global admin", async () => {
|
|
310
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
311
|
+
const result = await callMoveChildren(ctx);
|
|
312
|
+
expect(result).toBeDefined();
|
|
313
|
+
});
|
|
314
|
+
it("should check write permission on both parents", async () => {
|
|
315
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValue(true);
|
|
316
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
317
|
+
await callMoveChildren(ctx);
|
|
318
|
+
// Should be called twice - once for source, once for target
|
|
319
|
+
expect(mockDocumentPermissionService.canWrite).toHaveBeenCalledTimes(2);
|
|
320
|
+
});
|
|
321
|
+
it("should deny when user cannot write to source parent", async () => {
|
|
322
|
+
vi.mocked(mockDocumentPermissionService.canWrite).mockResolvedValueOnce(false);
|
|
323
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
324
|
+
await expect(callMoveChildren(ctx)).rejects.toThrow("Forbidden");
|
|
325
|
+
});
|
|
326
|
+
it("should deny when user cannot write to target parent", async () => {
|
|
327
|
+
vi.mocked(mockDocumentPermissionService.canWrite)
|
|
328
|
+
.mockResolvedValueOnce(true) // source parent
|
|
329
|
+
.mockResolvedValueOnce(false); // target parent
|
|
330
|
+
const ctx = createContext({ userAddress: "0xunpermitted" });
|
|
331
|
+
await expect(callMoveChildren(ctx)).rejects.toThrow("Forbidden");
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
describe("Permission Inheritance", () => {
|
|
335
|
+
it("should allow access to child when user has permission on parent", async () => {
|
|
336
|
+
// Setup: canRead checks parent hierarchy and finds permission on parent
|
|
337
|
+
vi.mocked(mockDocumentPermissionService.canRead).mockResolvedValue(true);
|
|
338
|
+
const ctx = createContext({ userAddress: "0xpermitted" });
|
|
339
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
340
|
+
const result = await query(null, { identifier: "child-doc" }, ctx);
|
|
341
|
+
expect(result).toBeDefined();
|
|
342
|
+
// The canRead should be called with getParentIdsFn which handles hierarchy
|
|
343
|
+
expect(mockDocumentPermissionService.canRead).toHaveBeenCalled();
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
describe("AUTH_ENABLED=false behavior", () => {
|
|
347
|
+
it("should allow all access when all global roles return true", async () => {
|
|
348
|
+
// When AUTH_ENABLED=false, isAdmin/isUser/isGuest all return true
|
|
349
|
+
const ctx = createContext({
|
|
350
|
+
isAdmin: true,
|
|
351
|
+
isUser: true,
|
|
352
|
+
isGuest: true,
|
|
353
|
+
userAddress: "0xanyone",
|
|
354
|
+
});
|
|
355
|
+
// Test document query - permission check passes
|
|
356
|
+
const docResult = await reactorSubgraph.resolvers.Query?.document(null, { identifier: "doc-123" }, ctx);
|
|
357
|
+
expect(docResult).toBeDefined();
|
|
358
|
+
// Test mutation - permission check passes, may fail later validation
|
|
359
|
+
// but should NOT throw "Forbidden"
|
|
360
|
+
try {
|
|
361
|
+
await reactorSubgraph.resolvers.Mutation?.mutateDocument(null, { documentIdentifier: "doc-123", actions: [] }, ctx);
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
// Ensure it's not a permission error
|
|
365
|
+
expect(error.message).not.toContain("Forbidden");
|
|
366
|
+
}
|
|
367
|
+
// Permission service should never be called (global roles bypass)
|
|
368
|
+
expect(mockDocumentPermissionService.canRead).not.toHaveBeenCalled();
|
|
369
|
+
expect(mockDocumentPermissionService.canWrite).not.toHaveBeenCalled();
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
describe("Edge Cases", () => {
|
|
373
|
+
it("should handle document not found gracefully", async () => {
|
|
374
|
+
// When get() returns null, the resolver throws an error
|
|
375
|
+
vi.mocked(mockReactorClient.get).mockResolvedValue(null);
|
|
376
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
377
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
378
|
+
// Should throw an error (not Forbidden, but a processing error)
|
|
379
|
+
await expect(query(null, { identifier: "non-existent" }, ctx)).rejects.toThrow();
|
|
380
|
+
});
|
|
381
|
+
it("should throw error when document is null in result", async () => {
|
|
382
|
+
// When get() returns { document: null, childIds: [] }, resolver throws
|
|
383
|
+
// because it tries to access document.header
|
|
384
|
+
vi.mocked(mockReactorClient.get).mockResolvedValue({
|
|
385
|
+
document: null,
|
|
386
|
+
childIds: [],
|
|
387
|
+
});
|
|
388
|
+
const ctx = createContext({ isAdmin: true, userAddress: "0xadmin" });
|
|
389
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
390
|
+
// The resolver throws when trying to convert null document to GraphQL
|
|
391
|
+
await expect(query(null, { identifier: "non-existent" }, ctx)).rejects.toThrow();
|
|
392
|
+
});
|
|
393
|
+
it("should handle unauthenticated user (no user address)", async () => {
|
|
394
|
+
const ctx = createContext({});
|
|
395
|
+
const query = reactorSubgraph.resolvers.Query?.document;
|
|
396
|
+
await expect(query(null, { identifier: "doc-123" }, ctx)).rejects.toThrow("Forbidden");
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
//# sourceMappingURL=reactor-subgraph-permissions.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactor-subgraph-permissions.test.js","sourceRoot":"","sources":["../../test/reactor-subgraph-permissions.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-reactor-gql-sync.test.d.ts","sourceRoot":"","sources":["../../test/two-reactor-gql-sync.test.ts"],"names":[],"mappings":""}
|