Files
alighasami 3d5eaf9445
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
first commit
2026-03-17 16:22:57 +03:30

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 }),
]),
);
});
});
});