80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
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<string, any>,
|
|
) => {
|
|
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();
|