import { expect, tap } from '@git.zone/tstest/tapbundle'; import { ConfigHandler } from '../ts/opsserver/handlers/config.handler.js'; import * as plugins from '../ts/plugins.js'; import * as interfaces from '../ts_interfaces/index.js'; const fireTypedRequest = async ( router: plugins.typedrequest.TypedRouter, method: string, request: Record, ) => { return await router.routeAndAddResponse({ method, request, response: {}, correlation: { id: `${method}-${Date.now()}-${Math.random().toString(16).slice(2)}`, phase: 'request', }, } as any, { localRequest: true, skipHooks: true }) as any; }; const makeOpsServer = (scopes: interfaces.data.TApiTokenScope[]) => { const router = new plugins.typedrequest.TypedRouter(); const token = { id: 'token-1', name: 'config-token', tokenHash: 'hash', scopes, createdBy: 'token-user', createdAt: Date.now(), expiresAt: null, lastUsedAt: null, enabled: true, } as interfaces.data.IStoredApiToken; const opsServerRef = { viewRouter: router, adminHandler: { validateIdentity: async () => null, }, dcRouterRef: { options: { dbConfig: { enabled: false }, }, resolvedPaths: { dcrouterHomeDir: '/tmp/dcrouter-home', dataDir: '/tmp/dcrouter-data', defaultTsmDbPath: '/tmp/dcrouter-data/db', }, detectedPublicIp: null, apiTokenManager: { validateToken: async (rawTokenArg: string) => rawTokenArg === 'valid-token' ? token : null, hasScope: (storedTokenArg: interfaces.data.IStoredApiToken, scopeArg: interfaces.data.TApiTokenScope) => storedTokenArg.scopes.includes(scopeArg), }, }, } as any; new ConfigHandler(opsServerRef); return router; }; tap.test('ConfigHandler accepts API token with config:read', async () => { const router = makeOpsServer(['config:read']); const result = await fireTypedRequest(router, 'getConfiguration', { apiToken: 'valid-token', }); expect(result.error).toBeUndefined(); expect(result.response.config.system.baseDir).toEqual('/tmp/dcrouter-home'); }); tap.test('ConfigHandler rejects API token without config:read', async () => { const router = makeOpsServer(['logs:read']); const result = await fireTypedRequest(router, 'getConfiguration', { apiToken: 'valid-token', }); expect(result.error?.text).toEqual('insufficient scope'); }); export default tap.start();