ktx/packages/connector-posthog/src/dialect.test.ts
2026-05-10 23:51:24 +02:00

48 lines
2.6 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { KtxPostHogDialect } from './dialect.js';
describe('KtxPostHogDialect', () => {
const dialect = new KtxPostHogDialect();
it('quotes identifiers, formats table names, maps types, and prepares HogQL params', () => {
expect(dialect.quoteIdentifier('weird`name')).toBe('`weird\\`name`');
expect(dialect.formatTableName({ name: 'events', catalog: '157881', db: null })).toBe('`events`');
expect(dialect.mapDataType('Nullable(DateTime64(6, UTC))')).toBe('TIMESTAMP');
expect(dialect.mapDataType('Array(String)')).toBe('JSON');
expect(dialect.mapToDimensionType('UInt8')).toBe('number');
expect(dialect.mapToDimensionType('Boolean')).toBe('boolean');
expect(dialect.prepareQuery('SELECT * FROM events WHERE event = :event', { event: '$pageview' })).toEqual({
sql: 'SELECT * FROM events WHERE event = {event}',
params: { event: '$pageview' },
});
});
it('builds sample and virtual-property queries without app dependencies', () => {
expect(dialect.generateSampleQuery('`events`', 5, ['event', 'timestamp'])).toBe(
'SELECT `event`, `timestamp` FROM `events` ORDER BY rand() LIMIT 5',
);
expect(
dialect.generateSampleQueryWithMetadata('`events`', 3, [
{ name: 'event', parentColumnId: null },
{ name: 'properties.$browser', parentColumnId: 'properties' },
]),
).toBe(
"SELECT `event`, JSONExtractString(properties, '$browser') AS `properties.$browser` FROM `events` ORDER BY rand() LIMIT 3",
);
expect(dialect.generateColumnSampleQuery('`events`', 'properties.$browser', 10)).toBe(
"SELECT JSONExtractString(properties, '$browser') FROM `events` WHERE JSONExtractString(properties, '$browser') IS NOT NULL ORDER BY rand() LIMIT 10",
);
});
it('builds data-dictionary and time helper SQL', () => {
expect(dialect.generateCardinalitySampleQuery('events', 'properties.$browser', 100)).toContain(
"JSONExtractString(properties, '$browser') AS val",
);
expect(dialect.generateDistinctValuesQuery('events', 'event', 20)).toContain('SELECT DISTINCT toString(`event`) AS val');
expect(dialect.getNullCountExpression('event')).toBe('countIf(event IS NULL)');
expect(dialect.getDistinctCountExpression('event')).toBe('uniq(event)');
expect(dialect.getTimeTruncExpression('timestamp', 'week', 'UTC')).toBe("DATE_TRUNC('week', toTimeZone(timestamp, 'UTC'))");
expect(dialect.parseIntervalToSql('7 day')).toBe('INTERVAL 7 DAY');
expect(dialect.generateColumnStatisticsQuery('', 'events')).toBeNull();
});
});