import { DataFactory, Store } from 'n3'; import type { AccessCheckerArgs } from '../../../../src/authorization/access-checkers/AccessChecker'; import { AgentGroupAccessChecker } from '../../../../src/authorization/access-checkers/AgentGroupAccessChecker'; import { BasicRepresentation } from '../../../../src/ldp/representation/BasicRepresentation'; import type { Representation } from '../../../../src/ldp/representation/Representation'; import type { RepresentationConverter } from '../../../../src/storage/conversion/RepresentationConverter'; import { INTERNAL_QUADS } from '../../../../src/util/ContentTypes'; import * as fetchUtil from '../../../../src/util/FetchUtil'; import { ACL, VCARD } from '../../../../src/util/Vocabularies'; const { namedNode, quad } = DataFactory; describe('An AgentGroupAccessChecker', (): void => { const webId = 'http://test.com/alice/profile/card#me'; const groupId = 'http://test.com/group'; const acl = new Store(); acl.addQuad(namedNode('groupMatch'), ACL.terms.agentGroup, namedNode(groupId)); acl.addQuad(namedNode('noMatch'), ACL.terms.agentGroup, namedNode('badGroup')); let fetchMock: jest.SpyInstance; let representation: Representation; const converter: RepresentationConverter = {} as any; let checker: AgentGroupAccessChecker; beforeEach(async(): Promise => { const groupQuads = [ quad(namedNode(groupId), VCARD.terms.hasMember, namedNode(webId)) ]; representation = new BasicRepresentation(groupQuads, INTERNAL_QUADS, false); fetchMock = jest.spyOn(fetchUtil, 'fetchDataset'); fetchMock.mockResolvedValue(representation); checker = new AgentGroupAccessChecker(converter); }); it('can handle all requests.', async(): Promise => { await expect(checker.canHandle(null as any)).resolves.toBeUndefined(); }); it('returns true if the WebID is a valid group member.', async(): Promise => { const input: AccessCheckerArgs = { acl, rule: namedNode('groupMatch'), credentials: { webId }}; await expect(checker.handle(input)).resolves.toBe(true); }); it('returns false if the WebID is not a valid group member.', async(): Promise => { const input: AccessCheckerArgs = { acl, rule: namedNode('noMatch'), credentials: { webId }}; await expect(checker.handle(input)).resolves.toBe(false); }); it('returns false if there are no WebID credentials.', async(): Promise => { const input: AccessCheckerArgs = { acl, rule: namedNode('groupMatch'), credentials: {}}; await expect(checker.handle(input)).resolves.toBe(false); }); });