@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/workspace-context.ts","../src/context.ts","../src/index.ts","../src/golden.ts","../src/assert.ts","../src/mock-client.ts","../src/live-suite.ts","../src/pollers.ts","../src/live-checks.ts","../src/lakebase-checks.ts","../src/databricks-http.ts","../src/platform-checks.ts","../src/volume-checks.ts","../src/autoloader-checks.ts"],"names":["columns","rows","waitForDatabricksStatement","DatabricksRestClient","createDuckDbContext","createWorkspaceContext","dirname","required","path","mkdir","writeFile","resolve","waitForDatabricksRun","LakebaseDatabaseProvider","exchangeLakebaseCredential","randomUUID","readFile","basename"],"mappings":"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","file":"index.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","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","import type { TableFixture } from './fixtures.js';\n\nexport type TestProfile = 'local' | 'live';\n\n/**\n * One SQL surface, two engines (ADR-0006). `local` executes on DuckDB\n * in-process; `live` executes on a Databricks SQL warehouse via the SQL\n * Statement Execution API. Params are positional `?` in both profiles — the\n * workspace context transparently rewrites them to the named markers the\n * Statement Execution API requires.\n */\nexport interface ExecutionContext {\n readonly profile: TestProfile;\n /** Execute a statement, discarding any result. */\n exec(sql: string, params?: readonly unknown[]): Promise<void>;\n /** Execute a query and return normalized row objects (bigint→number, timestamps→ISO). */\n query(sql: string, params?: readonly unknown[]): Promise<Record<string, unknown>[]>;\n /** Create + seed a table from a declarative fixture. */\n loadFixture(fixture: TableFixture): Promise<void>;\n /** Qualify a bare table name for this context (schema/catalog scoping). */\n qual(table: string): string;\n close(): Promise<void>;\n}\n\nexport function resolveProfile(env: Record<string, string | undefined> = process.env): TestProfile {\n const profile = env.DBX_TEST_PROFILE ?? 'local';\n if (profile !== 'local' && profile !== 'live') {\n throw new Error(`DBX_TEST_PROFILE must be 'local' or 'live', got '${profile}'`);\n }\n if (profile === 'live' && env.DBX_TEST_LIVE !== '1') {\n throw new Error(\n 'DBX_TEST_PROFILE=live requires DBX_TEST_LIVE=1 (live suites are always gated)',\n );\n }\n return profile;\n}\n\nexport interface CreateContextOptions {\n profile?: TestProfile;\n env?: Record<string, string | undefined>;\n /** local profile: schema to create + qualify tables with. live profile: schema within the catalog. */\n schema?: string;\n /** Live profile only: observe each submitted SQL statement. */\n onStatement?: (statement: { sql: string; statementId?: string }) => void;\n}\n\n/** Profile-dispatched factory. Lazy-imports each engine so the unused one stays out of the bundle. */\nexport async function createExecutionContext(\n options: CreateContextOptions = {},\n): Promise<ExecutionContext> {\n const env = options.env ?? process.env;\n const profile = options.profile ?? resolveProfile(env);\n if (profile === 'local') {\n const { createDuckDbContext } = await import('./duckdb-context.js');\n return createDuckDbContext({ schema: options.schema });\n }\n const { createWorkspaceContext } = await import('./workspace-context.js');\n return createWorkspaceContext({\n env,\n schema: options.schema,\n ...(options.onStatement ? { onStatement: options.onStatement } : {}),\n });\n}\n","export type { ExecutionContext, TestProfile, CreateContextOptions } from './context.js';\nexport { createExecutionContext, resolveProfile } from './context.js';\nexport type { TableFixture, FixtureColumn } from './fixtures.js';\nexport { parseFixtureColumns, resolveFixtureRows } from './fixtures.js';\nexport type { DuckDbContextOptions, DuckDbConnectionLike } from './duckdb-context.js';\nexport { createDuckDbContext, normalizeRow } from './duckdb-context.js';\nexport type { WorkspaceContextOptions, WorkspaceClientLike } from './workspace-context.js';\nexport {\n createWorkspaceContext,\n createClientFromEnv,\n resolveTokenProvider,\n toNamedParameters,\n parseStatementRows,\n} from './workspace-context.js';\nexport { expectTable, expectQueryToMatchGolden } from './assert.js';\nexport { compareToGolden } from './golden.js';\nexport type { MockDatabricksClient, RecordedCall } from './mock-client.js';\nexport { createMockDatabricksClient } from './mock-client.js';\nexport type {\n LiveCheck,\n LiveCheckContext,\n LiveCheckResult,\n LiveCheckStatus,\n LiveEvidence,\n LiveSuiteRuntime,\n LiveSuiteSpec,\n DefinedLiveSuite,\n} from './live-suite.js';\nexport { defineLiveSuite, runLiveSuite, renderJUnit } from './live-suite.js';\nexport type { DeltaColumnContract } from './live-checks.js';\nexport {\n sqlRoundTripCheck,\n assertDeltaContract,\n deltaContractCheck,\n unityCatalogAccessCheck,\n jobRunCheck,\n notebookSubmitCheck,\n dbtBuildCheck,\n pipelineRefreshCheck,\n customLiveCheck,\n} from './live-checks.js';\nexport type { LakebaseCheckOptions } from './lakebase-checks.js';\nexport {\n createLakebaseTestProvider,\n lakebaseCredentialCheck,\n lakebaseRoundTripCheck,\n} from './lakebase-checks.js';\nexport type { AppHealthCheckOptions } from './platform-checks.js';\nexport { secretScopeCheck, appHealthCheck } from './platform-checks.js';\nexport type { VolumeIOCheckOptions } from './volume-checks.js';\nexport {\n deleteVolumeFile,\n ensureVolumeDirectory,\n normalizeVolumeRoot,\n uploadVolumeFile,\n volumeIOCheck,\n} from './volume-checks.js';\nexport type { AutoLoaderCheckOptions } from './autoloader-checks.js';\nexport { autoLoaderIngestionCheck } from './autoloader-checks.js';\nexport type { PollOptions } from './pollers.js';\nexport { waitForPipelineUpdate } from './pollers.js';\nexport {\n waitForDatabricksRun,\n waitForDatabricksStatement,\n} from '@fabric-harness/databricks';\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 type { ExecutionContext } from './context.js';\nimport { compareToGolden } from './golden.js';\n\n/**\n * Framework-free table assertions — they throw plain Errors so they work\n * under vitest, cucumber-js steps, or the live check runner alike.\n */\nexport function expectTable(ctx: ExecutionContext, table: string) {\n const target = ctx.qual(table);\n return {\n async toHaveRowCount(expected: number): Promise<void> {\n const rows = await ctx.query(`SELECT COUNT(*) AS n FROM ${target}`);\n const actual = Number(rows[0]?.n ?? Number.NaN);\n if (actual !== expected) {\n throw new Error(`Expected ${target} to have ${expected} rows, found ${actual}`);\n }\n },\n\n /** Every partial row must match at least one table row on its own keys. */\n async toContainRows(partials: readonly Record<string, unknown>[]): Promise<void> {\n const rows = await ctx.query(`SELECT * FROM ${target}`);\n for (const partial of partials) {\n const hit = rows.some((row) =>\n Object.entries(partial).every(([key, value]) => looselyEqual(row[key], value)),\n );\n if (!hit) {\n throw new Error(\n `Expected ${target} to contain a row matching ${JSON.stringify(partial)}; ` +\n `have ${rows.length} rows: ${JSON.stringify(rows.slice(0, 5))}${rows.length > 5 ? ' …' : ''}`,\n );\n }\n }\n },\n\n /**\n * Compare `SELECT * ORDER BY <orderBy>` against a committed golden JSON\n * file. Set DBX_TEST_UPDATE_GOLDEN=1 to (re)write the golden instead —\n * a reviewable, versioned event.\n */\n async toMatchGolden(goldenPath: string, options: { orderBy?: string } = {}): Promise<void> {\n const orderBy = options.orderBy ? ` ORDER BY ${options.orderBy}` : '';\n const rows = await ctx.query(`SELECT * FROM ${target}${orderBy}`);\n await compareToGolden(goldenPath, rows, `table ${target}`);\n },\n };\n}\n\n/** Compare query results (not a whole table) against a golden file. */\nexport async function expectQueryToMatchGolden(\n ctx: ExecutionContext,\n sql: string,\n params: readonly unknown[],\n goldenPath: string,\n): Promise<void> {\n const rows = await ctx.query(sql, params);\n await compareToGolden(goldenPath, rows, 'query');\n}\n\nfunction looselyEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a === 'number' && typeof b === 'number') return Math.abs(a - b) < 1e-9;\n // Timestamps normalize to 'YYYY-MM-DD HH:MM:SS'; allow ISO-style expectations.\n if (typeof a === 'string' && typeof b === 'string') {\n return (\n a.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '') ===\n b.replace('T', ' ').replace(/(\\.\\d+)?Z?$/, '')\n );\n }\n return false;\n}\n","/**\n * Framework-free fake of the Databricks REST client surface, for unit tests\n * of orchestration logic (submit → poll → terminal). Queue responses per\n * (method, path-prefix); every call is recorded for assertions. Works under\n * vitest without vi.fn so it is equally usable from cucumber-js worlds.\n */\nexport interface RecordedCall {\n method: 'GET' | 'POST';\n path: string;\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined>;\n}\n\nexport interface MockDatabricksClient {\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 /** Queue the next response for calls whose path starts with `pathPrefix`. FIFO per prefix. */\n queue(method: 'GET' | 'POST', pathPrefix: string, response: unknown): MockDatabricksClient;\n /** Queue an error for the next matching call. */\n queueError(method: 'GET' | 'POST', pathPrefix: string, error: Error): MockDatabricksClient;\n readonly calls: readonly RecordedCall[];\n callsTo(method: 'GET' | 'POST', pathPrefix: string): RecordedCall[];\n}\n\ntype Queued = { pathPrefix: string; response?: unknown; error?: Error };\n\nexport function createMockDatabricksClient(): MockDatabricksClient {\n const queues: Record<'GET' | 'POST', Queued[]> = { GET: [], POST: [] };\n const calls: RecordedCall[] = [];\n\n function take(method: 'GET' | 'POST', path: string): Queued {\n const index = queues[method].findIndex((q) => path.startsWith(q.pathPrefix));\n if (index === -1) {\n throw new Error(\n `MockDatabricksClient: no queued ${method} response for ${path}. ` +\n `Queued prefixes: ${queues[method].map((q) => q.pathPrefix).join(', ') || '(none)'}`,\n );\n }\n return queues[method].splice(index, 1)[0] as Queued;\n }\n\n const client: MockDatabricksClient = {\n async get<T>(path: string, query?: Record<string, string | number | boolean | undefined>) {\n calls.push({ method: 'GET', path, query });\n const queued = take('GET', path);\n if (queued.error) throw queued.error;\n return queued.response as T;\n },\n async post<T>(\n path: string,\n body?: unknown,\n query?: Record<string, string | number | boolean | undefined>,\n ) {\n calls.push({ method: 'POST', path, body, query });\n const queued = take('POST', path);\n if (queued.error) throw queued.error;\n return queued.response as T;\n },\n queue(method, pathPrefix, response) {\n queues[method].push({ pathPrefix, response });\n return client;\n },\n queueError(method, pathPrefix, error) {\n queues[method].push({ pathPrefix, error });\n return client;\n },\n calls,\n callsTo(method, pathPrefix) {\n return calls.filter((c) => c.method === method && c.path.startsWith(pathPrefix));\n },\n };\n return client;\n}\n","import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname } from 'node:path';\nimport type { ExecutionContext } from './context.js';\nimport {\n type WorkspaceClientLike,\n createClientFromEnv,\n createWorkspaceContext,\n} from './workspace-context.js';\n\nexport type LiveCheckStatus = 'pass' | 'fail' | 'not-configured';\n\nexport interface LiveCheckContext {\n env: Record<string, string | undefined>;\n warehouse: ExecutionContext;\n client: WorkspaceClientLike;\n}\n\nexport interface LiveCheck {\n id: string;\n description: string;\n configured?: (env: Record<string, string | undefined>) => boolean;\n run(context: LiveCheckContext): Promise<unknown>;\n}\n\nexport interface LiveCheckResult {\n id: string;\n description: string;\n status: LiveCheckStatus;\n durationMs: number;\n details?: unknown;\n error?: string;\n}\n\nexport interface LiveEvidence {\n schemaVersion: 1;\n kind: 'databricks-live-suite';\n startedAt: string;\n finishedAt: string;\n success: boolean;\n required: string[];\n results: LiveCheckResult[];\n}\n\nexport interface LiveSuiteSpec {\n checks: readonly LiveCheck[];\n required?: readonly string[];\n evidencePath?: string;\n junitPath?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport interface LiveSuiteRuntime {\n warehouse?: ExecutionContext;\n client?: WorkspaceClientLike;\n}\n\nexport interface DefinedLiveSuite {\n run(runtime?: LiveSuiteRuntime): Promise<LiveEvidence | undefined>;\n}\n\n/**\n * Define an explicitly gated live suite. Without DBX_TEST_LIVE=1, run() is a\n * silent no-op so the same command is safe in ordinary CI matrices.\n */\nexport function defineLiveSuite(spec: LiveSuiteSpec): DefinedLiveSuite {\n return { run: (runtime) => runLiveSuite(spec, runtime) };\n}\n\nexport async function runLiveSuite(\n spec: LiveSuiteSpec,\n runtime: LiveSuiteRuntime = {},\n): Promise<LiveEvidence | undefined> {\n const env = spec.env ?? process.env;\n if (env.DBX_TEST_LIVE !== '1') return undefined;\n\n const required = [...(spec.required ?? [])];\n const known = new Set(spec.checks.map((check) => check.id));\n for (const id of required) {\n if (!known.has(id)) throw new Error(`Required live check '${id}' is not defined`);\n }\n\n const startedAt = new Date().toISOString();\n const ownedWarehouse = runtime.warehouse === undefined;\n const client = runtime.client ?? createClientFromEnv(env);\n const warehouse = runtime.warehouse ?? (await createWorkspaceContext({ env, client }));\n const results: LiveCheckResult[] = [];\n\n try {\n for (const check of spec.checks) {\n if (check.configured && !check.configured(env)) {\n results.push({\n id: check.id,\n description: check.description,\n status: 'not-configured',\n durationMs: 0,\n });\n continue;\n }\n const before = performance.now();\n try {\n const details = await check.run({ env, warehouse, client });\n results.push({\n id: check.id,\n description: check.description,\n status: 'pass',\n durationMs: Math.round(performance.now() - before),\n ...(details === undefined ? {} : { details: redactValue(details, env) }),\n });\n } catch (error) {\n results.push({\n id: check.id,\n description: check.description,\n status: 'fail',\n durationMs: Math.round(performance.now() - before),\n error: redactText(error instanceof Error ? error.message : String(error), env),\n });\n }\n }\n } finally {\n if (ownedWarehouse) await warehouse.close();\n }\n\n const success = required.every(\n (id) => results.find((result) => result.id === id)?.status === 'pass',\n );\n const evidence: LiveEvidence = {\n schemaVersion: 1,\n kind: 'databricks-live-suite',\n startedAt,\n finishedAt: new Date().toISOString(),\n success,\n required,\n results,\n };\n\n if (spec.evidencePath)\n await writeReport(spec.evidencePath, `${JSON.stringify(evidence, null, 2)}\\n`);\n if (spec.junitPath) await writeReport(spec.junitPath, renderJUnit(evidence));\n return evidence;\n}\n\nasync function writeReport(path: string, contents: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, contents, 'utf8');\n}\n\nfunction redactText(text: string, env: Record<string, string | undefined>): string {\n let output = text;\n for (const [name, value] of Object.entries(env)) {\n if (!value || value.length < 6 || !/(TOKEN|SECRET|PASSWORD|BEARER|KEY)/i.test(name)) continue;\n output = output.split(value).join('[REDACTED]');\n }\n return output;\n}\n\nfunction redactValue(value: unknown, env: Record<string, string | undefined>): unknown {\n return JSON.parse(redactText(JSON.stringify(value), env)) as unknown;\n}\n\nfunction xml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''');\n}\n\nexport function renderJUnit(evidence: LiveEvidence): string {\n const failures = evidence.results.filter((result) => result.status === 'fail').length;\n const skipped = evidence.results.filter((result) => result.status === 'not-configured').length;\n const seconds = evidence.results.reduce((sum, result) => sum + result.durationMs, 0) / 1000;\n const cases = evidence.results\n .map((result) => {\n const body =\n result.status === 'fail'\n ? `<failure message=\"${xml(result.error ?? 'check failed')}\"/>`\n : result.status === 'not-configured'\n ? '<skipped message=\"not configured\"/>'\n : '';\n return ` <testcase classname=\"databricks-live\" name=\"${xml(result.id)}\" time=\"${result.durationMs / 1000}\">${body}</testcase>`;\n })\n .join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<testsuite name=\"databricks-live\" tests=\"${evidence.results.length}\" failures=\"${failures}\" skipped=\"${skipped}\" time=\"${seconds}\">\\n${cases}\\n</testsuite>\\n`;\n}\n","import type { WorkspaceClientLike } from './workspace-context.js';\n\nexport interface PollOptions {\n pollIntervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nconst TERMINAL_PIPELINE_STATES = new Set(['COMPLETED', 'FAILED', 'CANCELED']);\n\nexport async function waitForPipelineUpdate(\n client: WorkspaceClientLike,\n pipelineId: string,\n updateId: string,\n options: PollOptions = {},\n): Promise<Record<string, unknown>> {\n const deadline = Date.now() + (options.timeoutMs ?? 900_000);\n const interval = options.pollIntervalMs ?? 10_000;\n const path = `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates/${encodeURIComponent(updateId)}`;\n let update: { update?: { state?: string } } = await client.get(path);\n while (!TERMINAL_PIPELINE_STATES.has(update.update?.state ?? '') && Date.now() < deadline) {\n if (options.signal?.aborted) throw new Error(`Pipeline update ${updateId} was aborted`);\n await abortableDelay(interval, options.signal);\n update = await client.get(path);\n }\n const state = update.update?.state ?? 'UNKNOWN';\n if (state !== 'COMPLETED') {\n throw new Error(`Pipeline update ${updateId} ended in ${state} (wanted COMPLETED)`);\n }\n return update as Record<string, unknown>;\n}\n\nfunction abortableDelay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Polling aborted'));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n 'abort',\n () => {\n clearTimeout(timer);\n reject(new Error('Polling aborted'));\n },\n { once: true },\n );\n });\n}\n","import { waitForDatabricksRun } from '@fabric-harness/databricks';\nimport type { LiveCheck } from './live-suite.js';\nimport { waitForPipelineUpdate } from './pollers.js';\n\nexport function sqlRoundTripCheck(): LiveCheck {\n return {\n id: 'sql',\n description: 'SQL Statement Execution round-trip',\n async run({ warehouse }) {\n const rows = await warehouse.query('SELECT 1 AS dbx_test_ok');\n if (Number(rows[0]?.dbx_test_ok) !== 1)\n throw new Error('SQL round-trip returned an unexpected value');\n return { rows: rows.length };\n },\n };\n}\n\nexport interface DeltaColumnContract {\n name: string;\n type?: string;\n}\n\nexport function assertDeltaContract(\n table: string,\n rows: readonly Record<string, unknown>[],\n columns: readonly DeltaColumnContract[],\n): void {\n for (const expected of columns) {\n const actual = rows.find((row) => String(row.col_name ?? row.column_name) === expected.name);\n if (!actual) throw new Error(`Delta contract missing column '${expected.name}' in ${table}`);\n const actualType = String(actual.data_type ?? actual.column_type ?? '').toLowerCase();\n if (expected.type && actualType !== expected.type.toLowerCase()) {\n throw new Error(\n `Delta column ${expected.name} has type ${actualType}, expected ${expected.type}`,\n );\n }\n }\n}\n\nexport function deltaContractCheck(\n tableEnv = 'DBX_TEST_DELTA_TABLE',\n columns: readonly DeltaColumnContract[] = [],\n): LiveCheck {\n return {\n id: 'delta-contract',\n description: 'Delta table schema contract',\n configured: (env) => Boolean(env[tableEnv]),\n async run({ env, warehouse }) {\n const table = env[tableEnv] as string;\n const rows = await warehouse.query(`DESCRIBE TABLE ${table}`);\n assertDeltaContract(table, rows, columns);\n return { table, columns: rows.length };\n },\n };\n}\n\nexport function unityCatalogAccessCheck(): LiveCheck {\n return {\n id: 'uc-grants',\n description: 'Unity Catalog allow/deny access assertions',\n configured: (env) => Boolean(env.DBX_TEST_UC_ALLOWED_TABLE && env.DBX_TEST_UC_DENIED_TABLE),\n async run({ env, warehouse }) {\n await warehouse.query(`SELECT * FROM ${env.DBX_TEST_UC_ALLOWED_TABLE} LIMIT 1`);\n try {\n await warehouse.query(`SELECT * FROM ${env.DBX_TEST_UC_DENIED_TABLE} LIMIT 1`);\n } catch (error) {\n if (/permission.?denied|insufficient.?priv|403|unauthoriz/i.test(String(error))) {\n return { allowed: env.DBX_TEST_UC_ALLOWED_TABLE, denied: env.DBX_TEST_UC_DENIED_TABLE };\n }\n throw error;\n }\n throw new Error(`Expected access to ${env.DBX_TEST_UC_DENIED_TABLE} to be denied`);\n },\n };\n}\n\nexport function jobRunCheck(): LiveCheck {\n return {\n id: 'jobs',\n description: 'Databricks Job run-now reaches SUCCESS',\n configured: (env) => Boolean(env.DBX_TEST_JOB_ID),\n async run({ env, client }) {\n const jobId = Number(env.DBX_TEST_JOB_ID);\n if (!Number.isFinite(jobId)) throw new Error('DBX_TEST_JOB_ID must be numeric');\n const submitted = await client.post<{ run_id: number }>('/api/2.1/jobs/run-now', {\n job_id: jobId,\n });\n const run = await waitForDatabricksRun(client as never, submitted.run_id, {\n timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n const result = (run as { state?: { result_state?: string } }).state?.result_state;\n if (result !== 'SUCCESS') throw new Error(`Job ${jobId} ended in ${result ?? 'UNKNOWN'}`);\n return { jobId, runId: submitted.run_id };\n },\n };\n}\n\n/** Trigger the deployed Lakeflow pipeline and require a completed update. */\nexport function pipelineRefreshCheck(): LiveCheck {\n return {\n id: 'pipeline',\n description: 'Lakeflow telemetry pipeline refresh reaches COMPLETED',\n configured: (env) => Boolean(env.DBX_TEST_PIPELINE_ID),\n async run({ env, client }) {\n const pipelineId = env.DBX_TEST_PIPELINE_ID as string;\n const submitted = await client.post<{ update_id?: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: false },\n );\n if (!submitted.update_id) {\n throw new Error(`Pipeline ${pipelineId} did not return an update_id`);\n }\n await waitForPipelineUpdate(client, pipelineId, submitted.update_id, {\n timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n return { pipelineId, updateId: submitted.update_id };\n },\n };\n}\n\nexport function notebookSubmitCheck(): LiveCheck {\n return {\n id: 'notebook',\n description: 'Databricks notebook submit run reaches SUCCESS',\n configured: (env) => Boolean(env.DBX_TEST_NOTEBOOK_PATH && env.DBX_TEST_CLUSTER_ID),\n async run({ env, client }) {\n if (!env.DBX_TEST_NOTEBOOK_PATH || !env.DBX_TEST_CLUSTER_ID) {\n throw new Error('Notebook submit requires DBX_TEST_NOTEBOOK_PATH and DBX_TEST_CLUSTER_ID');\n }\n const submitted = await client.post<{ run_id?: number }>('/api/2.1/jobs/runs/submit', {\n run_name: `fabric-experiments-notebook-${Date.now()}`,\n tasks: [\n {\n task_key: 'notebook',\n existing_cluster_id: env.DBX_TEST_CLUSTER_ID,\n notebook_task: { notebook_path: env.DBX_TEST_NOTEBOOK_PATH },\n },\n ],\n });\n if (!submitted.run_id) throw new Error('Notebook submit returned no run_id');\n const run = await waitForDatabricksRun(client as never, submitted.run_id, {\n timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n const result = (run as { state?: { result_state?: string } }).state?.result_state;\n if (result !== 'SUCCESS') throw new Error(`Notebook run ended in ${result ?? 'UNKNOWN'}`);\n return { runId: submitted.run_id, notebookPath: env.DBX_TEST_NOTEBOOK_PATH };\n },\n };\n}\n\nexport function dbtBuildCheck(): LiveCheck {\n return {\n id: 'dbt',\n description: 'Databricks dbt task reaches SUCCESS',\n configured: (env) => Boolean(env.DBX_TEST_DBT_GIT_URL && env.DATABRICKS_WAREHOUSE_ID),\n async run({ env, client }) {\n if (!env.DBX_TEST_DBT_GIT_URL || !env.DATABRICKS_WAREHOUSE_ID) {\n throw new Error('dbt build requires DBX_TEST_DBT_GIT_URL and DATABRICKS_WAREHOUSE_ID');\n }\n const submitted = await client.post<{ run_id?: number }>('/api/2.1/jobs/runs/submit', {\n run_name: `fabric-experiments-dbt-${Date.now()}`,\n git_source: {\n git_url: env.DBX_TEST_DBT_GIT_URL,\n git_provider: env.DBX_TEST_DBT_GIT_PROVIDER ?? 'gitHub',\n git_branch: env.DBX_TEST_DBT_GIT_BRANCH ?? 'main',\n },\n tasks: [\n {\n task_key: 'dbt_build',\n dbt_task: {\n commands: ['dbt deps', 'dbt build'],\n warehouse_id: env.DATABRICKS_WAREHOUSE_ID,\n ...(env.DBX_TEST_DBT_PROJECT_DIR\n ? { project_directory: env.DBX_TEST_DBT_PROJECT_DIR }\n : {}),\n },\n },\n ],\n });\n if (!submitted.run_id) throw new Error('dbt submit returned no run_id');\n const run = await waitForDatabricksRun(client as never, submitted.run_id, {\n timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n const result = (run as { state?: { result_state?: string } }).state?.result_state;\n if (result !== 'SUCCESS') throw new Error(`dbt run ended in ${result ?? 'UNKNOWN'}`);\n return { runId: submitted.run_id, gitUrl: env.DBX_TEST_DBT_GIT_URL };\n },\n };\n}\n\n/** Wrap product-specific checks such as Auto Loader, Lakebase, notebooks, or dbt. */\nexport function customLiveCheck(\n id: string,\n description: string,\n run: LiveCheck['run'],\n configured?: LiveCheck['configured'],\n): LiveCheck {\n return { id, description, run, ...(configured ? { configured } : {}) };\n}\n","import {\n LakebaseDatabaseProvider,\n type LakebasePoolFactory,\n exchangeLakebaseCredential,\n} from '@fabricorg/experiments-db-pool';\nimport type { LiveCheck } from './live-suite.js';\nimport { resolveTokenProvider } from './workspace-context.js';\n\nexport interface LakebaseCheckOptions {\n fetchImpl?: typeof fetch;\n poolFactory?: LakebasePoolFactory;\n}\n\nfunction required(env: Record<string, string | undefined>, name: string): string {\n const value = env[name]?.trim();\n if (!value) throw new Error(`${name} is required`);\n return value;\n}\n\nexport function createLakebaseTestProvider(\n env: Record<string, string | undefined>,\n options: LakebaseCheckOptions = {},\n): LakebaseDatabaseProvider {\n return new LakebaseDatabaseProvider({\n host: required(env, 'DBX_TEST_LAKEBASE_HOST'),\n database: required(env, 'DBX_TEST_LAKEBASE_DATABASE'),\n user: required(env, 'DBX_TEST_LAKEBASE_USER'),\n workspaceHost: required(env, 'DATABRICKS_HOST'),\n endpoint: required(env, 'DBX_TEST_LAKEBASE_ENDPOINT'),\n token: resolveTokenProvider(required(env, 'DATABRICKS_HOST'), env, options.fetchImpl),\n fetchImpl: options.fetchImpl,\n poolFactory: options.poolFactory,\n max: 1,\n });\n}\n\nasync function workspaceToken(\n env: Record<string, string | undefined>,\n fetchImpl?: typeof fetch,\n): Promise<string> {\n const host = required(env, 'DATABRICKS_HOST');\n const provider = resolveTokenProvider(host, env, fetchImpl);\n return typeof provider === 'string' ? provider : provider();\n}\n\n/** Verify the workspace identity can exchange a short-lived Lakebase credential. */\nexport function lakebaseCredentialCheck(options: LakebaseCheckOptions = {}): LiveCheck {\n return {\n id: 'lakebase-credential',\n description: 'Lakebase OAuth credential exchange',\n configured: (env) => Boolean(env.DBX_TEST_LAKEBASE_ENDPOINT),\n async run({ env }) {\n const credential = await exchangeLakebaseCredential({\n workspaceHost: required(env, 'DATABRICKS_HOST'),\n endpoint: required(env, 'DBX_TEST_LAKEBASE_ENDPOINT'),\n workspaceToken: await workspaceToken(env, options.fetchImpl),\n fetchImpl: options.fetchImpl,\n });\n if (credential.expiresAt <= Date.now()) {\n throw new Error('Lakebase credential is already expired');\n }\n return { expiresAt: new Date(credential.expiresAt).toISOString() };\n },\n };\n}\n\n/** Exercise the production provider before and after an explicit credential/pool refresh. */\nexport function lakebaseRoundTripCheck(options: LakebaseCheckOptions = {}): LiveCheck {\n return {\n id: 'lakebase',\n description: 'Lakebase provider query and credential refresh round-trip',\n configured: (env) =>\n Boolean(\n env.DBX_TEST_LAKEBASE_ENDPOINT &&\n env.DBX_TEST_LAKEBASE_HOST &&\n env.DBX_TEST_LAKEBASE_DATABASE &&\n env.DBX_TEST_LAKEBASE_USER,\n ),\n async run({ env }) {\n const provider = createLakebaseTestProvider(env, options);\n try {\n const first = await provider\n .getPool()\n .query<{ dbx_test_ok: number }>('SELECT 1 AS dbx_test_ok');\n if (Number(first.rows[0]?.dbx_test_ok) !== 1) {\n throw new Error('Lakebase round-trip returned an unexpected value');\n }\n await provider.refreshCredentials();\n const second = await provider\n .getPool()\n .query<{ dbx_test_ok: number }>('SELECT 1 AS dbx_test_ok');\n if (Number(second.rows[0]?.dbx_test_ok) !== 1) {\n throw new Error('Lakebase post-refresh round-trip returned an unexpected value');\n }\n return { queries: 2, refreshed: true };\n } finally {\n await provider.close();\n }\n },\n };\n}\n","import { resolveTokenProvider } from './workspace-context.js';\n\nexport async function databricksFetch(\n env: Record<string, string | undefined>,\n pathOrUrl: string,\n init: RequestInit = {},\n fetchImpl: typeof fetch = fetch,\n): Promise<Response> {\n const host = env.DATABRICKS_HOST?.replace(/\\/$/, '');\n if (!host) throw new Error('DATABRICKS_HOST is required');\n const provider = resolveTokenProvider(host, env, fetchImpl);\n const token = typeof provider === 'string' ? provider : await provider();\n const headers = new Headers(init.headers);\n headers.set('authorization', `Bearer ${token}`);\n const response = await fetchImpl(\n /^https?:\\/\\//.test(pathOrUrl) ? pathOrUrl : `${host}${pathOrUrl}`,\n {\n ...init,\n headers,\n },\n );\n if (!response.ok) {\n const body = await response.text();\n throw new Error(\n `Databricks request failed: ${response.status} ${response.statusText}: ${body.slice(0, 500)}`,\n );\n }\n return response;\n}\n","import { databricksFetch } from './databricks-http.js';\nimport type { LiveCheck } from './live-suite.js';\n\nfunction csv(value: string | undefined): string[] {\n return (value ?? '')\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\n/** Assert secret key metadata only; values are never requested. */\nexport function secretScopeCheck(): LiveCheck {\n return {\n id: 'secrets',\n description: 'Databricks secret scope contains expected keys',\n configured: (env) => Boolean(env.DBX_TEST_SECRET_SCOPE && env.DBX_TEST_SECRET_KEYS),\n async run({ env, client }) {\n const scope = env.DBX_TEST_SECRET_SCOPE as string;\n const expected = csv(env.DBX_TEST_SECRET_KEYS);\n const response = await client.get<{ secrets?: { key?: string }[] }>('/api/2.0/secrets/list', {\n scope,\n });\n const actual = new Set((response.secrets ?? []).map((secret) => secret.key).filter(Boolean));\n const missing = expected.filter((key) => !actual.has(key));\n if (missing.length > 0) {\n throw new Error(`Secret scope ${scope} is missing keys: ${missing.join(', ')}`);\n }\n return { scope, expectedKeys: expected.length };\n },\n };\n}\n\nexport interface AppHealthCheckOptions {\n fetchImpl?: typeof fetch;\n}\n\n/** Verify app state, resource bindings, and the gateway-authenticated application health route. */\nexport function appHealthCheck(options: AppHealthCheckOptions = {}): LiveCheck {\n return {\n id: 'app',\n description: 'Databricks App is running, bound, and healthy',\n configured: (env) => Boolean(env.DBX_TEST_APP_NAME),\n async run({ env, client }) {\n const name = env.DBX_TEST_APP_NAME as string;\n const app = await client.get<{\n app_status?: { state?: string };\n resources?: { name?: string }[];\n url?: string;\n app_url?: string;\n }>(`/api/2.0/apps/${encodeURIComponent(name)}`);\n if (app.app_status?.state !== 'RUNNING') {\n throw new Error(`Databricks App ${name} is ${app.app_status?.state ?? 'UNKNOWN'}`);\n }\n const expected = csv(env.DBX_TEST_APP_RESOURCES);\n const actual = new Set(\n (app.resources ?? []).map((resource) => resource.name).filter(Boolean),\n );\n const missing = expected.filter((resource) => !actual.has(resource));\n if (missing.length > 0) {\n throw new Error(\n `Databricks App ${name} is missing resource bindings: ${missing.join(', ')}`,\n );\n }\n const appUrl = env.DBX_TEST_APP_URL ?? app.url ?? app.app_url;\n if (!appUrl) throw new Error(`Databricks App ${name} returned no URL`);\n const healthUrl = new URL('/api/healthz', appUrl).toString();\n const response = await databricksFetch(env, healthUrl, {}, options.fetchImpl);\n const health = (await response.json()) as { ok?: boolean; status?: string };\n if (health.ok !== true && health.status !== 'ok') {\n throw new Error(`Databricks App ${name} health probe did not report ok`);\n }\n return { name, bindings: actual.size, health: 'ok' };\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { databricksFetch } from './databricks-http.js';\nimport type { LiveCheck } from './live-suite.js';\n\nexport interface VolumeIOCheckOptions {\n fetchImpl?: typeof fetch;\n randomId?: () => string;\n}\n\nexport function normalizeVolumeRoot(value: string): string {\n const normalized = value.replace(/\\/$/, '');\n if (!/^\\/Volumes\\/[^/]+\\/[^/]+\\/[^/]+$/.test(normalized)) {\n throw new Error('DBX_TEST_VOLUME must be /Volumes/<catalog>/<schema>/<volume>');\n }\n return normalized;\n}\n\nexport async function ensureVolumeDirectory(\n env: Record<string, string | undefined>,\n directory: string,\n fetchImpl?: typeof fetch,\n): Promise<void> {\n await databricksFetch(env, `/api/2.0/fs/directories${directory}`, { method: 'PUT' }, fetchImpl);\n}\n\nexport async function uploadVolumeFile(\n env: Record<string, string | undefined>,\n path: string,\n body: BodyInit | Uint8Array,\n fetchImpl?: typeof fetch,\n): Promise<void> {\n await databricksFetch(\n env,\n `/api/2.0/fs/files${path}`,\n { method: 'PUT', body: body as BodyInit },\n fetchImpl,\n );\n}\n\nexport async function deleteVolumeFile(\n env: Record<string, string | undefined>,\n path: string,\n fetchImpl?: typeof fetch,\n): Promise<void> {\n await databricksFetch(env, `/api/2.0/fs/files${path}`, { method: 'DELETE' }, fetchImpl);\n}\n\n/** Upload, download, and delete a small probe through the Databricks Files API. */\nexport function volumeIOCheck(options: VolumeIOCheckOptions = {}): LiveCheck {\n return {\n id: 'volume-io',\n description: 'Unity Catalog volume Files API round-trip',\n configured: (env) => Boolean(env.DBX_TEST_VOLUME),\n async run({ env }) {\n const root = normalizeVolumeRoot(env.DBX_TEST_VOLUME as string);\n const prefix = (env.DBX_TEST_ENV_NAME ?? 'fx-live').replace(/[^A-Za-z0-9_.-]/g, '_');\n const id = (options.randomId ?? randomUUID)();\n const directory = `${root}/${prefix}`;\n const file = `${directory}/probe-${id}.txt`;\n const filePath = `/api/2.0/fs/files${file}`;\n const body = new TextEncoder().encode(`fabric-experiments-volume-probe:${id}`);\n await ensureVolumeDirectory(env, directory, options.fetchImpl);\n try {\n await uploadVolumeFile(env, file, body, options.fetchImpl);\n const downloaded = await databricksFetch(env, filePath, {}, options.fetchImpl);\n const actual = new Uint8Array(await downloaded.arrayBuffer());\n if (actual.length !== body.length || actual.some((value, index) => value !== body[index])) {\n throw new Error('Volume round-trip returned different bytes');\n }\n return { volume: root, bytes: body.length };\n } finally {\n await deleteVolumeFile(env, file, options.fetchImpl).catch(() => undefined);\n }\n },\n };\n}\n","import { randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { basename, resolve } from 'node:path';\nimport type { LiveCheck } from './live-suite.js';\nimport { waitForPipelineUpdate } from './pollers.js';\nimport {\n deleteVolumeFile,\n ensureVolumeDirectory,\n normalizeVolumeRoot,\n uploadVolumeFile,\n} from './volume-checks.js';\n\nexport interface AutoLoaderCheckOptions {\n fetchImpl?: typeof fetch;\n fixtureBody?: Uint8Array;\n randomId?: () => string;\n}\n\n/** Exercise Files API -> isolated Lakeflow pipeline -> Delta output. */\nexport function autoLoaderIngestionCheck(options: AutoLoaderCheckOptions = {}): LiveCheck {\n return {\n id: 'autoloader',\n description: 'Isolated Auto Loader fixture ingestion reaches Delta without rescued rows',\n configured: (env) =>\n Boolean(\n env.DBX_TEST_AUTOLOADER_PIPELINE_ID &&\n env.DBX_TEST_AUTOLOADER_TABLE &&\n env.DBX_TEST_AUTOLOADER_FIXTURE &&\n env.DBX_TEST_VOLUME,\n ),\n async run({ env, client, warehouse }) {\n const pipelineId = env.DBX_TEST_AUTOLOADER_PIPELINE_ID as string;\n if (pipelineId === env.DBX_TEST_PIPELINE_ID) {\n throw new Error('DBX_TEST_AUTOLOADER_PIPELINE_ID must not be the production pipeline');\n }\n const root = normalizeVolumeRoot(env.DBX_TEST_VOLUME as string);\n const fixturePath = env.DBX_TEST_AUTOLOADER_FIXTURE as string;\n const body = options.fixtureBody ?? new Uint8Array(await readFile(resolve(fixturePath)));\n const id = (options.randomId ?? randomUUID)();\n const runName = (env.DBX_TEST_ENV_NAME ?? 'autoloader').replace(/[^A-Za-z0-9_.-]/g, '_');\n const directory = `${root}/exposures/${runName}/${id}`;\n const destination = `${directory}/${basename(fixturePath)}`;\n await ensureVolumeDirectory(env, directory, options.fetchImpl);\n try {\n await uploadVolumeFile(env, destination, body, options.fetchImpl);\n const submitted = await client.post<{ update_id?: string }>(\n `/api/2.0/pipelines/${encodeURIComponent(pipelineId)}/updates`,\n { full_refresh: true },\n );\n if (!submitted.update_id) throw new Error('Auto Loader pipeline returned no update_id');\n await waitForPipelineUpdate(client, pipelineId, submitted.update_id, {\n timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 900_000),\n pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 10_000),\n });\n const table = env.DBX_TEST_AUTOLOADER_TABLE as string;\n const rows = await warehouse.query(\n `SELECT COUNT(*) AS n, SUM(CASE WHEN _rescued_data IS NOT NULL THEN 1 ELSE 0 END) AS rescued FROM ${table}`,\n );\n const count = Number(rows[0]?.n ?? 0);\n const rescued = Number(rows[0]?.rescued ?? 0);\n if (count < 1) throw new Error(`Auto Loader produced no rows in ${table}`);\n if (rescued !== 0)\n throw new Error(`Auto Loader produced ${rescued} rescued rows in ${table}`);\n return { pipelineId, table, rows: count, rescued };\n } finally {\n await deleteVolumeFile(env, destination, options.fetchImpl).catch(() => undefined);\n }\n },\n };\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { T as TableFixture } from './fixtures-CAWhzIHu.cjs';
|
|
2
|
+
export { F as FixtureColumn, p as parseFixtureColumns, r as resolveFixtureRows } from './fixtures-CAWhzIHu.cjs';
|
|
3
|
+
import { DatabricksRestClient } from '@fabric-harness/databricks';
|
|
4
|
+
export { waitForDatabricksRun, waitForDatabricksStatement } from '@fabric-harness/databricks';
|
|
5
|
+
import { LakebasePoolFactory, LakebaseDatabaseProvider } from '@fabricorg/experiments-db-pool';
|
|
6
|
+
|
|
7
|
+
type TestProfile = 'local' | 'live';
|
|
8
|
+
/**
|
|
9
|
+
* One SQL surface, two engines (ADR-0006). `local` executes on DuckDB
|
|
10
|
+
* in-process; `live` executes on a Databricks SQL warehouse via the SQL
|
|
11
|
+
* Statement Execution API. Params are positional `?` in both profiles — the
|
|
12
|
+
* workspace context transparently rewrites them to the named markers the
|
|
13
|
+
* Statement Execution API requires.
|
|
14
|
+
*/
|
|
15
|
+
interface ExecutionContext {
|
|
16
|
+
readonly profile: TestProfile;
|
|
17
|
+
/** Execute a statement, discarding any result. */
|
|
18
|
+
exec(sql: string, params?: readonly unknown[]): Promise<void>;
|
|
19
|
+
/** Execute a query and return normalized row objects (bigint→number, timestamps→ISO). */
|
|
20
|
+
query(sql: string, params?: readonly unknown[]): Promise<Record<string, unknown>[]>;
|
|
21
|
+
/** Create + seed a table from a declarative fixture. */
|
|
22
|
+
loadFixture(fixture: TableFixture): Promise<void>;
|
|
23
|
+
/** Qualify a bare table name for this context (schema/catalog scoping). */
|
|
24
|
+
qual(table: string): string;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
declare function resolveProfile(env?: Record<string, string | undefined>): TestProfile;
|
|
28
|
+
interface CreateContextOptions {
|
|
29
|
+
profile?: TestProfile;
|
|
30
|
+
env?: Record<string, string | undefined>;
|
|
31
|
+
/** local profile: schema to create + qualify tables with. live profile: schema within the catalog. */
|
|
32
|
+
schema?: string;
|
|
33
|
+
/** Live profile only: observe each submitted SQL statement. */
|
|
34
|
+
onStatement?: (statement: {
|
|
35
|
+
sql: string;
|
|
36
|
+
statementId?: string;
|
|
37
|
+
}) => void;
|
|
38
|
+
}
|
|
39
|
+
/** Profile-dispatched factory. Lazy-imports each engine so the unused one stays out of the bundle. */
|
|
40
|
+
declare function createExecutionContext(options?: CreateContextOptions): Promise<ExecutionContext>;
|
|
41
|
+
|
|
42
|
+
interface DuckDbContextOptions {
|
|
43
|
+
/** Database file path; ':memory:' (default) for a throwaway in-process db. */
|
|
44
|
+
path?: string;
|
|
45
|
+
/** Optional schema to create + qualify tables with. */
|
|
46
|
+
schema?: string;
|
|
47
|
+
/** Injectable for tests of this module itself. */
|
|
48
|
+
connectionFactory?: (path: string) => Promise<DuckDbConnectionLike>;
|
|
49
|
+
}
|
|
50
|
+
/** Structural slice of the lazily-imported @duckdb/node-api connection. */
|
|
51
|
+
interface DuckDbConnectionLike {
|
|
52
|
+
run(sql: string, values?: unknown[]): Promise<unknown>;
|
|
53
|
+
runAndReadAll(sql: string, values?: unknown[]): Promise<{
|
|
54
|
+
getRowObjects(): Record<string, unknown>[];
|
|
55
|
+
}>;
|
|
56
|
+
closeSync(): void;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Hermetic local execution context on DuckDB — the `local` profile of the
|
|
60
|
+
* testing pyramid. No workspace, no credentials, sub-second.
|
|
61
|
+
*/
|
|
62
|
+
declare function createDuckDbContext(options?: DuckDbContextOptions): Promise<ExecutionContext>;
|
|
63
|
+
/**
|
|
64
|
+
* Normalize DuckDB values to plain JSON-ish values so assertions and golden
|
|
65
|
+
* files are engine-portable: bigint→number, TIMESTAMP→`YYYY-MM-DD HH:MM:SS`
|
|
66
|
+
* (UTC, microseconds trimmed), DECIMAL→number.
|
|
67
|
+
*/
|
|
68
|
+
declare function normalizeRow(row: Record<string, unknown>): Record<string, unknown>;
|
|
69
|
+
|
|
70
|
+
/** Structural slice of DatabricksRestClient the workspace context uses (injectable in tests). */
|
|
71
|
+
interface WorkspaceClientLike {
|
|
72
|
+
get<T>(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
73
|
+
post<T>(path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>, options?: unknown): Promise<T>;
|
|
74
|
+
}
|
|
75
|
+
interface WorkspaceContextOptions {
|
|
76
|
+
env?: Record<string, string | undefined>;
|
|
77
|
+
/** Schema within the catalog used by qual(); defaults to DBX_TEST_SCHEMA. */
|
|
78
|
+
schema?: string;
|
|
79
|
+
/** Injectable client for hermetic tests; defaults to a DatabricksRestClient from env auth. */
|
|
80
|
+
client?: WorkspaceClientLike;
|
|
81
|
+
/** Injectable fetch for the OAuth M2M exchange. */
|
|
82
|
+
fetchImpl?: typeof fetch;
|
|
83
|
+
pollIntervalMs?: number;
|
|
84
|
+
timeoutMs?: number;
|
|
85
|
+
/** Drop tables seeded by this context on close. Defaults to true. */
|
|
86
|
+
cleanupFixtures?: boolean;
|
|
87
|
+
/** Observe submitted statements for redacted failure evidence. */
|
|
88
|
+
onStatement?: (statement: {
|
|
89
|
+
sql: string;
|
|
90
|
+
statementId?: string;
|
|
91
|
+
}) => void;
|
|
92
|
+
}
|
|
93
|
+
interface StatementResponse {
|
|
94
|
+
statement_id?: string;
|
|
95
|
+
status?: {
|
|
96
|
+
state?: string;
|
|
97
|
+
error?: {
|
|
98
|
+
message?: string;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
manifest?: {
|
|
102
|
+
schema?: {
|
|
103
|
+
columns?: {
|
|
104
|
+
name: string;
|
|
105
|
+
type_name?: string;
|
|
106
|
+
position?: number;
|
|
107
|
+
}[];
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
result?: {
|
|
111
|
+
data_array?: (string | null)[][];
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Live execution context on a Databricks SQL warehouse via the SQL Statement
|
|
116
|
+
* Execution API (/api/2.0/sql/statements). The Statement Execution API takes
|
|
117
|
+
* NAMED parameter markers, so positional `?` params are rewritten to
|
|
118
|
+
* `:p1..:pn` — the ExecutionContext surface stays identical to the local
|
|
119
|
+
* profile.
|
|
120
|
+
*/
|
|
121
|
+
declare function createWorkspaceContext(options?: WorkspaceContextOptions): Promise<ExecutionContext>;
|
|
122
|
+
/** Rewrite positional `?` markers to the named `:pN` markers the Statement Execution API requires. */
|
|
123
|
+
declare function toNamedParameters(sql: string, params: readonly unknown[]): {
|
|
124
|
+
statement: string;
|
|
125
|
+
parameters: {
|
|
126
|
+
name: string;
|
|
127
|
+
value: string | null;
|
|
128
|
+
}[];
|
|
129
|
+
};
|
|
130
|
+
/** Map a terminal statement response to normalized row objects. */
|
|
131
|
+
declare function parseStatementRows(response: StatementResponse): Record<string, unknown>[];
|
|
132
|
+
/**
|
|
133
|
+
* Auth precedence (ADR-0006): DATABRICKS_BEARER (pre-minted, CI) →
|
|
134
|
+
* DATABRICKS_CLIENT_ID/SECRET (OAuth M2M) → DATABRICKS_TOKEN (PAT).
|
|
135
|
+
*/
|
|
136
|
+
declare function createClientFromEnv(env: Record<string, string | undefined>, fetchImpl?: typeof fetch): DatabricksRestClient;
|
|
137
|
+
declare function resolveTokenProvider(host: string, env: Record<string, string | undefined>, fetchImpl?: typeof fetch): string | (() => Promise<string>);
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Framework-free table assertions — they throw plain Errors so they work
|
|
141
|
+
* under vitest, cucumber-js steps, or the live check runner alike.
|
|
142
|
+
*/
|
|
143
|
+
declare function expectTable(ctx: ExecutionContext, table: string): {
|
|
144
|
+
toHaveRowCount(expected: number): Promise<void>;
|
|
145
|
+
/** Every partial row must match at least one table row on its own keys. */
|
|
146
|
+
toContainRows(partials: readonly Record<string, unknown>[]): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* Compare `SELECT * ORDER BY <orderBy>` against a committed golden JSON
|
|
149
|
+
* file. Set DBX_TEST_UPDATE_GOLDEN=1 to (re)write the golden instead —
|
|
150
|
+
* a reviewable, versioned event.
|
|
151
|
+
*/
|
|
152
|
+
toMatchGolden(goldenPath: string, options?: {
|
|
153
|
+
orderBy?: string;
|
|
154
|
+
}): Promise<void>;
|
|
155
|
+
};
|
|
156
|
+
/** Compare query results (not a whole table) against a golden file. */
|
|
157
|
+
declare function expectQueryToMatchGolden(ctx: ExecutionContext, sql: string, params: readonly unknown[], goldenPath: string): Promise<void>;
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Golden-result files: committed JSON snapshots of query results that every
|
|
161
|
+
* engine and every refactor must reproduce exactly — the frozen-vector
|
|
162
|
+
* pattern from @fabricorg/experiments-testkit generalized to warehouse rows.
|
|
163
|
+
*/
|
|
164
|
+
declare function compareToGolden(goldenPath: string, actual: readonly Record<string, unknown>[], label: string, env?: Record<string, string | undefined>): Promise<void>;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Framework-free fake of the Databricks REST client surface, for unit tests
|
|
168
|
+
* of orchestration logic (submit → poll → terminal). Queue responses per
|
|
169
|
+
* (method, path-prefix); every call is recorded for assertions. Works under
|
|
170
|
+
* vitest without vi.fn so it is equally usable from cucumber-js worlds.
|
|
171
|
+
*/
|
|
172
|
+
interface RecordedCall {
|
|
173
|
+
method: 'GET' | 'POST';
|
|
174
|
+
path: string;
|
|
175
|
+
body?: unknown;
|
|
176
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
177
|
+
}
|
|
178
|
+
interface MockDatabricksClient {
|
|
179
|
+
get<T>(path: string, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
|
|
180
|
+
post<T>(path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>, options?: unknown): Promise<T>;
|
|
181
|
+
/** Queue the next response for calls whose path starts with `pathPrefix`. FIFO per prefix. */
|
|
182
|
+
queue(method: 'GET' | 'POST', pathPrefix: string, response: unknown): MockDatabricksClient;
|
|
183
|
+
/** Queue an error for the next matching call. */
|
|
184
|
+
queueError(method: 'GET' | 'POST', pathPrefix: string, error: Error): MockDatabricksClient;
|
|
185
|
+
readonly calls: readonly RecordedCall[];
|
|
186
|
+
callsTo(method: 'GET' | 'POST', pathPrefix: string): RecordedCall[];
|
|
187
|
+
}
|
|
188
|
+
declare function createMockDatabricksClient(): MockDatabricksClient;
|
|
189
|
+
|
|
190
|
+
type LiveCheckStatus = 'pass' | 'fail' | 'not-configured';
|
|
191
|
+
interface LiveCheckContext {
|
|
192
|
+
env: Record<string, string | undefined>;
|
|
193
|
+
warehouse: ExecutionContext;
|
|
194
|
+
client: WorkspaceClientLike;
|
|
195
|
+
}
|
|
196
|
+
interface LiveCheck {
|
|
197
|
+
id: string;
|
|
198
|
+
description: string;
|
|
199
|
+
configured?: (env: Record<string, string | undefined>) => boolean;
|
|
200
|
+
run(context: LiveCheckContext): Promise<unknown>;
|
|
201
|
+
}
|
|
202
|
+
interface LiveCheckResult {
|
|
203
|
+
id: string;
|
|
204
|
+
description: string;
|
|
205
|
+
status: LiveCheckStatus;
|
|
206
|
+
durationMs: number;
|
|
207
|
+
details?: unknown;
|
|
208
|
+
error?: string;
|
|
209
|
+
}
|
|
210
|
+
interface LiveEvidence {
|
|
211
|
+
schemaVersion: 1;
|
|
212
|
+
kind: 'databricks-live-suite';
|
|
213
|
+
startedAt: string;
|
|
214
|
+
finishedAt: string;
|
|
215
|
+
success: boolean;
|
|
216
|
+
required: string[];
|
|
217
|
+
results: LiveCheckResult[];
|
|
218
|
+
}
|
|
219
|
+
interface LiveSuiteSpec {
|
|
220
|
+
checks: readonly LiveCheck[];
|
|
221
|
+
required?: readonly string[];
|
|
222
|
+
evidencePath?: string;
|
|
223
|
+
junitPath?: string;
|
|
224
|
+
env?: Record<string, string | undefined>;
|
|
225
|
+
}
|
|
226
|
+
interface LiveSuiteRuntime {
|
|
227
|
+
warehouse?: ExecutionContext;
|
|
228
|
+
client?: WorkspaceClientLike;
|
|
229
|
+
}
|
|
230
|
+
interface DefinedLiveSuite {
|
|
231
|
+
run(runtime?: LiveSuiteRuntime): Promise<LiveEvidence | undefined>;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Define an explicitly gated live suite. Without DBX_TEST_LIVE=1, run() is a
|
|
235
|
+
* silent no-op so the same command is safe in ordinary CI matrices.
|
|
236
|
+
*/
|
|
237
|
+
declare function defineLiveSuite(spec: LiveSuiteSpec): DefinedLiveSuite;
|
|
238
|
+
declare function runLiveSuite(spec: LiveSuiteSpec, runtime?: LiveSuiteRuntime): Promise<LiveEvidence | undefined>;
|
|
239
|
+
declare function renderJUnit(evidence: LiveEvidence): string;
|
|
240
|
+
|
|
241
|
+
declare function sqlRoundTripCheck(): LiveCheck;
|
|
242
|
+
interface DeltaColumnContract {
|
|
243
|
+
name: string;
|
|
244
|
+
type?: string;
|
|
245
|
+
}
|
|
246
|
+
declare function assertDeltaContract(table: string, rows: readonly Record<string, unknown>[], columns: readonly DeltaColumnContract[]): void;
|
|
247
|
+
declare function deltaContractCheck(tableEnv?: string, columns?: readonly DeltaColumnContract[]): LiveCheck;
|
|
248
|
+
declare function unityCatalogAccessCheck(): LiveCheck;
|
|
249
|
+
declare function jobRunCheck(): LiveCheck;
|
|
250
|
+
/** Trigger the deployed Lakeflow pipeline and require a completed update. */
|
|
251
|
+
declare function pipelineRefreshCheck(): LiveCheck;
|
|
252
|
+
declare function notebookSubmitCheck(): LiveCheck;
|
|
253
|
+
declare function dbtBuildCheck(): LiveCheck;
|
|
254
|
+
/** Wrap product-specific checks such as Auto Loader, Lakebase, notebooks, or dbt. */
|
|
255
|
+
declare function customLiveCheck(id: string, description: string, run: LiveCheck['run'], configured?: LiveCheck['configured']): LiveCheck;
|
|
256
|
+
|
|
257
|
+
interface LakebaseCheckOptions {
|
|
258
|
+
fetchImpl?: typeof fetch;
|
|
259
|
+
poolFactory?: LakebasePoolFactory;
|
|
260
|
+
}
|
|
261
|
+
declare function createLakebaseTestProvider(env: Record<string, string | undefined>, options?: LakebaseCheckOptions): LakebaseDatabaseProvider;
|
|
262
|
+
/** Verify the workspace identity can exchange a short-lived Lakebase credential. */
|
|
263
|
+
declare function lakebaseCredentialCheck(options?: LakebaseCheckOptions): LiveCheck;
|
|
264
|
+
/** Exercise the production provider before and after an explicit credential/pool refresh. */
|
|
265
|
+
declare function lakebaseRoundTripCheck(options?: LakebaseCheckOptions): LiveCheck;
|
|
266
|
+
|
|
267
|
+
/** Assert secret key metadata only; values are never requested. */
|
|
268
|
+
declare function secretScopeCheck(): LiveCheck;
|
|
269
|
+
interface AppHealthCheckOptions {
|
|
270
|
+
fetchImpl?: typeof fetch;
|
|
271
|
+
}
|
|
272
|
+
/** Verify app state, resource bindings, and the gateway-authenticated application health route. */
|
|
273
|
+
declare function appHealthCheck(options?: AppHealthCheckOptions): LiveCheck;
|
|
274
|
+
|
|
275
|
+
interface VolumeIOCheckOptions {
|
|
276
|
+
fetchImpl?: typeof fetch;
|
|
277
|
+
randomId?: () => string;
|
|
278
|
+
}
|
|
279
|
+
declare function normalizeVolumeRoot(value: string): string;
|
|
280
|
+
declare function ensureVolumeDirectory(env: Record<string, string | undefined>, directory: string, fetchImpl?: typeof fetch): Promise<void>;
|
|
281
|
+
declare function uploadVolumeFile(env: Record<string, string | undefined>, path: string, body: BodyInit | Uint8Array, fetchImpl?: typeof fetch): Promise<void>;
|
|
282
|
+
declare function deleteVolumeFile(env: Record<string, string | undefined>, path: string, fetchImpl?: typeof fetch): Promise<void>;
|
|
283
|
+
/** Upload, download, and delete a small probe through the Databricks Files API. */
|
|
284
|
+
declare function volumeIOCheck(options?: VolumeIOCheckOptions): LiveCheck;
|
|
285
|
+
|
|
286
|
+
interface AutoLoaderCheckOptions {
|
|
287
|
+
fetchImpl?: typeof fetch;
|
|
288
|
+
fixtureBody?: Uint8Array;
|
|
289
|
+
randomId?: () => string;
|
|
290
|
+
}
|
|
291
|
+
/** Exercise Files API -> isolated Lakeflow pipeline -> Delta output. */
|
|
292
|
+
declare function autoLoaderIngestionCheck(options?: AutoLoaderCheckOptions): LiveCheck;
|
|
293
|
+
|
|
294
|
+
interface PollOptions {
|
|
295
|
+
pollIntervalMs?: number;
|
|
296
|
+
timeoutMs?: number;
|
|
297
|
+
signal?: AbortSignal;
|
|
298
|
+
}
|
|
299
|
+
declare function waitForPipelineUpdate(client: WorkspaceClientLike, pipelineId: string, updateId: string, options?: PollOptions): Promise<Record<string, unknown>>;
|
|
300
|
+
|
|
301
|
+
export { type AppHealthCheckOptions, type AutoLoaderCheckOptions, type CreateContextOptions, type DefinedLiveSuite, type DeltaColumnContract, type DuckDbConnectionLike, type DuckDbContextOptions, type ExecutionContext, type LakebaseCheckOptions, type LiveCheck, type LiveCheckContext, type LiveCheckResult, type LiveCheckStatus, type LiveEvidence, type LiveSuiteRuntime, type LiveSuiteSpec, type MockDatabricksClient, type PollOptions, type RecordedCall, TableFixture, type TestProfile, type VolumeIOCheckOptions, type WorkspaceClientLike, type WorkspaceContextOptions, appHealthCheck, assertDeltaContract, autoLoaderIngestionCheck, compareToGolden, createClientFromEnv, createDuckDbContext, createExecutionContext, createLakebaseTestProvider, createMockDatabricksClient, createWorkspaceContext, customLiveCheck, dbtBuildCheck, defineLiveSuite, deleteVolumeFile, deltaContractCheck, ensureVolumeDirectory, expectQueryToMatchGolden, expectTable, jobRunCheck, lakebaseCredentialCheck, lakebaseRoundTripCheck, normalizeRow, normalizeVolumeRoot, notebookSubmitCheck, parseStatementRows, pipelineRefreshCheck, renderJUnit, resolveProfile, resolveTokenProvider, runLiveSuite, secretScopeCheck, sqlRoundTripCheck, toNamedParameters, unityCatalogAccessCheck, uploadVolumeFile, volumeIOCheck, waitForPipelineUpdate };
|