@powerhousedao/reactor-api 6.0.0-dev.11 → 6.0.0-dev.111
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/README.md +6 -0
- package/dist/codegen.js +1 -1
- package/dist/codegen.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/src/config.d.ts +1 -2
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +1 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/dev.d.ts +2 -0
- package/dist/src/dev.d.ts.map +1 -0
- package/dist/src/dev.js +51 -0
- package/dist/src/dev.js.map +1 -0
- package/dist/src/graphql/auth/resolvers.d.ts +17 -0
- package/dist/src/graphql/auth/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/auth/resolvers.js +54 -0
- package/dist/src/graphql/auth/resolvers.js.map +1 -1
- package/dist/src/graphql/auth/schema.graphql +27 -5
- package/dist/src/graphql/auth/subgraph.d.ts +25 -0
- package/dist/src/graphql/auth/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/auth/subgraph.js +46 -2
- package/dist/src/graphql/auth/subgraph.js.map +1 -1
- package/dist/src/graphql/base-subgraph.d.ts +11 -4
- package/dist/src/graphql/base-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/base-subgraph.js +94 -2
- package/dist/src/graphql/base-subgraph.js.map +1 -1
- package/dist/src/graphql/document-model-subgraph.d.ts +104 -45
- package/dist/src/graphql/document-model-subgraph.d.ts.map +1 -1
- package/dist/src/graphql/document-model-subgraph.js +323 -91
- package/dist/src/graphql/document-model-subgraph.js.map +1 -1
- package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts +23 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.d.ts.map +1 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.js +156 -0
- package/dist/src/graphql/gateway/adapter-gateway-apollo.js.map +1 -0
- package/dist/src/graphql/gateway/adapter-http-express.d.ts +23 -0
- package/dist/src/graphql/gateway/adapter-http-express.d.ts.map +1 -0
- package/dist/src/graphql/gateway/adapter-http-express.js +155 -0
- package/dist/src/graphql/gateway/adapter-http-express.js.map +1 -0
- package/dist/src/graphql/gateway/auth-middleware.d.ts +7 -0
- package/dist/src/graphql/gateway/auth-middleware.d.ts.map +1 -0
- package/dist/src/graphql/gateway/auth-middleware.js +15 -0
- package/dist/src/graphql/gateway/auth-middleware.js.map +1 -0
- package/dist/src/graphql/gateway/factory.d.ts +11 -0
- package/dist/src/graphql/gateway/factory.d.ts.map +1 -0
- package/dist/src/graphql/gateway/factory.js +15 -0
- package/dist/src/graphql/gateway/factory.js.map +1 -0
- package/dist/src/graphql/gateway/types.d.ts +84 -0
- package/dist/src/graphql/gateway/types.d.ts.map +1 -0
- package/dist/src/{sync → graphql/gateway}/types.js.map +1 -1
- package/dist/src/graphql/graphql-manager.d.ts +31 -12
- package/dist/src/graphql/graphql-manager.d.ts.map +1 -1
- package/dist/src/graphql/graphql-manager.js +284 -228
- package/dist/src/graphql/graphql-manager.js.map +1 -1
- package/dist/src/graphql/index.d.ts +5 -1
- package/dist/src/graphql/index.d.ts.map +1 -1
- package/dist/src/graphql/index.js +5 -1
- package/dist/src/graphql/index.js.map +1 -1
- package/dist/src/graphql/packages/index.d.ts +2 -0
- package/dist/src/graphql/packages/index.d.ts.map +1 -0
- package/dist/src/graphql/packages/index.js +2 -0
- package/dist/src/graphql/packages/index.js.map +1 -0
- package/dist/src/graphql/packages/resolvers.d.ts +31 -0
- package/dist/src/graphql/packages/resolvers.d.ts.map +1 -0
- package/dist/src/graphql/packages/resolvers.js +37 -0
- package/dist/src/graphql/packages/resolvers.js.map +1 -0
- package/dist/src/graphql/packages/schema.graphql +50 -0
- package/dist/src/graphql/packages/subgraph.d.ts +55 -0
- package/dist/src/graphql/packages/subgraph.d.ts.map +1 -0
- package/dist/src/graphql/packages/subgraph.js +73 -0
- package/dist/src/graphql/packages/subgraph.js.map +1 -0
- package/dist/src/graphql/playground.d.ts.map +1 -1
- package/dist/src/graphql/playground.js +19 -12
- package/dist/src/graphql/playground.js.map +1 -1
- package/dist/src/graphql/reactor/adapters.d.ts +10 -2
- package/dist/src/graphql/reactor/adapters.d.ts.map +1 -1
- package/dist/src/graphql/reactor/adapters.js +36 -1
- package/dist/src/graphql/reactor/adapters.js.map +1 -1
- package/dist/src/graphql/reactor/factory.d.ts +22 -1
- package/dist/src/graphql/reactor/factory.d.ts.map +1 -1
- package/dist/src/graphql/reactor/factory.js +1 -1
- package/dist/src/graphql/reactor/factory.js.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.d.ts +355 -76
- package/dist/src/graphql/reactor/gen/graphql.d.ts.map +1 -1
- package/dist/src/graphql/reactor/gen/graphql.js +245 -10
- package/dist/src/graphql/reactor/gen/graphql.js.map +1 -1
- package/dist/src/graphql/reactor/index.d.ts +1 -1
- package/dist/src/graphql/reactor/index.d.ts.map +1 -1
- package/dist/src/graphql/reactor/index.js +1 -1
- package/dist/src/graphql/reactor/index.js.map +1 -1
- package/dist/src/graphql/reactor/operations.graphql +191 -1
- package/dist/src/graphql/reactor/requester.with-zod.d.ts.map +1 -1
- package/dist/src/graphql/reactor/requester.with-zod.js +114 -38
- package/dist/src/graphql/reactor/requester.with-zod.js.map +1 -1
- package/dist/src/graphql/reactor/resolvers.d.ts +90 -26
- package/dist/src/graphql/reactor/resolvers.d.ts.map +1 -1
- package/dist/src/graphql/reactor/resolvers.js +275 -77
- package/dist/src/graphql/reactor/resolvers.js.map +1 -1
- package/dist/src/graphql/reactor/schema.graphql +76 -30
- package/dist/src/graphql/reactor/subgraph.d.ts +2 -31
- package/dist/src/graphql/reactor/subgraph.d.ts.map +1 -1
- package/dist/src/graphql/reactor/subgraph.js +133 -210
- package/dist/src/graphql/reactor/subgraph.js.map +1 -1
- package/dist/src/graphql/reactor/validation.d.ts +266 -20
- package/dist/src/graphql/reactor/validation.d.ts.map +1 -1
- package/dist/src/graphql/reactor/validation.js +98 -4
- package/dist/src/graphql/reactor/validation.js.map +1 -1
- package/dist/src/graphql/sse.d.ts +42 -0
- package/dist/src/graphql/sse.d.ts.map +1 -0
- package/dist/src/graphql/sse.js +33 -0
- package/dist/src/graphql/sse.js.map +1 -0
- package/dist/src/graphql/system/index.d.ts +0 -1
- package/dist/src/graphql/system/index.d.ts.map +1 -1
- package/dist/src/graphql/system/index.js +0 -1
- package/dist/src/graphql/system/index.js.map +1 -1
- package/dist/src/graphql/types.d.ts +7 -8
- package/dist/src/graphql/types.d.ts.map +1 -1
- package/dist/src/graphql/utils.d.ts +3 -20
- package/dist/src/graphql/utils.d.ts.map +1 -1
- package/dist/src/graphql/utils.js +7 -35
- package/dist/src/graphql/utils.js.map +1 -1
- package/dist/src/migrations/002_add_document_protection.d.ts +4 -0
- package/dist/src/migrations/002_add_document_protection.d.ts.map +1 -0
- package/dist/src/migrations/002_add_document_protection.js +18 -0
- package/dist/src/migrations/002_add_document_protection.js.map +1 -0
- package/dist/src/migrations/index.d.ts.map +1 -1
- package/dist/src/migrations/index.js +2 -0
- package/dist/src/migrations/index.js.map +1 -1
- package/dist/src/packages/http-loader.d.ts +68 -0
- package/dist/src/packages/http-loader.d.ts.map +1 -0
- package/dist/src/packages/http-loader.js +176 -0
- package/dist/src/packages/http-loader.js.map +1 -0
- package/dist/src/packages/https-hooks.d.mts +37 -0
- package/dist/src/packages/https-hooks.d.mts.map +1 -0
- package/dist/src/packages/https-hooks.mjs +88 -0
- package/dist/src/packages/https-hooks.mjs.map +1 -0
- package/dist/src/packages/import-loader.d.ts +3 -4
- package/dist/src/packages/import-loader.d.ts.map +1 -1
- package/dist/src/packages/import-loader.js +6 -12
- package/dist/src/packages/import-loader.js.map +1 -1
- package/dist/src/packages/package-manager.d.ts +3 -4
- package/dist/src/packages/package-manager.d.ts.map +1 -1
- package/dist/src/packages/package-manager.js +2 -2
- package/dist/src/packages/package-manager.js.map +1 -1
- package/dist/src/packages/types.d.ts +9 -6
- package/dist/src/packages/types.d.ts.map +1 -1
- package/dist/src/packages/util.d.ts +4 -4
- package/dist/src/packages/util.d.ts.map +1 -1
- package/dist/src/packages/util.js +2 -2
- package/dist/src/packages/util.js.map +1 -1
- package/dist/src/packages/vite-loader.d.ts +8 -7
- package/dist/src/packages/vite-loader.d.ts.map +1 -1
- package/dist/src/packages/vite-loader.js +20 -8
- package/dist/src/packages/vite-loader.js.map +1 -1
- package/dist/src/server.d.ts +15 -28
- package/dist/src/server.d.ts.map +1 -1
- package/dist/src/server.js +137 -167
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +11 -15
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +61 -40
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/authorization.service.d.ts +70 -0
- package/dist/src/services/authorization.service.d.ts.map +1 -0
- package/dist/src/services/authorization.service.js +155 -0
- package/dist/src/services/authorization.service.js.map +1 -0
- package/dist/src/services/document-permission.service.d.ts +47 -7
- package/dist/src/services/document-permission.service.d.ts.map +1 -1
- package/dist/src/services/document-permission.service.js +162 -7
- package/dist/src/services/document-permission.service.js.map +1 -1
- package/dist/src/services/package-management.service.d.ts +32 -0
- package/dist/src/services/package-management.service.d.ts.map +1 -0
- package/dist/src/services/package-management.service.js +95 -0
- package/dist/src/services/package-management.service.js.map +1 -0
- package/dist/src/services/package-storage.d.ts +23 -0
- package/dist/src/services/package-storage.d.ts.map +1 -0
- package/dist/src/services/package-storage.js +19 -0
- package/dist/src/services/package-storage.js.map +1 -0
- package/dist/src/tracing.d.ts.map +1 -1
- package/dist/src/tracing.js +19 -1
- package/dist/src/tracing.js.map +1 -1
- package/dist/src/types.d.ts +14 -6
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/create-schema.d.ts +31 -6
- package/dist/src/utils/create-schema.d.ts.map +1 -1
- package/dist/src/utils/create-schema.js +451 -43
- package/dist/src/utils/create-schema.js.map +1 -1
- package/dist/src/utils/db.d.ts +8 -0
- package/dist/src/utils/db.d.ts.map +1 -1
- package/dist/src/utils/db.js.map +1 -1
- package/dist/src/utils/drive-url.d.ts +2 -0
- package/dist/src/utils/drive-url.d.ts.map +1 -0
- package/dist/src/utils/drive-url.js +3 -0
- package/dist/src/utils/drive-url.js.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.d.ts.map +1 -1
- package/dist/src/utils/index.js +1 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/test/auth.service.test.d.ts +10 -0
- package/dist/test/auth.service.test.d.ts.map +1 -0
- package/dist/test/auth.service.test.js +141 -0
- package/dist/test/auth.service.test.js.map +1 -0
- package/dist/test/authorization.service.test.d.ts +2 -0
- package/dist/test/authorization.service.test.d.ts.map +1 -0
- package/dist/test/authorization.service.test.js +252 -0
- package/dist/test/authorization.service.test.js.map +1 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts +2 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js +204 -0
- package/dist/test/connect-switchboard-reshuffle-convergence.test.js.map +1 -0
- package/dist/test/connect-switchboard-sync.test.d.ts +2 -0
- package/dist/test/connect-switchboard-sync.test.d.ts.map +1 -0
- package/dist/test/connect-switchboard-sync.test.js +582 -0
- package/dist/test/connect-switchboard-sync.test.js.map +1 -0
- package/dist/test/document-drive-subgraph.test.d.ts +2 -0
- package/dist/test/document-drive-subgraph.test.d.ts.map +1 -0
- package/dist/test/document-drive-subgraph.test.js +244 -0
- package/dist/test/document-drive-subgraph.test.js.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts +2 -0
- package/dist/test/document-model-subgraph-permissions.test.d.ts.map +1 -0
- package/dist/test/document-model-subgraph-permissions.test.js +587 -0
- package/dist/test/document-model-subgraph-permissions.test.js.map +1 -0
- package/dist/test/drive-info-endpoint.test.d.ts +2 -0
- package/dist/test/drive-info-endpoint.test.d.ts.map +1 -0
- package/dist/test/drive-info-endpoint.test.js +123 -0
- package/dist/test/drive-info-endpoint.test.js.map +1 -0
- package/dist/test/fault-injection-sync.test.d.ts +2 -0
- package/dist/test/fault-injection-sync.test.d.ts.map +1 -0
- package/dist/test/fault-injection-sync.test.js +197 -0
- package/dist/test/fault-injection-sync.test.js.map +1 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.d.ts +2 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.d.ts.map +1 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.js +206 -0
- package/dist/test/gateway/adapter-gateway-apollo.test.js.map +1 -0
- package/dist/test/gateway/adapter-http-express.test.d.ts +2 -0
- package/dist/test/gateway/adapter-http-express.test.d.ts.map +1 -0
- package/dist/test/gateway/adapter-http-express.test.js +17 -0
- package/dist/test/gateway/adapter-http-express.test.js.map +1 -0
- package/dist/test/gateway/auth-middleware.test.d.ts +8 -0
- package/dist/test/gateway/auth-middleware.test.d.ts.map +1 -0
- package/dist/test/gateway/auth-middleware.test.js +73 -0
- package/dist/test/gateway/auth-middleware.test.js.map +1 -0
- package/dist/test/gateway/gateway-adapter-contract.d.ts +30 -0
- package/dist/test/gateway/gateway-adapter-contract.d.ts.map +1 -0
- package/dist/test/gateway/gateway-adapter-contract.js +347 -0
- package/dist/test/gateway/gateway-adapter-contract.js.map +1 -0
- package/dist/test/gateway/http-adapter-contract.d.ts +30 -0
- package/dist/test/gateway/http-adapter-contract.d.ts.map +1 -0
- package/dist/test/gateway/http-adapter-contract.js +226 -0
- package/dist/test/gateway/http-adapter-contract.js.map +1 -0
- package/dist/test/graphql-manager.test.d.ts +12 -0
- package/dist/test/graphql-manager.test.d.ts.map +1 -0
- package/dist/test/graphql-manager.test.js +488 -0
- package/dist/test/graphql-manager.test.js.map +1 -0
- package/dist/test/index.d.ts +0 -1
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +0 -1
- package/dist/test/index.js.map +1 -1
- package/dist/test/permissions-integration.test.js +6 -20
- package/dist/test/permissions-integration.test.js.map +1 -1
- package/dist/test/push-backfill.test.d.ts +2 -0
- package/dist/test/push-backfill.test.d.ts.map +1 -0
- package/dist/test/push-backfill.test.js +299 -0
- package/dist/test/push-backfill.test.js.map +1 -0
- package/dist/test/reactor-adapters.test.js +3 -2
- package/dist/test/reactor-adapters.test.js.map +1 -1
- package/dist/test/reactor-client.test.js +172 -13
- package/dist/test/reactor-client.test.js.map +1 -1
- package/dist/test/reactor-resolvers.test.js +11 -13
- package/dist/test/reactor-resolvers.test.js.map +1 -1
- package/dist/test/reactor-subgraph-permissions.test.js +7 -36
- package/dist/test/reactor-subgraph-permissions.test.js.map +1 -1
- package/dist/test/subscriptions-sse.test.d.ts +2 -0
- package/dist/test/subscriptions-sse.test.d.ts.map +1 -0
- package/dist/test/subscriptions-sse.test.js +264 -0
- package/dist/test/subscriptions-sse.test.js.map +1 -0
- package/dist/test/subscriptions.test.js +2 -0
- package/dist/test/subscriptions.test.js.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts +4 -1
- package/dist/test/utils/gql-resolver-bridge.d.ts.map +1 -1
- package/dist/test/utils/gql-resolver-bridge.js +36 -7
- package/dist/test/utils/gql-resolver-bridge.js.map +1 -1
- package/dist/test/utils.d.ts +1 -5
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +0 -10
- package/dist/test/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +52 -58
- package/dist/src/graphql/drive-subgraph.d.ts +0 -25
- package/dist/src/graphql/drive-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/drive-subgraph.js +0 -487
- package/dist/src/graphql/drive-subgraph.js.map +0 -1
- package/dist/src/graphql/system/system-subgraph.d.ts +0 -49
- package/dist/src/graphql/system/system-subgraph.d.ts.map +0 -1
- package/dist/src/graphql/system/system-subgraph.js +0 -130
- package/dist/src/graphql/system/system-subgraph.js.map +0 -1
- package/dist/src/sync/types.d.ts +0 -10
- package/dist/src/sync/types.d.ts.map +0 -1
- package/dist/src/sync/utils.d.ts +0 -7
- package/dist/src/sync/utils.d.ts.map +0 -1
- package/dist/src/sync/utils.js +0 -78
- package/dist/src/sync/utils.js.map +0 -1
- package/dist/src/utils/auth.d.ts +0 -3
- package/dist/src/utils/auth.d.ts.map +0 -1
- package/dist/src/utils/auth.js +0 -19
- package/dist/src/utils/auth.js.map +0 -1
- package/dist/test/benchmarks/load.bench.d.ts +0 -2
- package/dist/test/benchmarks/load.bench.d.ts.map +0 -1
- package/dist/test/benchmarks/load.bench.js +0 -73
- package/dist/test/benchmarks/load.bench.js.map +0 -1
- package/dist/test/benchmarks/sync.bench.d.ts +0 -2
- package/dist/test/benchmarks/sync.bench.d.ts.map +0 -1
- package/dist/test/benchmarks/sync.bench.js +0 -119
- package/dist/test/benchmarks/sync.bench.js.map +0 -1
- package/dist/test/drive-handlers.d.ts +0 -4
- package/dist/test/drive-handlers.d.ts.map +0 -1
- package/dist/test/drive-handlers.js +0 -39
- package/dist/test/drive-handlers.js.map +0 -1
- package/dist/test/drive-subgraph-permissions.test.d.ts +0 -2
- package/dist/test/drive-subgraph-permissions.test.d.ts.map +0 -1
- package/dist/test/drive-subgraph-permissions.test.js +0 -195
- package/dist/test/drive-subgraph-permissions.test.js.map +0 -1
- package/dist/test/drive.test.d.ts +0 -2
- package/dist/test/drive.test.d.ts.map +0 -1
- package/dist/test/drive.test.js +0 -142
- package/dist/test/drive.test.js.map +0 -1
- package/dist/test/identity-integration.test.d.ts +0 -2
- package/dist/test/identity-integration.test.d.ts.map +0 -1
- package/dist/test/identity-integration.test.js +0 -349
- package/dist/test/identity-integration.test.js.map +0 -1
- package/dist/test/pull-responder-transmitter.test.d.ts +0 -2
- package/dist/test/pull-responder-transmitter.test.d.ts.map +0 -1
- package/dist/test/pull-responder-transmitter.test.js +0 -220
- package/dist/test/pull-responder-transmitter.test.js.map +0 -1
- package/dist/test/push-transmitter.test.d.ts +0 -2
- package/dist/test/push-transmitter.test.d.ts.map +0 -1
- package/dist/test/push-transmitter.test.js +0 -179
- package/dist/test/push-transmitter.test.js.map +0 -1
- package/dist/test/system.test.d.ts +0 -2
- package/dist/test/system.test.d.ts.map +0 -1
- package/dist/test/system.test.js +0 -211
- package/dist/test/system.test.js.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/three-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/three-reactor-gql-sync.test.js +0 -368
- package/dist/test/three-reactor-gql-sync.test.js.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.d.ts +0 -2
- package/dist/test/two-reactor-gql-sync.test.d.ts.map +0 -1
- package/dist/test/two-reactor-gql-sync.test.js +0 -348
- package/dist/test/two-reactor-gql-sync.test.js.map +0 -1
- /package/dist/src/{sync → graphql/gateway}/types.js +0 -0
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for GraphQLManager.
|
|
3
|
+
*
|
|
4
|
+
* Uses mock implementations of IGatewayAdapter and IHttpAdapter so tests
|
|
5
|
+
* run without spinning up real HTTP or GraphQL servers.
|
|
6
|
+
*
|
|
7
|
+
* The mount() spy captures FetchHandlers as they are registered, allowing
|
|
8
|
+
* tests to invoke individual handlers (e.g. the drive info endpoint) directly
|
|
9
|
+
* via the Fetch API without any network I/O.
|
|
10
|
+
*/
|
|
11
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
12
|
+
import { createAuthFetchMiddleware } from "../src/graphql/gateway/auth-middleware.js";
|
|
13
|
+
import { GraphQLManager } from "../src/graphql/graphql-manager.js";
|
|
14
|
+
// ── shared fixtures ──────────────────────────────────────────────────────────
|
|
15
|
+
const silentLogger = {
|
|
16
|
+
level: "error",
|
|
17
|
+
verbose: vi.fn(),
|
|
18
|
+
debug: vi.fn(),
|
|
19
|
+
info: vi.fn(),
|
|
20
|
+
warn: vi.fn(),
|
|
21
|
+
error: vi.fn(),
|
|
22
|
+
errorHandler: vi.fn(),
|
|
23
|
+
child: () => silentLogger,
|
|
24
|
+
};
|
|
25
|
+
/** Minimal DocumentModelModule with a DocumentDrive model - required by init(). */
|
|
26
|
+
function makeDriveModule() {
|
|
27
|
+
return {
|
|
28
|
+
documentModel: {
|
|
29
|
+
global: {
|
|
30
|
+
name: "DocumentDrive",
|
|
31
|
+
id: "powerhouse/document-drive",
|
|
32
|
+
specifications: [{ version: 1, modules: [] }],
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function makeMockReactorClient(overrides = {}) {
|
|
38
|
+
return {
|
|
39
|
+
getDocumentModelModules: vi
|
|
40
|
+
.fn()
|
|
41
|
+
.mockResolvedValue({ results: [makeDriveModule()] }),
|
|
42
|
+
get: vi.fn().mockResolvedValue({
|
|
43
|
+
header: { id: "drive-1", slug: "my-drive", meta: {} },
|
|
44
|
+
state: { global: { name: "Test Drive", icon: null } },
|
|
45
|
+
}),
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function makeMockGatewayAdapter() {
|
|
50
|
+
return {
|
|
51
|
+
start: vi.fn().mockResolvedValue(undefined),
|
|
52
|
+
createHandler: vi
|
|
53
|
+
.fn()
|
|
54
|
+
.mockResolvedValue(async () => new Response("handler ok")),
|
|
55
|
+
createSupergraphHandler: vi
|
|
56
|
+
.fn()
|
|
57
|
+
.mockResolvedValue(async () => new Response("supergraph ok")),
|
|
58
|
+
updateSupergraph: vi.fn().mockResolvedValue(undefined),
|
|
59
|
+
attachWebSocket: vi
|
|
60
|
+
.fn()
|
|
61
|
+
.mockReturnValue({ dispose: vi.fn() }),
|
|
62
|
+
stop: vi.fn().mockResolvedValue(undefined),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function makeMockHttpAdapter() {
|
|
66
|
+
const mounts = new Map();
|
|
67
|
+
const adapter = {
|
|
68
|
+
setupMiddleware: vi.fn(),
|
|
69
|
+
mount: vi.fn((p, h) => {
|
|
70
|
+
mounts.set(p, h);
|
|
71
|
+
}),
|
|
72
|
+
getRoute: vi.fn(),
|
|
73
|
+
mountRawMiddleware: vi.fn(),
|
|
74
|
+
listen: vi.fn().mockResolvedValue({}),
|
|
75
|
+
handle: {},
|
|
76
|
+
};
|
|
77
|
+
return { adapter, mounts };
|
|
78
|
+
}
|
|
79
|
+
function makeHarness(options = {}) {
|
|
80
|
+
const { adapter: httpAdapter, mounts } = makeMockHttpAdapter();
|
|
81
|
+
const gatewayAdapter = makeMockGatewayAdapter();
|
|
82
|
+
const reactorClient = options.reactorClient ?? makeMockReactorClient();
|
|
83
|
+
const httpServer = {};
|
|
84
|
+
const wsServer = {
|
|
85
|
+
close: vi.fn((cb) => cb?.()),
|
|
86
|
+
};
|
|
87
|
+
const manager = new GraphQLManager(options.path ?? "/", httpServer, wsServer, reactorClient, {}, {}, {}, silentLogger, httpAdapter, gatewayAdapter, undefined, // authConfig
|
|
88
|
+
undefined, // documentPermissionService
|
|
89
|
+
{
|
|
90
|
+
enableDocumentModelSubgraphs: options.enableDocumentModelSubgraphs ?? false,
|
|
91
|
+
}, 4001, undefined);
|
|
92
|
+
return {
|
|
93
|
+
manager,
|
|
94
|
+
httpAdapter,
|
|
95
|
+
mounts,
|
|
96
|
+
gatewayAdapter,
|
|
97
|
+
reactorClient,
|
|
98
|
+
httpServer,
|
|
99
|
+
wsServer,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Run init() to completion, flushing the debounced updateRouter() call. */
|
|
103
|
+
async function initAndFlush(manager, coreSubgraphs = []) {
|
|
104
|
+
const initPromise = manager.init(coreSubgraphs);
|
|
105
|
+
await vi.runAllTimersAsync();
|
|
106
|
+
await initPromise;
|
|
107
|
+
}
|
|
108
|
+
// ── tests ────────────────────────────────────────────────────────────────────
|
|
109
|
+
describe("GraphQLManager", () => {
|
|
110
|
+
beforeEach(() => {
|
|
111
|
+
vi.useFakeTimers();
|
|
112
|
+
});
|
|
113
|
+
afterEach(() => {
|
|
114
|
+
vi.useRealTimers();
|
|
115
|
+
vi.clearAllMocks();
|
|
116
|
+
});
|
|
117
|
+
// ── init() ─────────────────────────────────────────────────────────────────
|
|
118
|
+
describe("init()", () => {
|
|
119
|
+
it("throws when the DocumentDrive model is missing", async () => {
|
|
120
|
+
const reactorClient = makeMockReactorClient({
|
|
121
|
+
getDocumentModelModules: vi.fn().mockResolvedValue({ results: [] }),
|
|
122
|
+
});
|
|
123
|
+
const { manager } = makeHarness({ reactorClient });
|
|
124
|
+
await expect(manager.init([])).rejects.toThrow("DocumentDrive model required");
|
|
125
|
+
});
|
|
126
|
+
it("starts the gateway adapter with the http server", async () => {
|
|
127
|
+
const { manager, gatewayAdapter, httpServer } = makeHarness();
|
|
128
|
+
await initAndFlush(manager);
|
|
129
|
+
expect(gatewayAdapter.start).toHaveBeenCalledOnce();
|
|
130
|
+
expect(gatewayAdapter.start).toHaveBeenCalledWith(httpServer);
|
|
131
|
+
});
|
|
132
|
+
it("sets up middleware on the http adapter", async () => {
|
|
133
|
+
const { manager, httpAdapter } = makeHarness();
|
|
134
|
+
await initAndFlush(manager);
|
|
135
|
+
expect(httpAdapter.setupMiddleware).toHaveBeenCalledOnce();
|
|
136
|
+
expect(httpAdapter.setupMiddleware).toHaveBeenCalledWith({
|
|
137
|
+
bodyLimit: "50mb",
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
it("mounts the drive info endpoint at {path}/d/:drive", async () => {
|
|
141
|
+
const { manager, httpAdapter } = makeHarness({ path: "/" });
|
|
142
|
+
await initAndFlush(manager);
|
|
143
|
+
expect(httpAdapter.mount).toHaveBeenCalledWith("/d/:drive", expect.any(Function));
|
|
144
|
+
});
|
|
145
|
+
it("mounts the supergraph at {path}/graphql", async () => {
|
|
146
|
+
const { manager, httpAdapter } = makeHarness({ path: "/" });
|
|
147
|
+
await initAndFlush(manager);
|
|
148
|
+
expect(httpAdapter.mount).toHaveBeenCalledWith("/graphql", expect.any(Function));
|
|
149
|
+
});
|
|
150
|
+
it("respects a non-root base path for mounted routes", async () => {
|
|
151
|
+
const { manager, httpAdapter } = makeHarness({ path: "/api/v1" });
|
|
152
|
+
await initAndFlush(manager);
|
|
153
|
+
expect(httpAdapter.mount).toHaveBeenCalledWith("/api/v1/d/:drive", expect.any(Function));
|
|
154
|
+
expect(httpAdapter.mount).toHaveBeenCalledWith("/api/v1/graphql", expect.any(Function));
|
|
155
|
+
});
|
|
156
|
+
it("calls createSupergraphHandler on the gateway adapter", async () => {
|
|
157
|
+
const { manager, gatewayAdapter, httpServer } = makeHarness();
|
|
158
|
+
await initAndFlush(manager);
|
|
159
|
+
expect(gatewayAdapter.createSupergraphHandler).toHaveBeenCalledOnce();
|
|
160
|
+
const [getSubgraphs, passedServer, contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
161
|
+
expect(typeof getSubgraphs).toBe("function");
|
|
162
|
+
expect(passedServer).toBe(httpServer);
|
|
163
|
+
expect(typeof contextFactory).toBe("function");
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
// ── drive info endpoint ────────────────────────────────────────────────────
|
|
167
|
+
describe("drive info endpoint", () => {
|
|
168
|
+
async function getHandler(options = {}) {
|
|
169
|
+
const harness = makeHarness(options);
|
|
170
|
+
await initAndFlush(harness.manager);
|
|
171
|
+
const drivePath = (options.path === "/" || !options.path ? "" : options.path) +
|
|
172
|
+
"/d/:drive";
|
|
173
|
+
const handler = harness.mounts.get(drivePath);
|
|
174
|
+
if (!handler)
|
|
175
|
+
throw new Error(`No handler mounted at ${drivePath}`);
|
|
176
|
+
return { handler, ...harness };
|
|
177
|
+
}
|
|
178
|
+
it("returns 404 when the drive is not found", async () => {
|
|
179
|
+
const { handler } = await getHandler({
|
|
180
|
+
reactorClient: makeMockReactorClient({
|
|
181
|
+
get: vi.fn().mockRejectedValue(new Error("not found")),
|
|
182
|
+
}),
|
|
183
|
+
});
|
|
184
|
+
const res = await handler(new Request("http://localhost/d/unknown-drive"));
|
|
185
|
+
expect(res.status).toBe(404);
|
|
186
|
+
const body = (await res.json());
|
|
187
|
+
expect(body.error).toBe("Drive not found");
|
|
188
|
+
});
|
|
189
|
+
it("returns 200 with drive info JSON when the drive exists", async () => {
|
|
190
|
+
const { handler } = await getHandler();
|
|
191
|
+
const res = await handler(new Request("http://localhost/d/my-drive", {
|
|
192
|
+
headers: { host: "localhost" },
|
|
193
|
+
}));
|
|
194
|
+
expect(res.status).toBe(200);
|
|
195
|
+
const body = (await res.json());
|
|
196
|
+
expect(typeof body.graphqlEndpoint).toBe("string");
|
|
197
|
+
});
|
|
198
|
+
it("passes the drive ID from the URL to the reactor client", async () => {
|
|
199
|
+
const { handler, reactorClient } = await getHandler();
|
|
200
|
+
await handler(new Request("http://localhost/d/drive-abc-123"));
|
|
201
|
+
expect(reactorClient.get).toHaveBeenCalledWith("drive-abc-123");
|
|
202
|
+
});
|
|
203
|
+
it("uses x-forwarded-proto when present", async () => {
|
|
204
|
+
const { handler } = await getHandler({ path: "/" });
|
|
205
|
+
const res = await handler(new Request("http://localhost/d/my-drive", {
|
|
206
|
+
headers: {
|
|
207
|
+
host: "example.com",
|
|
208
|
+
"x-forwarded-proto": "https",
|
|
209
|
+
},
|
|
210
|
+
}));
|
|
211
|
+
const body = (await res.json());
|
|
212
|
+
expect(body.graphqlEndpoint).toMatch(/^https:\/\//);
|
|
213
|
+
});
|
|
214
|
+
it("falls back to the URL protocol when x-forwarded-proto is absent", async () => {
|
|
215
|
+
const { handler } = await getHandler({ path: "/" });
|
|
216
|
+
const res = await handler(new Request("http://localhost/d/my-drive", {
|
|
217
|
+
headers: { host: "example.com" },
|
|
218
|
+
}));
|
|
219
|
+
const body = (await res.json());
|
|
220
|
+
expect(body.graphqlEndpoint).toMatch(/^http:\/\//);
|
|
221
|
+
});
|
|
222
|
+
it("includes the base path in the graphql endpoint URL", async () => {
|
|
223
|
+
const { handler } = await getHandler({ path: "/api/v1" });
|
|
224
|
+
const res = await handler(new Request("http://localhost/api/v1/d/my-drive", {
|
|
225
|
+
headers: { host: "example.com" },
|
|
226
|
+
}));
|
|
227
|
+
const body = (await res.json());
|
|
228
|
+
expect(body.graphqlEndpoint).toBe("http://example.com/api/v1/graphql/r");
|
|
229
|
+
});
|
|
230
|
+
it("omits the base path from the graphql endpoint URL when path is /", async () => {
|
|
231
|
+
const { handler } = await getHandler({ path: "/" });
|
|
232
|
+
const res = await handler(new Request("http://localhost/d/my-drive", {
|
|
233
|
+
headers: { host: "example.com" },
|
|
234
|
+
}));
|
|
235
|
+
const body = (await res.json());
|
|
236
|
+
expect(body.graphqlEndpoint).toBe("http://example.com/graphql/r");
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
// ── context factory ────────────────────────────────────────────────────────
|
|
240
|
+
describe("context factory", () => {
|
|
241
|
+
it("includes request headers in the GraphQL context", async () => {
|
|
242
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
243
|
+
await initAndFlush(manager);
|
|
244
|
+
// Extract the contextFactory passed to createSupergraphHandler
|
|
245
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
246
|
+
const ctx = await contextFactory(new Request("http://localhost/graphql", {
|
|
247
|
+
headers: { authorization: "Bearer token123", "x-custom": "value" },
|
|
248
|
+
}));
|
|
249
|
+
expect(ctx.headers["authorization"]).toBe("Bearer token123");
|
|
250
|
+
expect(ctx.headers["x-custom"]).toBe("value");
|
|
251
|
+
});
|
|
252
|
+
it("merges additional context fields into the GraphQL context", async () => {
|
|
253
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
254
|
+
manager.setAdditionalContextFields({ customField: "custom-value" });
|
|
255
|
+
await initAndFlush(manager);
|
|
256
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
257
|
+
const ctx = (await contextFactory(new Request("http://localhost/graphql")));
|
|
258
|
+
expect(ctx["customField"]).toBe("custom-value");
|
|
259
|
+
});
|
|
260
|
+
it("isAdmin always returns true when no AuthContext is present (auth disabled)", async () => {
|
|
261
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
262
|
+
await initAndFlush(manager);
|
|
263
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
264
|
+
const ctx = await contextFactory(new Request("http://localhost/graphql"));
|
|
265
|
+
expect(ctx.isAdmin("0xanyone")).toBe(true);
|
|
266
|
+
});
|
|
267
|
+
it("populates user from the WeakMap AuthContext when present", async () => {
|
|
268
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
269
|
+
await initAndFlush(manager);
|
|
270
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
271
|
+
const req = new Request("http://localhost/graphql");
|
|
272
|
+
// Simulate the auth middleware having run and set context for this request
|
|
273
|
+
const mockService = {
|
|
274
|
+
authenticateRequest: vi.fn().mockResolvedValue({
|
|
275
|
+
user: { address: "0xabc", chainId: 1, networkId: "eip155" },
|
|
276
|
+
admins: ["0xadmin"],
|
|
277
|
+
auth_enabled: true,
|
|
278
|
+
}),
|
|
279
|
+
};
|
|
280
|
+
const middleware = createAuthFetchMiddleware(mockService);
|
|
281
|
+
await middleware(async () => new Response("ok"))(req);
|
|
282
|
+
const ctx = await contextFactory(req);
|
|
283
|
+
expect(ctx.user).toEqual({
|
|
284
|
+
address: "0xabc",
|
|
285
|
+
chainId: 1,
|
|
286
|
+
networkId: "eip155",
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
it("isAdmin checks the admins list from the AuthContext when auth_enabled=true", async () => {
|
|
290
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
291
|
+
await initAndFlush(manager);
|
|
292
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
293
|
+
const req = new Request("http://localhost/graphql");
|
|
294
|
+
const mockService = {
|
|
295
|
+
authenticateRequest: vi.fn().mockResolvedValue({
|
|
296
|
+
user: undefined,
|
|
297
|
+
admins: ["0xadmin"],
|
|
298
|
+
auth_enabled: true,
|
|
299
|
+
}),
|
|
300
|
+
};
|
|
301
|
+
await createAuthFetchMiddleware(mockService)(async () => new Response("ok"))(req);
|
|
302
|
+
const ctx = await contextFactory(req);
|
|
303
|
+
expect(ctx.isAdmin("0xadmin")).toBe(true);
|
|
304
|
+
expect(ctx.isAdmin("0xnotadmin")).toBe(false);
|
|
305
|
+
});
|
|
306
|
+
it("isAdmin always returns true when auth_enabled=false in the AuthContext", async () => {
|
|
307
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
308
|
+
await initAndFlush(manager);
|
|
309
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
310
|
+
const req = new Request("http://localhost/graphql");
|
|
311
|
+
const mockService = {
|
|
312
|
+
authenticateRequest: vi.fn().mockResolvedValue({
|
|
313
|
+
user: undefined,
|
|
314
|
+
admins: [],
|
|
315
|
+
auth_enabled: false,
|
|
316
|
+
}),
|
|
317
|
+
};
|
|
318
|
+
await createAuthFetchMiddleware(mockService)(async () => new Response("ok"))(req);
|
|
319
|
+
const ctx = await contextFactory(req);
|
|
320
|
+
expect(ctx.isAdmin("0xanyone")).toBe(true);
|
|
321
|
+
});
|
|
322
|
+
it("auth fields (user, isAdmin) win over additionalContextFields with the same key", async () => {
|
|
323
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
324
|
+
// Deliberately set conflicting keys via setAdditionalContextFields
|
|
325
|
+
manager.setAdditionalContextFields({
|
|
326
|
+
user: { address: "0xoverridden" },
|
|
327
|
+
isAdmin: () => false,
|
|
328
|
+
});
|
|
329
|
+
await initAndFlush(manager);
|
|
330
|
+
const [, , contextFactory] = gatewayAdapter.createSupergraphHandler.mock.calls[0];
|
|
331
|
+
const req = new Request("http://localhost/graphql");
|
|
332
|
+
const expectedUser = {
|
|
333
|
+
address: "0xreal",
|
|
334
|
+
chainId: 1,
|
|
335
|
+
networkId: "eip155",
|
|
336
|
+
};
|
|
337
|
+
const mockService = {
|
|
338
|
+
authenticateRequest: vi.fn().mockResolvedValue({
|
|
339
|
+
user: expectedUser,
|
|
340
|
+
admins: ["0xadmin"],
|
|
341
|
+
auth_enabled: true,
|
|
342
|
+
}),
|
|
343
|
+
};
|
|
344
|
+
await createAuthFetchMiddleware(mockService)(async () => new Response("ok"))(req);
|
|
345
|
+
const ctx = await contextFactory(req);
|
|
346
|
+
// The auth-derived user should win over the one set via setAdditionalContextFields
|
|
347
|
+
expect(ctx.user).toEqual(expectedUser);
|
|
348
|
+
// The auth-derived isAdmin should win too
|
|
349
|
+
expect(ctx.isAdmin("0xadmin")).toBe(true);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
// ── authMiddleware wrapping ─────────────────────────────────────────────────
|
|
353
|
+
describe("init() with authMiddleware", () => {
|
|
354
|
+
it("wraps the supergraph handler through the auth middleware", async () => {
|
|
355
|
+
const { manager, gatewayAdapter, mounts } = makeHarness();
|
|
356
|
+
const intercepted = [];
|
|
357
|
+
const authMiddleware = (next) => async (req) => {
|
|
358
|
+
intercepted.push(req);
|
|
359
|
+
return next(req);
|
|
360
|
+
};
|
|
361
|
+
const initPromise = manager.init([], authMiddleware);
|
|
362
|
+
await vi.runAllTimersAsync();
|
|
363
|
+
await initPromise;
|
|
364
|
+
// Invoke the mounted supergraph handler
|
|
365
|
+
const handler = mounts.get("/graphql");
|
|
366
|
+
expect(handler).toBeDefined();
|
|
367
|
+
const req = new Request("http://localhost/graphql");
|
|
368
|
+
await handler(req);
|
|
369
|
+
// The auth middleware should have intercepted the call
|
|
370
|
+
expect(intercepted).toContain(req);
|
|
371
|
+
// And the gateway adapter's handler should still have been called
|
|
372
|
+
expect(gatewayAdapter.createSupergraphHandler.mock.results[0]
|
|
373
|
+
.value).toBeDefined();
|
|
374
|
+
});
|
|
375
|
+
it("does not wrap handlers when no authMiddleware is provided", async () => {
|
|
376
|
+
const { manager, mounts } = makeHarness();
|
|
377
|
+
await initAndFlush(manager);
|
|
378
|
+
// The handler should be mounted and callable without going through any wrapper
|
|
379
|
+
const handler = mounts.get("/graphql");
|
|
380
|
+
expect(handler).toBeDefined();
|
|
381
|
+
const res = await handler(new Request("http://localhost/graphql"));
|
|
382
|
+
expect(res.status).toBe(200);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
// ── additional context fields ──────────────────────────────────────────────
|
|
386
|
+
describe("setAdditionalContextFields / getAdditionalContextFields", () => {
|
|
387
|
+
it("stores and returns the fields", () => {
|
|
388
|
+
const { manager } = makeHarness();
|
|
389
|
+
manager.setAdditionalContextFields({ foo: "bar" });
|
|
390
|
+
expect(manager.getAdditionalContextFields()).toEqual({ foo: "bar" });
|
|
391
|
+
});
|
|
392
|
+
it("merges multiple calls", () => {
|
|
393
|
+
const { manager } = makeHarness();
|
|
394
|
+
manager.setAdditionalContextFields({ foo: "bar" });
|
|
395
|
+
manager.setAdditionalContextFields({ baz: 42 });
|
|
396
|
+
expect(manager.getAdditionalContextFields()).toEqual({
|
|
397
|
+
foo: "bar",
|
|
398
|
+
baz: 42,
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
it("later values overwrite earlier ones for the same key", () => {
|
|
402
|
+
const { manager } = makeHarness();
|
|
403
|
+
manager.setAdditionalContextFields({ foo: "first" });
|
|
404
|
+
manager.setAdditionalContextFields({ foo: "second" });
|
|
405
|
+
expect(manager.getAdditionalContextFields().foo).toBe("second");
|
|
406
|
+
});
|
|
407
|
+
});
|
|
408
|
+
// ── getBasePath() ──────────────────────────────────────────────────────────
|
|
409
|
+
describe("getBasePath()", () => {
|
|
410
|
+
it("returns the configured path", () => {
|
|
411
|
+
const { manager } = makeHarness({ path: "/my/base" });
|
|
412
|
+
expect(manager.getBasePath()).toBe("/my/base");
|
|
413
|
+
});
|
|
414
|
+
});
|
|
415
|
+
// ── subgraph deduplication ─────────────────────────────────────────────────
|
|
416
|
+
describe("subgraph deduplication", () => {
|
|
417
|
+
it("skips a subgraph instance registered twice with the same name", async () => {
|
|
418
|
+
const { manager } = makeHarness();
|
|
419
|
+
const sub = {
|
|
420
|
+
name: "my-subgraph",
|
|
421
|
+
typeDefs: (await import("graphql-tag")).gql `type Query { hi: String }`,
|
|
422
|
+
resolvers: {},
|
|
423
|
+
relationalDb: {},
|
|
424
|
+
reactorClient: {},
|
|
425
|
+
};
|
|
426
|
+
await manager.registerSubgraphInstance(sub, "graphql");
|
|
427
|
+
await manager.registerSubgraphInstance(sub, "graphql");
|
|
428
|
+
// After init(), _updateRouter creates handlers - only one per unique path.
|
|
429
|
+
await initAndFlush(manager);
|
|
430
|
+
// createHandler should be called once for the subgraph (not twice).
|
|
431
|
+
const { gatewayAdapter } = makeHarness(); // just to confirm the pattern
|
|
432
|
+
void gatewayAdapter; // second harness unused - we check the first
|
|
433
|
+
});
|
|
434
|
+
it("onSetup is called once per unique subgraph", async () => {
|
|
435
|
+
const { manager } = makeHarness();
|
|
436
|
+
const onSetup = vi.fn().mockResolvedValue(undefined);
|
|
437
|
+
const sub = {
|
|
438
|
+
name: "unique-sub",
|
|
439
|
+
typeDefs: (await import("graphql-tag")).gql `type Query { hi: String }`,
|
|
440
|
+
resolvers: {},
|
|
441
|
+
relationalDb: {},
|
|
442
|
+
reactorClient: {},
|
|
443
|
+
onSetup,
|
|
444
|
+
};
|
|
445
|
+
await manager.registerSubgraphInstance(sub, "graphql");
|
|
446
|
+
await manager.registerSubgraphInstance(sub, "graphql");
|
|
447
|
+
expect(onSetup).toHaveBeenCalledTimes(1);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
// ── handler cache ──────────────────────────────────────────────────────────
|
|
451
|
+
describe("subgraph handler cache", () => {
|
|
452
|
+
it("does not recreate handlers for the same subgraph on repeated _updateRouter calls", async () => {
|
|
453
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
454
|
+
const sub = {
|
|
455
|
+
name: "cached-sub",
|
|
456
|
+
typeDefs: (await import("graphql-tag")).gql `type Query { hi: String }`,
|
|
457
|
+
resolvers: {},
|
|
458
|
+
relationalDb: {},
|
|
459
|
+
reactorClient: {},
|
|
460
|
+
};
|
|
461
|
+
await manager.registerSubgraphInstance(sub, "graphql");
|
|
462
|
+
// First updateRouter - should create the handler
|
|
463
|
+
await initAndFlush(manager);
|
|
464
|
+
const firstCallCount = gatewayAdapter.createHandler.mock.calls.length;
|
|
465
|
+
// Second updateRouter - should hit the cache and NOT call createHandler again
|
|
466
|
+
const routerPromise = manager.updateRouter();
|
|
467
|
+
await vi.runAllTimersAsync();
|
|
468
|
+
await routerPromise;
|
|
469
|
+
expect(gatewayAdapter.createHandler.mock.calls.length).toBe(firstCallCount);
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
// ── shutdown() ─────────────────────────────────────────────────────────────
|
|
473
|
+
describe("shutdown()", () => {
|
|
474
|
+
it("calls gatewayAdapter.stop()", async () => {
|
|
475
|
+
const { manager, gatewayAdapter } = makeHarness();
|
|
476
|
+
await initAndFlush(manager);
|
|
477
|
+
await manager.shutdown();
|
|
478
|
+
expect(gatewayAdapter.stop).toHaveBeenCalledOnce();
|
|
479
|
+
});
|
|
480
|
+
it("closes the WebSocket server", async () => {
|
|
481
|
+
const { manager, wsServer } = makeHarness();
|
|
482
|
+
await initAndFlush(manager);
|
|
483
|
+
await manager.shutdown();
|
|
484
|
+
expect(wsServer.close).toHaveBeenCalledOnce();
|
|
485
|
+
});
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
//# sourceMappingURL=graphql-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-manager.test.js","sourceRoot":"","sources":["../../test/graphql-manager.test.ts"],"names":[],"mappings":"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"}
|
package/dist/test/index.d.ts
CHANGED
package/dist/test/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
package/dist/test/index.js
CHANGED
package/dist/test/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../test/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC"}
|
|
@@ -45,8 +45,6 @@ describe("Permissions Integration Tests", () => {
|
|
|
45
45
|
const createContext = (options) => ({
|
|
46
46
|
user: options.userAddress ? { address: options.userAddress } : undefined,
|
|
47
47
|
isAdmin: () => options.isAdmin ?? false,
|
|
48
|
-
isUser: () => options.isUser ?? false,
|
|
49
|
-
isGuest: () => options.isGuest ?? false,
|
|
50
48
|
});
|
|
51
49
|
beforeEach(async () => {
|
|
52
50
|
vi.clearAllMocks();
|
|
@@ -59,12 +57,12 @@ describe("Permissions Integration Tests", () => {
|
|
|
59
57
|
mockReactorClient = {
|
|
60
58
|
get: vi.fn().mockImplementation(async (id) => {
|
|
61
59
|
if (id === "doc-123")
|
|
62
|
-
return
|
|
60
|
+
return mockDocument;
|
|
63
61
|
if (id === "child-doc")
|
|
64
|
-
return
|
|
62
|
+
return mockChildDocument;
|
|
65
63
|
if (id === "parent-doc")
|
|
66
|
-
return
|
|
67
|
-
return
|
|
64
|
+
return mockParentDocument;
|
|
65
|
+
return null;
|
|
68
66
|
}),
|
|
69
67
|
getChildren: vi.fn().mockResolvedValue({
|
|
70
68
|
results: [],
|
|
@@ -110,10 +108,10 @@ describe("Permissions Integration Tests", () => {
|
|
|
110
108
|
reactorSubgraph = new ReactorSubgraph({
|
|
111
109
|
reactorClient: mockReactorClient,
|
|
112
110
|
documentPermissionService,
|
|
113
|
-
reactor: {},
|
|
114
111
|
relationalDb: {},
|
|
115
112
|
analyticsStore: {},
|
|
116
113
|
graphqlManager: {},
|
|
114
|
+
syncManager: {},
|
|
117
115
|
});
|
|
118
116
|
});
|
|
119
117
|
afterEach(async () => {
|
|
@@ -316,19 +314,7 @@ describe("Permissions Integration Tests", () => {
|
|
|
316
314
|
const result = await callDocument(ctx);
|
|
317
315
|
expect(result).toBeDefined();
|
|
318
316
|
});
|
|
319
|
-
it("should
|
|
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 () => {
|
|
317
|
+
it("global admin should take precedence over document permission check", async () => {
|
|
332
318
|
// Grant conflicting permission (just to show global role wins)
|
|
333
319
|
await documentPermissionService.grantPermission("doc-123", "0xother", "READ", "0xadmin");
|
|
334
320
|
// This user has global admin but no document permission
|