Skip to content

Commit 9793ff2

Browse files
committed
test: finops query-history — ClickHouse SQL building and edge cases
Add unit tests for the ClickHouse `buildHistoryQuery` path added in PR #574, plus coverage for unknown warehouse types and Snowflake warehouse_filter bind ordering. These mitigate silent SQL corruption from unclamped inputs and wrong bind order. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 31d163e commit 9793ff2

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

packages/opencode/test/altimate/schema-finops-dbt.test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,47 @@ describe("FinOps: SQL template generation", () => {
158158
const built = HistoryTemplates.buildHistoryQuery("databricks", 7, 50)
159159
expect(built?.sql).toContain("system.query.history")
160160
})
161+
162+
test("builds ClickHouse history SQL", () => {
163+
const built = HistoryTemplates.buildHistoryQuery("clickhouse", 7, 100)
164+
expect(built).not.toBeNull()
165+
expect(built?.sql).toContain("system.query_log")
166+
expect(built?.sql).toContain("QueryFinish")
167+
// ClickHouse uses string substitution, not bind params
168+
expect(built?.binds).toEqual([])
169+
// Verify placeholders were replaced with clamped values
170+
expect(built?.sql).not.toContain("__DAYS__")
171+
expect(built?.sql).not.toContain("__LIMIT__")
172+
expect(built?.sql).toContain("7") // days value
173+
expect(built?.sql).toContain("100") // limit value
174+
})
175+
176+
test("ClickHouse buildHistoryQuery clamps out-of-range days and limit values", () => {
177+
const lowDays = HistoryTemplates.buildHistoryQuery("clickhouse", -5, 50)
178+
expect(lowDays?.sql).toContain("today() - 1") // days clamped to 1
179+
180+
const highDays = HistoryTemplates.buildHistoryQuery("clickhouse", 9999, 50)
181+
expect(highDays?.sql).toContain("today() - 365") // days clamped to 365
182+
183+
const lowLimit = HistoryTemplates.buildHistoryQuery("clickhouse", 7, -10)
184+
expect(lowLimit?.sql).toContain("LIMIT 1") // limit clamped to 1
185+
186+
const highLimit = HistoryTemplates.buildHistoryQuery("clickhouse", 7, 99999)
187+
expect(highLimit?.sql).toContain("LIMIT 10000") // limit clamped to 10000
188+
})
189+
190+
test("returns null for unknown warehouse types", () => {
191+
expect(HistoryTemplates.buildHistoryQuery("mysql", 7, 50)).toBeNull()
192+
expect(HistoryTemplates.buildHistoryQuery("sqlserver", 7, 50)).toBeNull()
193+
expect(HistoryTemplates.buildHistoryQuery("oracle", 7, 50)).toBeNull()
194+
expect(HistoryTemplates.buildHistoryQuery("unknown", 7, 50)).toBeNull()
195+
})
196+
197+
test("builds Snowflake history SQL with warehouse filter", () => {
198+
const built = HistoryTemplates.buildHistoryQuery("snowflake", 7, 100, undefined, "COMPUTE_WH")
199+
expect(built?.sql).toContain("warehouse_name = ?")
200+
expect(built?.binds).toEqual([-7, "COMPUTE_WH", 100])
201+
})
161202
})
162203

163204
describe("warehouse-advisor", () => {

0 commit comments

Comments
 (0)