fix: Return WAC-Allow header in 304 responses

This commit is contained in:
Joachim Van Herwegen
2023-07-27 13:31:54 +02:00
parent baa64987c6
commit 43e8ef99b0
2 changed files with 55 additions and 1 deletions

View File

@@ -11,6 +11,7 @@ import type { HttpRequest } from '../../../src/server/HttpRequest';
import type { HttpResponse } from '../../../src/server/HttpResponse';
import type { OperationHttpHandler } from '../../../src/server/OperationHttpHandler';
import { WacAllowHttpHandler } from '../../../src/server/WacAllowHttpHandler';
import { NotModifiedHttpError } from '../../../src/util/errors/NotModifiedHttpError';
import { IdentifierMap, IdentifierSetMultiMap } from '../../../src/util/map/IdentifierMap';
import { ACL, AUTH } from '../../../src/util/Vocabularies';
@@ -77,6 +78,43 @@ describe('A WacAllowHttpHandler', (): void => {
});
});
it('adds permission metadata for 304 responses.', async(): Promise<void> => {
permissionReader.handleSafe.mockResolvedValueOnce(new IdentifierMap(
[[ target, { read: true, write: true, append: false }]],
));
source.handleSafe.mockRejectedValueOnce(new NotModifiedHttpError());
let error: unknown;
try {
await handler.handle({ operation, request, response });
} catch (err: unknown) {
error = err;
}
expect(NotModifiedHttpError.isInstance(error)).toBe(true);
expect((error as NotModifiedHttpError).metadata.getAll(AUTH.terms.userMode))
.toEqualRdfTermArray([ ACL.terms.Read, ACL.terms.Write ]);
expect((error as NotModifiedHttpError).metadata.getAll(AUTH.terms.publicMode))
.toEqualRdfTermArray([ ACL.terms.Read, ACL.terms.Write ]);
expect(source.handleSafe).toHaveBeenCalledTimes(1);
expect(source.handleSafe).toHaveBeenLastCalledWith({ operation, request, response });
expect(credentialsExtractor.handleSafe).toHaveBeenCalledTimes(1);
expect(credentialsExtractor.handleSafe).toHaveBeenLastCalledWith(request);
expect(modesExtractor.handleSafe).toHaveBeenCalledTimes(1);
expect(modesExtractor.handleSafe).toHaveBeenLastCalledWith(operation);
expect(permissionReader.handleSafe).toHaveBeenCalledTimes(1);
expect(permissionReader.handleSafe).toHaveBeenLastCalledWith({
credentials: await credentialsExtractor.handleSafe.mock.results[0].value,
requestedModes: await modesExtractor.handleSafe.mock.results[0].value,
});
});
it('rethrows errors.', async(): Promise<void> => {
const error = new Error('bad data');
source.handleSafe.mockRejectedValueOnce(error);
await expect(handler.handle({ operation, request, response })).rejects.toThrow(error);
});
it('determines public permissions separately in case of an authenticated request.', async(): Promise<void> => {
credentialsExtractor.handleSafe.mockResolvedValue({ agent: { webId: 'http://example.com/#me' }});
permissionReader.handleSafe.mockResolvedValueOnce(new IdentifierMap(