mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-14 16:44:07 -08:00
test: add initial ldap service unit tests
This commit is contained in:
parent
57467d0285
commit
dd31e5fd40
180
packages/cli/src/ldap/__tests__/ldap.service.test.ts
Normal file
180
packages/cli/src/ldap/__tests__/ldap.service.test.ts
Normal file
|
@ -0,0 +1,180 @@
|
|||
import { mock } from 'jest-mock-extended';
|
||||
import { LdapService } from '@/ldap/ldap.service.ee';
|
||||
import { SettingsRepository } from '@/databases/repositories/settings.repository';
|
||||
import { Settings } from '@/databases/entities/settings';
|
||||
import { Logger } from '@/logging/logger.service';
|
||||
import type { LdapConfig } from '@/ldap/types';
|
||||
import { mockInstance } from '@test/mocking';
|
||||
import config from '@/config';
|
||||
import { LDAP_LOGIN_ENABLED, LDAP_LOGIN_LABEL } from '@/ldap/constants';
|
||||
import { sync } from 'fast-glob';
|
||||
|
||||
// Need fake timers to avoid setInterval
|
||||
// problems with the scheduled sync
|
||||
jest.useFakeTimers();
|
||||
|
||||
describe('LdapService', () => {
|
||||
const OLD_ENV = process.env;
|
||||
|
||||
const fakeConfig: LdapConfig = {
|
||||
loginEnabled: true,
|
||||
loginLabel: 'fakeLoginLabel',
|
||||
connectionUrl: 'https://connection.url',
|
||||
allowUnauthorizedCerts: true,
|
||||
connectionSecurity: 'none',
|
||||
connectionPort: 1234,
|
||||
baseDn: 'dc=example,dc=com',
|
||||
bindingAdminDn: 'uid=jdoe,ou=users,dc=example,dc=com',
|
||||
bindingAdminPassword: 'fakePassword',
|
||||
firstNameAttribute: 'givenName',
|
||||
lastNameAttribute: 'sn',
|
||||
emailAttribute: 'mail',
|
||||
loginIdAttribute: 'uid',
|
||||
ldapIdAttribute: 'uid',
|
||||
userFilter: '',
|
||||
synchronizationEnabled: true,
|
||||
synchronizationInterval: 60,
|
||||
searchPageSize: 1,
|
||||
searchTimeout: 6,
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
process.env = { ...OLD_ENV };
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
jest.restoreAllMocks();
|
||||
|
||||
process.env = OLD_ENV;
|
||||
});
|
||||
|
||||
describe('init()', () => {
|
||||
it('should load the ldap configuration', async () => {
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
|
||||
const ldapService = new LdapService(mock(), settingsRepo, mock(), mock());
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(fakeConfig),
|
||||
} as Settings);
|
||||
const loadConfigSpy = jest.spyOn(ldapService, 'loadConfig');
|
||||
|
||||
await ldapService.init();
|
||||
|
||||
expect(loadConfigSpy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('should set expected configuration variables from LDAP config if ldap is enabled', async () => {
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
const mockLogger = mock<Logger>();
|
||||
|
||||
const ldapService = new LdapService(mockLogger, settingsRepo, mock(), mock());
|
||||
|
||||
const configSetSpy = jest.spyOn(config, 'set');
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(fakeConfig),
|
||||
} as Settings);
|
||||
|
||||
await ldapService.init();
|
||||
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(1, LDAP_LOGIN_ENABLED, fakeConfig.loginEnabled);
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
'userManagement.authenticationMethod',
|
||||
'ldap',
|
||||
);
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(3, LDAP_LOGIN_LABEL, fakeConfig.loginLabel);
|
||||
});
|
||||
|
||||
it('should set expected configuration variables from LDAP config if ldap is not enabled', async () => {
|
||||
const givenConfig = { ...fakeConfig, loginEnabled: false };
|
||||
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
const mockLogger = mock<Logger>();
|
||||
|
||||
const ldapService = new LdapService(mockLogger, settingsRepo, mock(), mock());
|
||||
|
||||
const configSetSpy = jest.spyOn(config, 'set');
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(givenConfig),
|
||||
} as Settings);
|
||||
|
||||
await ldapService.init();
|
||||
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(1, LDAP_LOGIN_ENABLED, givenConfig.loginEnabled);
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(
|
||||
2,
|
||||
'userManagement.authenticationMethod',
|
||||
'email',
|
||||
);
|
||||
expect(configSetSpy).toHaveBeenNthCalledWith(3, LDAP_LOGIN_LABEL, givenConfig.loginLabel);
|
||||
});
|
||||
|
||||
it('should show logger warning if authentication method is not ldap or email', async () => {
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
const mockLogger = mock<Logger>();
|
||||
|
||||
const ldapService = new LdapService(mockLogger, settingsRepo, mock(), mock());
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(fakeConfig),
|
||||
} as Settings);
|
||||
config.set('userManagement.authenticationMethod', 'invalid');
|
||||
|
||||
await ldapService.init();
|
||||
|
||||
expect(mockLogger.warn).toHaveBeenCalledTimes(1);
|
||||
expect(mockLogger.warn).toHaveBeenCalledWith(
|
||||
'Cannot set LDAP login enabled state when an authentication method other than email or ldap is active (current: invalid)',
|
||||
expect.any(Error),
|
||||
);
|
||||
});
|
||||
|
||||
it('should schedule syncing if config has enabled synchronization', async () => {
|
||||
const givenConfig = {
|
||||
...fakeConfig,
|
||||
synchronizationEnabled: true,
|
||||
synchronizationInterval: 10,
|
||||
};
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
const mockLogger = mock<Logger>();
|
||||
|
||||
const ldapService = new LdapService(mockLogger, settingsRepo, mock(), mock());
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(givenConfig),
|
||||
} as Settings);
|
||||
const setIntervalSpy = jest.spyOn(global, 'setInterval');
|
||||
|
||||
await ldapService.init();
|
||||
|
||||
expect(setIntervalSpy).toHaveBeenCalledTimes(1);
|
||||
expect(setIntervalSpy).toHaveBeenCalledWith(
|
||||
expect.any(Function),
|
||||
givenConfig.synchronizationInterval * 60000,
|
||||
);
|
||||
});
|
||||
|
||||
it('should throw an error if config has enabled synchronization but no synchronizationInterval is set', async () => {
|
||||
const givenConfig = {
|
||||
...fakeConfig,
|
||||
synchronizationEnabled: true,
|
||||
synchronizationInterval: 0,
|
||||
};
|
||||
const settingsRepo = mockInstance(SettingsRepository);
|
||||
const mockLogger = mock<Logger>();
|
||||
|
||||
const ldapService = new LdapService(mockLogger, settingsRepo, mock(), mock());
|
||||
|
||||
settingsRepo.findOneByOrFail.mockResolvedValue({
|
||||
value: JSON.stringify(givenConfig),
|
||||
} as Settings);
|
||||
const setIntervalSpy = jest.spyOn(global, 'setInterval');
|
||||
|
||||
await expect(ldapService.init()).rejects.toThrowError('Interval variable has to be defined');
|
||||
expect(setIntervalSpy).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue