@fabricorg/databricks-testkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +82 -0
- package/dist/chunk-7JVDOSBO.js +94 -0
- package/dist/chunk-7JVDOSBO.js.map +1 -0
- package/dist/chunk-F3KU6VZS.js +56 -0
- package/dist/chunk-F3KU6VZS.js.map +1 -0
- package/dist/chunk-FBADA7LQ.js +195 -0
- package/dist/chunk-FBADA7LQ.js.map +1 -0
- package/dist/chunk-MLBZCHRM.js +37 -0
- package/dist/chunk-MLBZCHRM.js.map +1 -0
- package/dist/duckdb-context-FX23RUBV.js +4 -0
- package/dist/duckdb-context-FX23RUBV.js.map +1 -0
- package/dist/fixtures-CAWhzIHu.d.cts +27 -0
- package/dist/fixtures-CAWhzIHu.d.ts +27 -0
- package/dist/index.cjs +1152 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +301 -0
- package/dist/index.d.ts +301 -0
- package/dist/index.js +690 -0
- package/dist/index.js.map +1 -0
- package/dist/parity.cjs +411 -0
- package/dist/parity.cjs.map +1 -0
- package/dist/parity.d.cts +17 -0
- package/dist/parity.d.ts +17 -0
- package/dist/parity.js +45 -0
- package/dist/parity.js.map +1 -0
- package/dist/workspace-context-AIUYISUS.js +4 -0
- package/dist/workspace-context-AIUYISUS.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/fixtures.ts","../src/duckdb-context.ts","../src/golden.ts","../src/workspace-context.ts","../src/parity.ts"],"names":["columns","rows","waitForDatabricksStatement","DatabricksRestClient","describe","it","expect"],"mappings":"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","file":"parity.cjs","sourcesContent":["/**\n * Declarative, engine-agnostic table seeds. The same fixture applies to a\n * local DuckDB table or a scratch Unity Catalog schema — column DDL uses the\n * portable subset (VARCHAR/STRING, BIGINT, DOUBLE, TIMESTAMP, BOOLEAN).\n */\nexport interface TableFixture {\n table: string;\n /**\n * Column DDL, e.g. `subject_id STRING, value DOUBLE, \"at\" TIMESTAMP`.\n * Optional when the table already exists in the target context.\n */\n schema?: string;\n /** Row tuples in column order, or row objects keyed by column name. */\n rows?: readonly (readonly unknown[] | Record<string, unknown>)[];\n /** Path to an NDJSON file of row objects (one JSON object per line). */\n ndjsonFile?: string;\n}\n\nexport interface FixtureColumn {\n name: string;\n type: string;\n}\n\n/** Parse `name TYPE, name TYPE(args), \"quoted\" TYPE` column DDL into columns. */\nexport function parseFixtureColumns(schema: string): FixtureColumn[] {\n const columns: FixtureColumn[] = [];\n let depth = 0;\n let current = '';\n const parts: string[] = [];\n for (const ch of schema) {\n if (ch === '(') depth++;\n if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n parts.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n if (current.trim()) parts.push(current);\n for (const part of parts) {\n const trimmed = part.trim();\n const match = trimmed.match(/^(\"([^\"]+)\"|`([^`]+)`|(\\w+))\\s+(.+)$/s);\n if (!match) throw new Error(`Unparseable fixture column: '${trimmed}'`);\n columns.push({\n name: match[2] ?? match[3] ?? match[4] ?? '',\n type: (match[5] ?? '').trim(),\n });\n }\n if (columns.length === 0) throw new Error('Fixture schema declared no columns');\n return columns;\n}\n\n/** Resolve fixture rows (inline tuples/objects or NDJSON file) into tuples in `columns` order. */\nexport async function resolveFixtureRows(\n fixture: TableFixture,\n columns: readonly FixtureColumn[],\n): Promise<unknown[][]> {\n const raw: (readonly unknown[] | Record<string, unknown>)[] = [...(fixture.rows ?? [])];\n if (fixture.ndjsonFile) {\n const fs = await import('node:fs/promises');\n const text = await fs.readFile(fixture.ndjsonFile, 'utf8');\n for (const line of text.split('\\n')) {\n if (line.trim().length === 0) continue;\n raw.push(JSON.parse(line) as Record<string, unknown>);\n }\n }\n return raw.map((row) => {\n if (Array.isArray(row)) {\n if (row.length !== columns.length) {\n throw new Error(\n `Fixture row for ${fixture.table} has ${row.length} values, expected ${columns.length}`,\n );\n }\n return [...row];\n }\n const record = row as Record<string, unknown>;\n return columns.map((c) => (c.name in record ? record[c.name] : null));\n });\n}\n","import type { ExecutionContext } from './context.js';\nimport { type TableFixture, parseFixtureColumns, resolveFixtureRows } from './fixtures.js';\n\nexport interface DuckDbContextOptions {\n /** Database file path; ':memory:' (default) for a throwaway in-process db. */\n path?: string;\n /** Optional schema to create + qualify tables with. */\n schema?: string;\n /** Injectable for tests of this module itself. */\n connectionFactory?: (path: string) => Promise<DuckDbConnectionLike>;\n}\n\n/** Structural slice of the lazily-imported @duckdb/node-api connection. */\nexport interface DuckDbConnectionLike {\n run(sql: string, values?: unknown[]): Promise<unknown>;\n runAndReadAll(\n sql: string,\n values?: unknown[],\n ): Promise<{ getRowObjects(): Record<string, unknown>[] }>;\n closeSync(): void;\n}\n\n/**\n * Hermetic local execution context on DuckDB — the `local` profile of the\n * testing pyramid. No workspace, no credentials, sub-second.\n */\nexport async function createDuckDbContext(\n options: DuckDbContextOptions = {},\n): Promise<ExecutionContext> {\n const factory = options.connectionFactory ?? defaultConnectionFactory;\n const conn = await factory(options.path ?? ':memory:');\n const schema = options.schema;\n if (schema) await conn.run(`CREATE SCHEMA IF NOT EXISTS ${schema}`);\n const qual = (table: string) => (schema ? `${schema}.${table}` : table);\n\n return {\n profile: 'local',\n qual,\n async exec(sql, params) {\n await conn.run(sql, params ? [...params] : undefined);\n },\n async query(sql, params) {\n const reader = await conn.runAndReadAll(sql, params ? [...params] : undefined);\n return reader.getRowObjects().map(normalizeRow);\n },\n async loadFixture(fixture: TableFixture) {\n if (fixture.schema) {\n const columns = parseFixtureColumns(fixture.schema);\n const ddl = columns.map((c) => `\"${c.name}\" ${portableType(c.type)}`).join(', ');\n await conn.run(`CREATE TABLE IF NOT EXISTS ${qual(fixture.table)} (${ddl})`);\n const rows = await resolveFixtureRows(fixture, columns);\n for (const row of rows) {\n const casts = columns\n .map((c) => (isTimestamp(c.type) ? 'CAST(? AS TIMESTAMP)' : '?'))\n .join(', ');\n await conn.run(`INSERT INTO ${qual(fixture.table)} VALUES (${casts})`, row);\n }\n return;\n }\n // Table pre-exists: infer column order from the catalog.\n const described = await conn.runAndReadAll(`DESCRIBE ${qual(fixture.table)}`);\n const columns = described\n .getRowObjects()\n .map((r) => ({ name: String(r.column_name), type: String(r.column_type) }));\n const rows = await resolveFixtureRows(fixture, columns);\n for (const row of rows) {\n const casts = columns\n .map((c) => (isTimestamp(c.type) ? 'CAST(? AS TIMESTAMP)' : '?'))\n .join(', ');\n await conn.run(`INSERT INTO ${qual(fixture.table)} VALUES (${casts})`, row);\n }\n },\n async close() {\n conn.closeSync();\n },\n };\n}\n\n/** Databricks types → DuckDB types for the portable fixture subset. */\nfunction portableType(type: string): string {\n return type.replace(/\\bSTRING\\b/gi, 'VARCHAR');\n}\n\nfunction isTimestamp(type: string): boolean {\n return /TIMESTAMP/i.test(type);\n}\n\n/**\n * Normalize DuckDB values to plain JSON-ish values so assertions and golden\n * files are engine-portable: bigint→number, TIMESTAMP→`YYYY-MM-DD HH:MM:SS`\n * (UTC, microseconds trimmed), DECIMAL→number.\n */\nexport function normalizeRow(row: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(row)) {\n out[key] = normalizeValue(value);\n }\n return out;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (typeof value === 'bigint') {\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < BigInt(-Number.MAX_SAFE_INTEGER)) {\n return value.toString();\n }\n return Number(value);\n }\n if (value !== null && typeof value === 'object') {\n const v = value as { micros?: bigint; width?: number; scale?: number; value?: bigint };\n if (typeof v.micros === 'bigint') {\n // DuckDBTimestampValue — micros since epoch, UTC.\n const millis = Number(v.micros / 1000n);\n return new Date(millis)\n .toISOString()\n .replace('T', ' ')\n .replace(/\\.\\d+Z$/, '');\n }\n if (typeof v.scale === 'number' && typeof v.value === 'bigint') {\n // DuckDBDecimalValue.\n return Number(v.value) / 10 ** v.scale;\n }\n return String(value);\n }\n return value;\n}\n\nasync function defaultConnectionFactory(path: string): Promise<DuckDbConnectionLike> {\n const moduleName = '@duckdb/node-api';\n let mod: { DuckDBInstance: { create(path: string): Promise<{ connect(): Promise<unknown> }> } };\n try {\n mod = (await import(moduleName)) as typeof mod;\n } catch {\n throw new Error(\n 'createDuckDbContext requires the optional peer @duckdb/node-api — run: pnpm add -D @duckdb/node-api',\n );\n }\n const instance = await mod.DuckDBInstance.create(path);\n return (await instance.connect()) as DuckDbConnectionLike;\n}\n","/**\n * Golden-result files: committed JSON snapshots of query results that every\n * engine and every refactor must reproduce exactly — the frozen-vector\n * pattern from @fabricorg/experiments-testkit generalized to warehouse rows.\n */\nexport async function compareToGolden(\n goldenPath: string,\n actual: readonly Record<string, unknown>[],\n label: string,\n env: Record<string, string | undefined> = process.env,\n): Promise<void> {\n const fs = await import('node:fs/promises');\n const serialized = `${JSON.stringify(actual, null, 2)}\\n`;\n if (env.DBX_TEST_UPDATE_GOLDEN === '1') {\n const { dirname } = await import('node:path');\n await fs.mkdir(dirname(goldenPath), { recursive: true });\n await fs.writeFile(goldenPath, serialized, 'utf8');\n return;\n }\n let expected: string;\n try {\n expected = await fs.readFile(goldenPath, 'utf8');\n } catch {\n throw new Error(\n `Golden file ${goldenPath} does not exist for ${label}. Run once with DBX_TEST_UPDATE_GOLDEN=1 to create it, then commit it.`,\n );\n }\n if (normalize(expected) !== normalize(serialized)) {\n throw new Error(\n `${label} diverges from golden ${goldenPath}.\\nExpected:\\n${expected}\\nActual:\\n${serialized}\\nIf the change is intentional, re-run with DBX_TEST_UPDATE_GOLDEN=1 and commit the diff.`,\n );\n }\n}\n\nfunction normalize(json: string): string {\n return JSON.stringify(JSON.parse(json));\n}\n","import { DatabricksRestClient, waitForDatabricksStatement } from '@fabric-harness/databricks';\nimport type { ExecutionContext } from './context.js';\nimport { type TableFixture, parseFixtureColumns, resolveFixtureRows } from './fixtures.js';\n\n/** Structural slice of DatabricksRestClient the workspace context uses (injectable in tests). */\nexport interface WorkspaceClientLike {\n get<T>(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<T>;\n post<T>(\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n options?: unknown,\n ): Promise<T>;\n}\n\nexport interface WorkspaceContextOptions {\n env?: Record<string, string | undefined>;\n /** Schema within the catalog used by qual(); defaults to DBX_TEST_SCHEMA. */\n schema?: string;\n /** Injectable client for hermetic tests; defaults to a DatabricksRestClient from env auth. */\n client?: WorkspaceClientLike;\n /** Injectable fetch for the OAuth M2M exchange. */\n fetchImpl?: typeof fetch;\n pollIntervalMs?: number;\n timeoutMs?: number;\n /** Drop tables seeded by this context on close. Defaults to true. */\n cleanupFixtures?: boolean;\n /** Observe submitted statements for redacted failure evidence. */\n onStatement?: (statement: { sql: string; statementId?: string }) => void;\n}\n\ninterface StatementResponse {\n statement_id?: string;\n status?: { state?: string; error?: { message?: string } };\n manifest?: { schema?: { columns?: { name: string; type_name?: string; position?: number }[] } };\n result?: { data_array?: (string | null)[][] };\n}\n\n/**\n * Live execution context on a Databricks SQL warehouse via the SQL Statement\n * Execution API (/api/2.0/sql/statements). The Statement Execution API takes\n * NAMED parameter markers, so positional `?` params are rewritten to\n * `:p1..:pn` — the ExecutionContext surface stays identical to the local\n * profile.\n */\nexport async function createWorkspaceContext(\n options: WorkspaceContextOptions = {},\n): Promise<ExecutionContext> {\n const env = options.env ?? process.env;\n const warehouseId = resolveWarehouseId(env);\n const catalog = env.DBX_TEST_CATALOG;\n const schema = options.schema ?? env.DBX_TEST_SCHEMA;\n const client = options.client ?? createClientFromEnv(env, options.fetchImpl);\n const fixtureTables = new Set<string>();\n\n const qual = (table: string) =>\n [catalog, schema, table].filter((part): part is string => Boolean(part)).join('.');\n\n async function run(sql: string, params?: readonly unknown[]): Promise<StatementResponse> {\n const { statement, parameters } = toNamedParameters(sql, params ?? []);\n const submitted = await client.post<StatementResponse>('/api/2.0/sql/statements', {\n statement,\n warehouse_id: warehouseId,\n ...(catalog ? { catalog } : {}),\n ...(schema ? { schema } : {}),\n ...(parameters.length > 0 ? { parameters } : {}),\n wait_timeout: '30s',\n on_wait_timeout: 'CONTINUE',\n });\n options.onStatement?.({\n sql,\n ...(submitted.statement_id ? { statementId: submitted.statement_id } : {}),\n });\n const state = submitted.status?.state;\n let terminal = submitted;\n if (state !== 'SUCCEEDED' && state !== 'FAILED' && state !== 'CANCELED' && state !== 'CLOSED') {\n terminal = (await waitForDatabricksStatement(\n client as DatabricksRestClient,\n submitted.statement_id ?? '',\n { pollIntervalMs: options.pollIntervalMs, timeoutMs: options.timeoutMs },\n )) as StatementResponse;\n }\n if (terminal.status?.state !== 'SUCCEEDED') {\n throw new Error(\n `Databricks statement ${terminal.status?.state ?? 'UNKNOWN'}: ${\n terminal.status?.error?.message ?? sql.slice(0, 200)\n }`,\n );\n }\n return terminal;\n }\n\n return {\n profile: 'live',\n qual,\n async exec(sql, params) {\n await run(sql, params);\n },\n async query(sql, params) {\n const response = await run(sql, params);\n return parseStatementRows(response);\n },\n async loadFixture(fixture: TableFixture) {\n if (!schema) {\n throw new Error(\n 'Live fixtures require DBX_TEST_SCHEMA (or a schema option) so tests cannot replace unscoped tables',\n );\n }\n if (!fixture.schema) {\n throw new Error(\n `Live fixtures require explicit column DDL for ${fixture.table} (schema inference is local-only)`,\n );\n }\n const columns = parseFixtureColumns(fixture.schema);\n const ddl = columns.map((c) => `\\`${c.name}\\` ${c.type}`).join(', ');\n const target = qual(fixture.table);\n await run(`CREATE OR REPLACE TABLE ${target} (${ddl}) USING DELTA`);\n fixtureTables.add(target);\n const rows = await resolveFixtureRows(fixture, columns);\n for (const row of rows) {\n const placeholders = columns\n .map((c) => (/TIMESTAMP/i.test(c.type) ? 'CAST(? AS TIMESTAMP)' : '?'))\n .join(', ');\n await run(`INSERT INTO ${qual(fixture.table)} VALUES (${placeholders})`, row);\n }\n },\n async close() {\n if (options.cleanupFixtures !== false && env.DBX_TEST_KEEP_FIXTURES !== '1') {\n for (const table of [...fixtureTables].reverse()) {\n await run(`DROP TABLE IF EXISTS ${table}`);\n }\n }\n fixtureTables.clear();\n },\n };\n}\n\n/** Rewrite positional `?` markers to the named `:pN` markers the Statement Execution API requires. */\nexport function toNamedParameters(\n sql: string,\n params: readonly unknown[],\n): { statement: string; parameters: { name: string; value: string | null }[] } {\n let out = '';\n let index = 0;\n let quote: string | null = null;\n for (let i = 0; i < sql.length; i++) {\n const ch = sql[i] as string;\n if (quote) {\n out += ch;\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === \"'\" || ch === '\"' || ch === '`') {\n quote = ch;\n out += ch;\n continue;\n }\n if (ch === '?') {\n index += 1;\n out += `:p${index}`;\n continue;\n }\n out += ch;\n }\n if (index !== params.length) {\n throw new Error(`SQL has ${index} placeholders but ${params.length} params were provided`);\n }\n return {\n statement: out,\n parameters: params.map((value, i) => ({\n name: `p${i + 1}`,\n value: value === null || value === undefined ? null : String(value),\n })),\n };\n}\n\n/** Map a terminal statement response to normalized row objects. */\nexport function parseStatementRows(response: StatementResponse): Record<string, unknown>[] {\n const columns = [...(response.manifest?.schema?.columns ?? [])].sort(\n (a, b) => (a.position ?? 0) - (b.position ?? 0),\n );\n const data = response.result?.data_array ?? [];\n return data.map((tuple) => {\n const row: Record<string, unknown> = {};\n columns.forEach((column, i) => {\n row[column.name] = convertValue(tuple[i] ?? null, column.type_name ?? 'STRING');\n });\n return row;\n });\n}\n\nconst NUMERIC_TYPES = /^(INT|LONG|SHORT|BYTE|FLOAT|DOUBLE|DECIMAL)/i;\n\nfunction convertValue(value: string | null, typeName: string): unknown {\n if (value === null) return null;\n if (NUMERIC_TYPES.test(typeName)) return Number(value);\n if (/^BOOLEAN/i.test(typeName)) return value === 'true';\n return value;\n}\n\nfunction resolveWarehouseId(env: Record<string, string | undefined>): string {\n if (env.DATABRICKS_WAREHOUSE_ID) return env.DATABRICKS_WAREHOUSE_ID;\n const httpPath = env.DATABRICKS_HTTP_PATH;\n const match = httpPath?.match(/\\/warehouses\\/([\\w-]+)/);\n if (match?.[1]) return match[1];\n throw new Error(\n 'Live profile requires DATABRICKS_WAREHOUSE_ID or DATABRICKS_HTTP_PATH (/sql/1.0/warehouses/<id>)',\n );\n}\n\n/**\n * Auth precedence (ADR-0006): DATABRICKS_BEARER (pre-minted, CI) →\n * DATABRICKS_CLIENT_ID/SECRET (OAuth M2M) → DATABRICKS_TOKEN (PAT).\n */\nexport function createClientFromEnv(\n env: Record<string, string | undefined>,\n fetchImpl?: typeof fetch,\n): DatabricksRestClient {\n const host = env.DATABRICKS_HOST;\n if (!host) throw new Error('Live profile requires DATABRICKS_HOST');\n return new DatabricksRestClient({\n host,\n token: resolveTokenProvider(host, env, fetchImpl),\n ...(fetchImpl ? { fetchImpl } : {}),\n });\n}\n\nexport function resolveTokenProvider(\n host: string,\n env: Record<string, string | undefined>,\n fetchImpl: typeof fetch = fetch,\n): string | (() => Promise<string>) {\n if (env.DATABRICKS_BEARER) return env.DATABRICKS_BEARER;\n const clientId = env.DATABRICKS_CLIENT_ID;\n const clientSecret = env.DATABRICKS_CLIENT_SECRET;\n if (clientId && clientSecret) {\n let cached: { token: string; expiresAt: number } | null = null;\n return async () => {\n if (cached && Date.now() < cached.expiresAt) return cached.token;\n const response = await fetchImpl(`${host.replace(/\\/$/, '')}/oidc/v1/token`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/x-www-form-urlencoded',\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n scope: env.DATABRICKS_SCOPE ?? 'all-apis',\n }).toString(),\n });\n if (!response.ok) {\n throw new Error(`OAuth M2M token exchange failed: ${response.status}`);\n }\n const body = (await response.json()) as { access_token: string; expires_in?: number };\n cached = {\n token: body.access_token,\n expiresAt: Date.now() + ((body.expires_in ?? 3600) - 300) * 1000,\n };\n return body.access_token;\n };\n }\n if (env.DATABRICKS_TOKEN) return env.DATABRICKS_TOKEN;\n throw new Error(\n 'Live profile requires DATABRICKS_BEARER, DATABRICKS_CLIENT_ID/SECRET, or DATABRICKS_TOKEN',\n );\n}\n","/**\n * Cross-engine parity suites (vitest subpath — import from\n * '@fabricorg/databricks-testkit/parity').\n *\n * The same statement runs on DuckDB against committed fixtures and is\n * asserted against a golden file; when live credentials are present\n * (DBX_TEST_LIVE=1 + DBX_TEST_PROFILE may stay local), the statement ALSO\n * runs on a real Databricks SQL warehouse and both engines must reproduce\n * the same golden rows. This is how \"DuckDB in CI, Photon in prod\" stays\n * honest.\n */\nimport { describe, expect, it } from 'vitest';\nimport type { ExecutionContext } from './context.js';\nimport { createDuckDbContext } from './duckdb-context.js';\nimport type { TableFixture } from './fixtures.js';\nimport { compareToGolden } from './golden.js';\nimport { createWorkspaceContext } from './workspace-context.js';\n\nexport interface ParitySuiteSpec {\n name: string;\n /** Statement to execute (positional `?` params in both engines). */\n sql: string;\n params?: readonly unknown[];\n fixtures: readonly TableFixture[];\n /** Path to the committed golden JSON (created with DBX_TEST_UPDATE_GOLDEN=1). */\n golden: string;\n /** Scenario-scoped schema; defaults to no schema locally. */\n schema?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport function defineParitySuite(spec: ParitySuiteSpec): void {\n const env = spec.env ?? process.env;\n const liveEnabled = env.DBX_TEST_LIVE === '1';\n const liveTimeoutMs = Number(env.DBX_TEST_TIMEOUT_MS ?? 120_000);\n\n describe(`parity: ${spec.name}`, () => {\n it('DuckDB reproduces the golden rows', async () => {\n const ctx = await createDuckDbContext({ schema: spec.schema });\n try {\n await expectGolden(ctx, spec);\n } finally {\n await ctx.close();\n }\n });\n\n it.skipIf(!liveEnabled)(\n 'Databricks reproduces the golden rows',\n async () => {\n const ctx = await createWorkspaceContext({ env, schema: spec.schema });\n try {\n await expectGolden(ctx, spec);\n } finally {\n await ctx.close();\n }\n },\n liveTimeoutMs,\n );\n });\n}\n\nasync function expectGolden(ctx: ExecutionContext, spec: ParitySuiteSpec): Promise<void> {\n for (const fixture of spec.fixtures) {\n await ctx.loadFixture(fixture);\n }\n const rows = await ctx.query(spec.sql, spec.params);\n expect(rows.length).toBeGreaterThan(0);\n await compareToGolden(spec.golden, rows, `parity suite ${spec.name} (${ctx.profile})`);\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { T as TableFixture } from './fixtures-CAWhzIHu.cjs';
|
|
2
|
+
|
|
3
|
+
interface ParitySuiteSpec {
|
|
4
|
+
name: string;
|
|
5
|
+
/** Statement to execute (positional `?` params in both engines). */
|
|
6
|
+
sql: string;
|
|
7
|
+
params?: readonly unknown[];
|
|
8
|
+
fixtures: readonly TableFixture[];
|
|
9
|
+
/** Path to the committed golden JSON (created with DBX_TEST_UPDATE_GOLDEN=1). */
|
|
10
|
+
golden: string;
|
|
11
|
+
/** Scenario-scoped schema; defaults to no schema locally. */
|
|
12
|
+
schema?: string;
|
|
13
|
+
env?: Record<string, string | undefined>;
|
|
14
|
+
}
|
|
15
|
+
declare function defineParitySuite(spec: ParitySuiteSpec): void;
|
|
16
|
+
|
|
17
|
+
export { type ParitySuiteSpec, defineParitySuite };
|
package/dist/parity.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { T as TableFixture } from './fixtures-CAWhzIHu.js';
|
|
2
|
+
|
|
3
|
+
interface ParitySuiteSpec {
|
|
4
|
+
name: string;
|
|
5
|
+
/** Statement to execute (positional `?` params in both engines). */
|
|
6
|
+
sql: string;
|
|
7
|
+
params?: readonly unknown[];
|
|
8
|
+
fixtures: readonly TableFixture[];
|
|
9
|
+
/** Path to the committed golden JSON (created with DBX_TEST_UPDATE_GOLDEN=1). */
|
|
10
|
+
golden: string;
|
|
11
|
+
/** Scenario-scoped schema; defaults to no schema locally. */
|
|
12
|
+
schema?: string;
|
|
13
|
+
env?: Record<string, string | undefined>;
|
|
14
|
+
}
|
|
15
|
+
declare function defineParitySuite(spec: ParitySuiteSpec): void;
|
|
16
|
+
|
|
17
|
+
export { type ParitySuiteSpec, defineParitySuite };
|
package/dist/parity.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { compareToGolden } from './chunk-MLBZCHRM.js';
|
|
2
|
+
import { createDuckDbContext } from './chunk-7JVDOSBO.js';
|
|
3
|
+
import { createWorkspaceContext } from './chunk-FBADA7LQ.js';
|
|
4
|
+
import './chunk-F3KU6VZS.js';
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
|
|
7
|
+
function defineParitySuite(spec) {
|
|
8
|
+
const env = spec.env ?? process.env;
|
|
9
|
+
const liveEnabled = env.DBX_TEST_LIVE === "1";
|
|
10
|
+
const liveTimeoutMs = Number(env.DBX_TEST_TIMEOUT_MS ?? 12e4);
|
|
11
|
+
describe(`parity: ${spec.name}`, () => {
|
|
12
|
+
it("DuckDB reproduces the golden rows", async () => {
|
|
13
|
+
const ctx = await createDuckDbContext({ schema: spec.schema });
|
|
14
|
+
try {
|
|
15
|
+
await expectGolden(ctx, spec);
|
|
16
|
+
} finally {
|
|
17
|
+
await ctx.close();
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
it.skipIf(!liveEnabled)(
|
|
21
|
+
"Databricks reproduces the golden rows",
|
|
22
|
+
async () => {
|
|
23
|
+
const ctx = await createWorkspaceContext({ env, schema: spec.schema });
|
|
24
|
+
try {
|
|
25
|
+
await expectGolden(ctx, spec);
|
|
26
|
+
} finally {
|
|
27
|
+
await ctx.close();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
liveTimeoutMs
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async function expectGolden(ctx, spec) {
|
|
35
|
+
for (const fixture of spec.fixtures) {
|
|
36
|
+
await ctx.loadFixture(fixture);
|
|
37
|
+
}
|
|
38
|
+
const rows = await ctx.query(spec.sql, spec.params);
|
|
39
|
+
expect(rows.length).toBeGreaterThan(0);
|
|
40
|
+
await compareToGolden(spec.golden, rows, `parity suite ${spec.name} (${ctx.profile})`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { defineParitySuite };
|
|
44
|
+
//# sourceMappingURL=parity.js.map
|
|
45
|
+
//# sourceMappingURL=parity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/parity.ts"],"names":[],"mappings":";;;;;;AA+BO,SAAS,kBAAkB,IAAA,EAA6B;AAC7D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,OAAA,CAAQ,GAAA;AAChC,EAAA,MAAM,WAAA,GAAc,IAAI,aAAA,KAAkB,GAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,GAAA,CAAI,mBAAA,IAAuB,IAAO,CAAA;AAE/D,EAAA,QAAA,CAAS,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,MAAM;AACrC,IAAA,EAAA,CAAG,qCAAqC,YAAY;AAClD,MAAA,MAAM,MAAM,MAAM,mBAAA,CAAoB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,MAC9B,CAAA,SAAE;AACA,QAAA,MAAM,IAAI,KAAA,EAAM;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,EAAA,CAAG,MAAA,CAAO,CAAC,WAAW,CAAA;AAAA,MACpB,uCAAA;AAAA,MACA,YAAY;AACV,QAAA,MAAM,GAAA,GAAM,MAAM,sBAAA,CAAuB,EAAE,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AACrE,QAAA,IAAI;AACF,UAAA,MAAM,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,QAC9B,CAAA,SAAE;AACA,UAAA,MAAM,IAAI,KAAA,EAAM;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,eAAe,YAAA,CAAa,KAAuB,IAAA,EAAsC;AACvF,EAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,IAAA,MAAM,GAAA,CAAI,YAAY,OAAO,CAAA;AAAA,EAC/B;AACA,EAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAM,IAAA,CAAK,GAAA,EAAK,KAAK,MAAM,CAAA;AAClD,EAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,eAAA,CAAgB,CAAC,CAAA;AACrC,EAAA,MAAM,eAAA,CAAgB,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,CAAA,aAAA,EAAgB,KAAK,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AACvF","file":"parity.js","sourcesContent":["/**\n * Cross-engine parity suites (vitest subpath — import from\n * '@fabricorg/databricks-testkit/parity').\n *\n * The same statement runs on DuckDB against committed fixtures and is\n * asserted against a golden file; when live credentials are present\n * (DBX_TEST_LIVE=1 + DBX_TEST_PROFILE may stay local), the statement ALSO\n * runs on a real Databricks SQL warehouse and both engines must reproduce\n * the same golden rows. This is how \"DuckDB in CI, Photon in prod\" stays\n * honest.\n */\nimport { describe, expect, it } from 'vitest';\nimport type { ExecutionContext } from './context.js';\nimport { createDuckDbContext } from './duckdb-context.js';\nimport type { TableFixture } from './fixtures.js';\nimport { compareToGolden } from './golden.js';\nimport { createWorkspaceContext } from './workspace-context.js';\n\nexport interface ParitySuiteSpec {\n name: string;\n /** Statement to execute (positional `?` params in both engines). */\n sql: string;\n params?: readonly unknown[];\n fixtures: readonly TableFixture[];\n /** Path to the committed golden JSON (created with DBX_TEST_UPDATE_GOLDEN=1). */\n golden: string;\n /** Scenario-scoped schema; defaults to no schema locally. */\n schema?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport function defineParitySuite(spec: ParitySuiteSpec): void {\n const env = spec.env ?? process.env;\n const liveEnabled = env.DBX_TEST_LIVE === '1';\n const liveTimeoutMs = Number(env.DBX_TEST_TIMEOUT_MS ?? 120_000);\n\n describe(`parity: ${spec.name}`, () => {\n it('DuckDB reproduces the golden rows', async () => {\n const ctx = await createDuckDbContext({ schema: spec.schema });\n try {\n await expectGolden(ctx, spec);\n } finally {\n await ctx.close();\n }\n });\n\n it.skipIf(!liveEnabled)(\n 'Databricks reproduces the golden rows',\n async () => {\n const ctx = await createWorkspaceContext({ env, schema: spec.schema });\n try {\n await expectGolden(ctx, spec);\n } finally {\n await ctx.close();\n }\n },\n liveTimeoutMs,\n );\n });\n}\n\nasync function expectGolden(ctx: ExecutionContext, spec: ParitySuiteSpec): Promise<void> {\n for (const fixture of spec.fixtures) {\n await ctx.loadFixture(fixture);\n }\n const rows = await ctx.query(spec.sql, spec.params);\n expect(rows.length).toBeGreaterThan(0);\n await compareToGolden(spec.golden, rows, `parity suite ${spec.name} (${ctx.profile})`);\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createClientFromEnv, createWorkspaceContext, parseStatementRows, resolveTokenProvider, toNamedParameters } from './chunk-FBADA7LQ.js';
|
|
2
|
+
import './chunk-F3KU6VZS.js';
|
|
3
|
+
//# sourceMappingURL=workspace-context-AIUYISUS.js.map
|
|
4
|
+
//# sourceMappingURL=workspace-context-AIUYISUS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"workspace-context-AIUYISUS.js"}
|
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fabricorg/databricks-testkit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Testing toolkit for Databricks artifacts — DuckDB/local + live workspace execution contexts, fixtures, golden results, and cross-engine parity suites.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.cjs",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"require": {
|
|
18
|
+
"types": "./dist/index.d.cts",
|
|
19
|
+
"default": "./dist/index.cjs"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"./parity": {
|
|
23
|
+
"import": {
|
|
24
|
+
"types": "./dist/parity.d.ts",
|
|
25
|
+
"default": "./dist/parity.js"
|
|
26
|
+
},
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./dist/parity.d.cts",
|
|
29
|
+
"default": "./dist/parity.cjs"
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@fabric-harness/databricks": "^1.2.3",
|
|
38
|
+
"@fabricorg/experiments-db-pool": "0.1.1"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@duckdb/node-api": ">=1.4.0",
|
|
42
|
+
"vitest": ">=2"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"@duckdb/node-api": {
|
|
46
|
+
"optional": true
|
|
47
|
+
},
|
|
48
|
+
"vitest": {
|
|
49
|
+
"optional": true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@duckdb/node-api": "1.5.4-r.1",
|
|
54
|
+
"@types/node": "^22.15.3",
|
|
55
|
+
"tsup": "^8.3.5",
|
|
56
|
+
"typescript": "^5.8.3",
|
|
57
|
+
"vitest": "^2.1.8",
|
|
58
|
+
"@fabricorg/experiments-warehouse": "0.0.1"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsup",
|
|
62
|
+
"type-check": "tsc --noEmit",
|
|
63
|
+
"test": "vitest run",
|
|
64
|
+
"clean": "rm -rf dist"
|
|
65
|
+
}
|
|
66
|
+
}
|