mirror of
https://github.com/Kaelio/ktx.git
synced 2026-06-22 08:38:08 +02:00
A configured warehouse was always a scan/ingest target. The only way to use a connection purely for SQL execution (ktx sql / sql_execution) was the leaky workaround of an empty setup.database_connection_ids — which actually re-includes every warehouse via the 'fall back to all' branch — so e.g. a BigQuery connection meant only for read-only queries triggered a full-billing-project scan. - Add a per-connection scan_enabled flag (default true) to warehouse connections. scan_enabled: false registers the connection for execution only and never as a scan target. - Route every scan-target selection path through one predicate (isScanTargetWarehouse): both ingest (primaryWarehouseConnectionIds, including the all-warehouses fallback) and setup (configuredPrimaryConnectionIds) now exclude execute-only connections. Setup validates the credential but skips scope discovery and scan for them. Execution paths are untouched — the warehouse descriptor still resolves, so ktx sql / sql_execution keep working. - Scripted setup with no --database-schema no longer silently scopes the scan to every discovered schema/dataset: it warns with the count and names how to narrow (--database-schema) or opt out (scan_enabled: false).
98 lines
3.7 KiB
TypeScript
98 lines
3.7 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import {
|
|
isExecuteOnlyConnection,
|
|
isScanTargetWarehouse,
|
|
localConnectionInfoFromConfig,
|
|
localConnectionToWarehouseDescriptor,
|
|
localConnectionTypeForConfig,
|
|
} from '../../../src/context/connections/local-warehouse-descriptor.js';
|
|
|
|
describe('execute-only warehouse connections', () => {
|
|
it('treats a warehouse without scan_enabled as a scan target', () => {
|
|
const connection = { driver: 'postgres', url: 'postgresql://db/a' } as const;
|
|
expect(isExecuteOnlyConnection(connection)).toBe(false);
|
|
expect(isScanTargetWarehouse('w', connection)).toBe(true);
|
|
});
|
|
|
|
it('excludes a warehouse with scan_enabled: false from scan targets but still resolves it as a warehouse', () => {
|
|
const connection = { driver: 'postgres', url: 'postgresql://db/a', scan_enabled: false } as const;
|
|
expect(isExecuteOnlyConnection(connection)).toBe(true);
|
|
expect(isScanTargetWarehouse('w', connection)).toBe(false);
|
|
// Execution paths must still see it as a warehouse so `ktx sql` works.
|
|
expect(localConnectionToWarehouseDescriptor('w', connection)).not.toBeNull();
|
|
});
|
|
|
|
it('does not treat non-warehouse connections as scan targets', () => {
|
|
expect(isScanTargetWarehouse('n', { driver: 'notion', auth_token: 'x' } as never)).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('localConnectionToWarehouseDescriptor', () => {
|
|
it('maps local Postgres URLs to canonical warehouse descriptors', () => {
|
|
expect(
|
|
localConnectionToWarehouseDescriptor('warehouse', {
|
|
driver: 'postgres',
|
|
url: 'postgresql://readonly@db.example.test/analytics',
|
|
}),
|
|
).toMatchObject({
|
|
id: 'warehouse',
|
|
connection_type: 'POSTGRESQL',
|
|
host: 'db.example.test',
|
|
database: 'analytics',
|
|
});
|
|
});
|
|
|
|
it('maps BigQuery project and dataset from explicit fields', () => {
|
|
expect(
|
|
localConnectionToWarehouseDescriptor('bq', {
|
|
driver: 'bigquery',
|
|
project_id: 'acme',
|
|
dataset_id: 'warehouse',
|
|
}),
|
|
).toMatchObject({
|
|
id: 'bq',
|
|
connection_type: 'BIGQUERY',
|
|
project_id: 'acme',
|
|
dataset_id: 'warehouse',
|
|
});
|
|
});
|
|
|
|
it('returns null for non-warehouse adapters', () => {
|
|
expect(
|
|
localConnectionToWarehouseDescriptor('looker', {
|
|
driver: 'looker',
|
|
base_url: 'https://looker.example.com',
|
|
client_id: 'client',
|
|
}),
|
|
).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('local connection info helpers', () => {
|
|
it('returns canonical warehouse connection types for local catalogs', () => {
|
|
expect(localConnectionTypeForConfig('warehouse', { driver: 'postgres' })).toBe('POSTGRESQL');
|
|
expect(localConnectionTypeForConfig('bq', { driver: 'bigquery', project_id: 'acme' })).toBe('BIGQUERY');
|
|
expect(localConnectionTypeForConfig('snowflake', { driver: 'snowflake' })).toBe('SNOWFLAKE');
|
|
});
|
|
|
|
it('keeps removed driver aliases as display-only labels', () => {
|
|
expect(localConnectionTypeForConfig('warehouse', { driver: 'postgresql' } as never)).toBe('postgresql');
|
|
expect(localConnectionTypeForConfig('warehouse', { driver: 'mssql' } as never)).toBe('mssql');
|
|
});
|
|
|
|
it('keeps non-warehouse adapter labels for display-only local connection surfaces', () => {
|
|
expect(localConnectionTypeForConfig('prod-metabase', { driver: 'metabase', api_url: 'https://metabase.example.com' })).toBe(
|
|
'metabase',
|
|
);
|
|
expect(localConnectionTypeForConfig('missing-driver', {} as never)).toBe('unknown');
|
|
});
|
|
|
|
it('builds nullable local connection info records', () => {
|
|
expect(localConnectionInfoFromConfig('warehouse', { driver: 'postgres' })).toEqual({
|
|
id: 'warehouse',
|
|
name: 'warehouse',
|
|
connectionType: 'POSTGRESQL',
|
|
});
|
|
expect(localConnectionInfoFromConfig('missing', undefined)).toBeNull();
|
|
});
|
|
});
|