mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-18 02:21:13 +00:00
test(core): Move unit tests closer to testable components (no-changelog) (#10287)
This commit is contained in:
102
packages/cli/src/services/__tests__/user.service.test.ts
Normal file
102
packages/cli/src/services/__tests__/user.service.test.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { mock } from 'jest-mock-extended';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
|
||||
import { User } from '@db/entities/User';
|
||||
import { UserService } from '@/services/user.service';
|
||||
import { UrlService } from '@/services/url.service';
|
||||
import { mockInstance } from '@test/mocking';
|
||||
import { UserRepository } from '@/databases/repositories/user.repository';
|
||||
import { GlobalConfig } from '@n8n/config';
|
||||
|
||||
describe('UserService', () => {
|
||||
const globalConfig = mockInstance(GlobalConfig, {
|
||||
host: 'localhost',
|
||||
path: '/',
|
||||
port: 5678,
|
||||
listen_address: '0.0.0.0',
|
||||
protocol: 'http',
|
||||
});
|
||||
const urlService = new UrlService(globalConfig);
|
||||
const userRepository = mockInstance(UserRepository);
|
||||
const userService = new UserService(mock(), userRepository, mock(), urlService, mock());
|
||||
|
||||
const commonMockUser = Object.assign(new User(), {
|
||||
id: uuid(),
|
||||
password: 'passwordHash',
|
||||
});
|
||||
|
||||
describe('toPublic', () => {
|
||||
it('should remove sensitive properties', async () => {
|
||||
const mockUser = Object.assign(new User(), {
|
||||
id: uuid(),
|
||||
password: 'passwordHash',
|
||||
mfaEnabled: false,
|
||||
mfaSecret: 'test',
|
||||
mfaRecoveryCodes: ['test'],
|
||||
updatedAt: new Date(),
|
||||
authIdentities: [],
|
||||
});
|
||||
|
||||
type MaybeSensitiveProperties = Partial<
|
||||
Pick<User, 'password' | 'updatedAt' | 'authIdentities'>
|
||||
>;
|
||||
|
||||
// to prevent typechecking from blocking assertions
|
||||
const publicUser: MaybeSensitiveProperties = await userService.toPublic(mockUser);
|
||||
|
||||
expect(publicUser.password).toBeUndefined();
|
||||
expect(publicUser.updatedAt).toBeUndefined();
|
||||
expect(publicUser.authIdentities).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should add scopes if requested', async () => {
|
||||
const scoped = await userService.toPublic(commonMockUser, { withScopes: true });
|
||||
const unscoped = await userService.toPublic(commonMockUser);
|
||||
|
||||
expect(scoped.globalScopes).toEqual([]);
|
||||
expect(unscoped.globalScopes).toBeUndefined();
|
||||
});
|
||||
|
||||
it('should add invite URL if requested', async () => {
|
||||
const firstUser = Object.assign(new User(), { id: uuid() });
|
||||
const secondUser = Object.assign(new User(), { id: uuid(), isPending: true });
|
||||
|
||||
const withoutUrl = await userService.toPublic(secondUser);
|
||||
const withUrl = await userService.toPublic(secondUser, {
|
||||
withInviteUrl: true,
|
||||
inviterId: firstUser.id,
|
||||
});
|
||||
|
||||
expect(withoutUrl.inviteAcceptUrl).toBeUndefined();
|
||||
|
||||
const url = new URL(withUrl.inviteAcceptUrl ?? '');
|
||||
|
||||
expect(url.searchParams.get('inviterId')).toBe(firstUser.id);
|
||||
expect(url.searchParams.get('inviteeId')).toBe(secondUser.id);
|
||||
});
|
||||
});
|
||||
|
||||
describe('update', () => {
|
||||
// We need to use `save` so that that the subscriber in
|
||||
// packages/cli/src/databases/entities/Project.ts receives the full user.
|
||||
// With `update` it would only receive the updated fields, e.g. the `id`
|
||||
// would be missing.
|
||||
it('should use `save` instead of `update`', async () => {
|
||||
const user = new User();
|
||||
user.firstName = 'Not Nathan';
|
||||
user.lastName = 'Nathaniel';
|
||||
|
||||
const userId = '1234';
|
||||
const data = {
|
||||
firstName: 'Nathan',
|
||||
};
|
||||
|
||||
userRepository.findOneBy.mockResolvedValueOnce(user);
|
||||
|
||||
await userService.update(userId, data);
|
||||
|
||||
expect(userRepository.save).toHaveBeenCalledWith({ ...user, ...data }, { transaction: true });
|
||||
expect(userRepository.update).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user