Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
190 lines
5.0 KiB
TypeScript
190 lines
5.0 KiB
TypeScript
import { testDb } from '@n8n/backend-test-utils';
|
|
import { SettingsRepository } from '@n8n/db';
|
|
import { Container } from '@n8n/di';
|
|
import { DataSource } from '@n8n/typeorm';
|
|
|
|
describe('SettingsRepository', () => {
|
|
let settingsRepository: SettingsRepository;
|
|
|
|
beforeAll(async () => {
|
|
await testDb.init();
|
|
settingsRepository = Container.get(SettingsRepository);
|
|
});
|
|
|
|
beforeEach(async () => {
|
|
await testDb.truncate(['Settings']);
|
|
});
|
|
|
|
afterAll(async () => {
|
|
await testDb.terminate();
|
|
});
|
|
|
|
describe('findByKey()', () => {
|
|
it('should return null when key does not exist', async () => {
|
|
const result = await settingsRepository.findByKey('non.existent.key');
|
|
|
|
expect(result).toBeNull();
|
|
});
|
|
|
|
it('should return the setting when key exists', async () => {
|
|
await settingsRepository.save({
|
|
key: 'test.find.by.key',
|
|
value: 'found-value',
|
|
loadOnStartup: true,
|
|
});
|
|
|
|
const result = await settingsRepository.findByKey('test.find.by.key');
|
|
|
|
expect(result).toMatchObject({ key: 'test.find.by.key', value: 'found-value' });
|
|
});
|
|
|
|
it('should use the provided EntityManager instead of the default one', async () => {
|
|
await settingsRepository.save({
|
|
key: 'test.find.by.key.em',
|
|
value: 'em-value',
|
|
loadOnStartup: false,
|
|
});
|
|
|
|
const dataSource = Container.get(DataSource);
|
|
const em = dataSource.manager;
|
|
|
|
const result = await settingsRepository.findByKey('test.find.by.key.em', em);
|
|
|
|
expect(result).toMatchObject({ key: 'test.find.by.key.em', value: 'em-value' });
|
|
});
|
|
|
|
it('should work inside a transaction', async () => {
|
|
const dataSource = Container.get(DataSource);
|
|
|
|
await dataSource.manager.transaction(async (trx) => {
|
|
await trx.save(
|
|
settingsRepository.create({
|
|
key: 'test.trx.key',
|
|
value: 'trx-value',
|
|
loadOnStartup: false,
|
|
}),
|
|
);
|
|
|
|
// Should find the row using the same transaction
|
|
const result = await settingsRepository.findByKey('test.trx.key', trx);
|
|
expect(result).toMatchObject({ key: 'test.trx.key', value: 'trx-value' });
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('findByKeys()', () => {
|
|
it('should return empty array when given empty keys array', async () => {
|
|
await settingsRepository.save({
|
|
key: 'test:key:1',
|
|
value: 'value1',
|
|
loadOnStartup: false,
|
|
});
|
|
|
|
const settings = await settingsRepository.findByKeys([]);
|
|
|
|
expect(settings).toEqual([]);
|
|
});
|
|
|
|
it('should return empty array when no settings exist for given keys', async () => {
|
|
const settings = await settingsRepository.findByKeys(['non.existent.key']);
|
|
|
|
expect(settings).toEqual([]);
|
|
});
|
|
|
|
it('should return single setting when one key matches', async () => {
|
|
const saved = await settingsRepository.save({
|
|
key: 'test:key:single',
|
|
value: 'single-value',
|
|
loadOnStartup: true,
|
|
});
|
|
|
|
const settings = await settingsRepository.findByKeys(['test:key:single']);
|
|
|
|
expect(settings).toHaveLength(1);
|
|
expect(settings[0]).toMatchObject({
|
|
key: saved.key,
|
|
value: saved.value,
|
|
loadOnStartup: saved.loadOnStartup,
|
|
});
|
|
});
|
|
|
|
it('should return multiple settings when multiple keys match', async () => {
|
|
const a = await settingsRepository.save({
|
|
key: 'test:key:a',
|
|
value: 'valueA',
|
|
loadOnStartup: false,
|
|
});
|
|
const b = await settingsRepository.save({
|
|
key: 'test:key:b',
|
|
value: 'valueB',
|
|
loadOnStartup: false,
|
|
});
|
|
const c = await settingsRepository.save({
|
|
key: 'test:key:c',
|
|
value: 'valueC',
|
|
loadOnStartup: true,
|
|
});
|
|
|
|
const settings = await settingsRepository.findByKeys([
|
|
'test:key:a',
|
|
'test:key:b',
|
|
'test:key:c',
|
|
]);
|
|
|
|
expect(settings).toHaveLength(3);
|
|
expect(settings).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({ key: a.key, value: a.value }),
|
|
expect.objectContaining({ key: b.key, value: b.value }),
|
|
expect.objectContaining({ key: c.key, value: c.value }),
|
|
]),
|
|
);
|
|
});
|
|
|
|
it('should return only existing settings when some keys do not exist', async () => {
|
|
const a = await settingsRepository.save({
|
|
key: 'test:key:exists',
|
|
value: 'exists-value',
|
|
loadOnStartup: false,
|
|
});
|
|
|
|
const settings = await settingsRepository.findByKeys([
|
|
'test:key:exists',
|
|
'non.existent.key.1',
|
|
'non.existent.key.2',
|
|
]);
|
|
|
|
expect(settings).toHaveLength(1);
|
|
expect(settings[0]).toMatchObject({ key: a.key, value: a.value });
|
|
});
|
|
|
|
it('should return each setting only once when keys array contains duplicates', async () => {
|
|
const a = await settingsRepository.save({
|
|
key: 'test:key:dup:a',
|
|
value: 'dupA',
|
|
loadOnStartup: false,
|
|
});
|
|
const b = await settingsRepository.save({
|
|
key: 'test:key:dup:b',
|
|
value: 'dupB',
|
|
loadOnStartup: false,
|
|
});
|
|
|
|
const settings = await settingsRepository.findByKeys([
|
|
'test:key:dup:a',
|
|
'test:key:dup:b',
|
|
'test:key:dup:a',
|
|
'test:key:dup:b',
|
|
]);
|
|
|
|
expect(settings).toHaveLength(2);
|
|
expect(settings).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({ key: a.key }),
|
|
expect.objectContaining({ key: b.key }),
|
|
]),
|
|
);
|
|
});
|
|
});
|
|
});
|