n8cn / packages /cli /src /services /__tests__ /credentials-finder.service.test.ts
gallyga's picture
Add n8n Chinese version
aec3094
import { SharedCredentials } from '@n8n/db';
import type { CredentialsEntity } from '@n8n/db';
import type { User } from '@n8n/db';
import { Container } from '@n8n/di';
import { In } from '@n8n/typeorm';
import { mock } from 'jest-mock-extended';
import { CredentialsFinderService } from '@/credentials/credentials-finder.service';
import { mockEntityManager } from '@test/mocking';
describe('CredentialsFinderService', () => {
const entityManager = mockEntityManager(SharedCredentials);
const credentialsFinderService = Container.get(CredentialsFinderService);
describe('findCredentialForUser', () => {
const credentialsId = 'cred_123';
const sharedCredential = mock<SharedCredentials>();
sharedCredential.credentials = mock<CredentialsEntity>({ id: credentialsId });
const owner = mock<User>({
role: 'global:owner',
});
const member = mock<User>({
role: 'global:member',
id: 'test',
});
beforeEach(() => {
jest.resetAllMocks();
});
test('should allow instance owner access to all credentials', async () => {
entityManager.findOne.mockResolvedValueOnce(sharedCredential);
const credential = await credentialsFinderService.findCredentialForUser(
credentialsId,
owner,
['credential:read'],
);
expect(entityManager.findOne).toHaveBeenCalledWith(SharedCredentials, {
relations: { credentials: { shared: { project: { projectRelations: { user: true } } } } },
where: { credentialsId },
});
expect(credential).toEqual(sharedCredential.credentials);
});
test('should allow members', async () => {
entityManager.findOne.mockResolvedValueOnce(sharedCredential);
const credential = await credentialsFinderService.findCredentialForUser(
credentialsId,
member,
['credential:read'],
);
expect(entityManager.findOne).toHaveBeenCalledWith(SharedCredentials, {
relations: { credentials: { shared: { project: { projectRelations: { user: true } } } } },
where: {
credentialsId,
role: In(['credential:owner', 'credential:user']),
project: {
projectRelations: {
role: In([
'project:admin',
'project:personalOwner',
'project:editor',
'project:viewer',
]),
userId: member.id,
},
},
},
});
expect(credential).toEqual(sharedCredential.credentials);
});
test('should return null when no shared credential is found', async () => {
entityManager.findOne.mockResolvedValueOnce(null);
const credential = await credentialsFinderService.findCredentialForUser(
credentialsId,
member,
['credential:read'],
);
expect(entityManager.findOne).toHaveBeenCalledWith(SharedCredentials, {
relations: { credentials: { shared: { project: { projectRelations: { user: true } } } } },
where: {
credentialsId,
role: In(['credential:owner', 'credential:user']),
project: {
projectRelations: {
role: In([
'project:admin',
'project:personalOwner',
'project:editor',
'project:viewer',
]),
userId: member.id,
},
},
},
});
expect(credential).toEqual(null);
});
});
});