mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-22 08:38:08 +02:00
115 lines
3.7 KiB
TypeScript
115 lines
3.7 KiB
TypeScript
import { mkdtemp, rm } from 'node:fs/promises';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
import { initKtxProject, type KtxLocalProject } from '../../../src/context/project/project.js';
|
|
import { loadLatestSlDictionaryEntries } from '../../../src/context/sl/sl-dictionary-profile.js';
|
|
|
|
describe('loadLatestSlDictionaryEntries', () => {
|
|
let tempDir: string;
|
|
let project: KtxLocalProject;
|
|
|
|
beforeEach(async () => {
|
|
tempDir = await mkdtemp(join(tmpdir(), 'ktx-sl-dictionary-profile-'));
|
|
project = await initKtxProject({ projectDir: join(tempDir, 'project') });
|
|
});
|
|
|
|
afterEach(async () => {
|
|
await rm(tempDir, { recursive: true, force: true });
|
|
});
|
|
|
|
it('loads latest relationship-profile sample values for dictionary candidate columns', async () => {
|
|
await project.fileStore.writeFile(
|
|
'raw-sources/warehouse/live-database/sync-1/enrichment/relationship-profile.json',
|
|
`${JSON.stringify(
|
|
{
|
|
connectionId: 'warehouse',
|
|
driver: 'postgres',
|
|
sqlAvailable: true,
|
|
queryCount: 4,
|
|
tables: [],
|
|
columns: {
|
|
'orders.status': {
|
|
table: { catalog: null, db: 'public', name: 'orders' },
|
|
column: 'status',
|
|
nativeType: 'text',
|
|
normalizedType: 'string',
|
|
rowCount: 20,
|
|
nullCount: 0,
|
|
distinctCount: 3,
|
|
uniquenessRatio: 0.15,
|
|
nullRate: 0,
|
|
sampleValues: ['paid', 'refunded', 'pending'],
|
|
minTextLength: 4,
|
|
maxTextLength: 8,
|
|
},
|
|
'orders.customer_id': {
|
|
table: { catalog: null, db: 'public', name: 'orders' },
|
|
column: 'customer_id',
|
|
nativeType: 'text',
|
|
normalizedType: 'string',
|
|
rowCount: 20,
|
|
nullCount: 0,
|
|
distinctCount: 20,
|
|
uniquenessRatio: 1,
|
|
nullRate: 0,
|
|
sampleValues: ['cus_1'],
|
|
minTextLength: 5,
|
|
maxTextLength: 5,
|
|
},
|
|
},
|
|
warnings: [],
|
|
},
|
|
null,
|
|
2,
|
|
)}\n`,
|
|
'ktx',
|
|
'ktx@example.com',
|
|
'Seed profile',
|
|
);
|
|
|
|
await project.fileStore.writeFile(
|
|
'raw-sources/warehouse/live-database/sync-2/enrichment/relationship-profile.json',
|
|
`${JSON.stringify(
|
|
{
|
|
connectionId: 'warehouse',
|
|
driver: 'postgres',
|
|
sqlAvailable: true,
|
|
queryCount: 4,
|
|
tables: [],
|
|
columns: {
|
|
'orders.status': {
|
|
table: { catalog: null, db: 'public', name: 'orders' },
|
|
column: 'status',
|
|
nativeType: 'text',
|
|
normalizedType: 'string',
|
|
rowCount: 20,
|
|
nullCount: 0,
|
|
distinctCount: 2,
|
|
uniquenessRatio: 0.1,
|
|
nullRate: 0,
|
|
sampleValues: ['settled', 'voided'],
|
|
minTextLength: 6,
|
|
maxTextLength: 7,
|
|
},
|
|
},
|
|
warnings: [],
|
|
},
|
|
null,
|
|
2,
|
|
)}\n`,
|
|
'ktx',
|
|
'ktx@example.com',
|
|
'Seed newer profile',
|
|
);
|
|
|
|
await expect(loadLatestSlDictionaryEntries(project, ['warehouse'])).resolves.toEqual([
|
|
{ connectionId: 'warehouse', sourceName: 'orders', columnName: 'status', value: 'settled', cardinality: 2 },
|
|
{ connectionId: 'warehouse', sourceName: 'orders', columnName: 'status', value: 'voided', cardinality: 2 },
|
|
]);
|
|
});
|
|
|
|
it('returns an empty list when no relationship profile exists', async () => {
|
|
await expect(loadLatestSlDictionaryEntries(project, ['warehouse'])).resolves.toEqual([]);
|
|
});
|
|
});
|