mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
feat: pass requestedModes metadata on 401
* feat: pass requestedModes metadata on 401 * fix: bundle modes per target bnode * fix: use custom instance check for HttpError
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import type { BlankNode } from 'n3';
|
||||
import type { CredentialsExtractor } from '../../../src/authentication/CredentialsExtractor';
|
||||
import type { Authorizer } from '../../../src/authorization/Authorizer';
|
||||
import type { PermissionReader } from '../../../src/authorization/PermissionReader';
|
||||
@@ -11,14 +12,18 @@ import type { HttpRequest } from '../../../src/server/HttpRequest';
|
||||
import type { HttpResponse } from '../../../src/server/HttpResponse';
|
||||
import type { OperationHttpHandler } from '../../../src/server/OperationHttpHandler';
|
||||
import { ForbiddenHttpError } from '../../../src/util/errors/ForbiddenHttpError';
|
||||
import { HttpError } from '../../../src/util/errors/HttpError';
|
||||
import { IdentifierMap, IdentifierSetMultiMap } from '../../../src/util/map/IdentifierMap';
|
||||
import { SOLID_META } from '../../../src/util/Vocabularies';
|
||||
|
||||
describe('An AuthorizingHttpHandler', (): void => {
|
||||
const credentials = { };
|
||||
const target = { path: 'http://example.com/foo' };
|
||||
const requestedModes: AccessMap = new IdentifierSetMultiMap<AccessMode>([[ target, AccessMode.read ]]);
|
||||
const requestedModes: AccessMap = new IdentifierSetMultiMap<AccessMode>(
|
||||
[[ target, new Set([ AccessMode.read, AccessMode.write ]) ]],
|
||||
);
|
||||
const availablePermissions: PermissionMap = new IdentifierMap(
|
||||
[[ target, { read: true }]],
|
||||
[[ target, { read: true, write: true }]],
|
||||
);
|
||||
const request: HttpRequest = {} as any;
|
||||
const response: HttpResponse = {} as any;
|
||||
@@ -73,10 +78,26 @@ describe('An AuthorizingHttpHandler', (): void => {
|
||||
expect(source.handleSafe).toHaveBeenLastCalledWith({ request, response, operation });
|
||||
});
|
||||
|
||||
it('errors if authorization fails.', async(): Promise<void> => {
|
||||
it('errors with added access modes if authorization fails.', async(): Promise<void> => {
|
||||
const error = new ForbiddenHttpError();
|
||||
authorizer.handleSafe.mockRejectedValueOnce(error);
|
||||
await expect(handler.handle({ request, response, operation })).rejects.toThrow(error);
|
||||
let handlerError: HttpError | undefined;
|
||||
try {
|
||||
await handler.handle({ request, response, operation });
|
||||
} catch (receivedError: unknown) {
|
||||
if (receivedError instanceof HttpError) {
|
||||
handlerError = receivedError;
|
||||
}
|
||||
}
|
||||
expect(handlerError).toBe(error);
|
||||
const [ bnode ] = handlerError?.metadata?.getAll(SOLID_META.terms.requestedAccess) ?? [];
|
||||
expect(bnode?.termType).toBe('BlankNode');
|
||||
const [ targetQuad ] = handlerError?.metadata?.quads(bnode as BlankNode, SOLID_META.terms.accessTarget) ?? [];
|
||||
expect(targetQuad.object.value).toBe(target.path);
|
||||
const modeQuads = handlerError?.metadata?.quads(bnode as BlankNode, SOLID_META.terms.accessMode) ?? [];
|
||||
const modes = modeQuads.map((quad): string => quad.object.value);
|
||||
expect(modes).toContain(AccessMode.read);
|
||||
expect(modes).toContain(AccessMode.write);
|
||||
expect(source.handleSafe).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user