diff --git a/packages/opencode/test/tool/project-scan.test.ts b/packages/opencode/test/tool/project-scan.test.ts index 31bfd0416..f30cd8f13 100644 --- a/packages/opencode/test/tool/project-scan.test.ts +++ b/packages/opencode/test/tool/project-scan.test.ts @@ -312,6 +312,8 @@ describe("detectEnvVars", () => { "PGHOST", "PGPORT", "PGDATABASE", "PGUSER", "PGPASSWORD", "DATABASE_URL", "MYSQL_HOST", "MYSQL_TCP_PORT", "MYSQL_DATABASE", "MYSQL_USER", "MYSQL_PASSWORD", "REDSHIFT_HOST", "REDSHIFT_PORT", "REDSHIFT_DATABASE", "REDSHIFT_USER", "REDSHIFT_PASSWORD", + "CLICKHOUSE_HOST", "CLICKHOUSE_URL", "CLICKHOUSE_PORT", "CLICKHOUSE_DB", + "CLICKHOUSE_DATABASE", "CLICKHOUSE_USER", "CLICKHOUSE_USERNAME", "CLICKHOUSE_PASSWORD", ] for (const v of vars) { delete process.env[v] @@ -502,6 +504,62 @@ describe("detectEnvVars", () => { expect(rs!.config.user).toBe("admin") }) + test("detects ClickHouse via CLICKHOUSE_HOST", async () => { + clearWarehouseEnvVars() + process.env.CLICKHOUSE_HOST = "clickhouse.example.com" + process.env.CLICKHOUSE_PORT = "8443" + process.env.CLICKHOUSE_DATABASE = "analytics" + process.env.CLICKHOUSE_USER = "default" + process.env.CLICKHOUSE_PASSWORD = "secret" + + const result = await detectEnvVars() + const ch = result.find((r) => r.type === "clickhouse") + expect(ch).toBeDefined() + expect(ch!.name).toBe("env_clickhouse") + expect(ch!.source).toBe("env-var") + expect(ch!.signal).toBe("CLICKHOUSE_HOST") + expect(ch!.config.host).toBe("clickhouse.example.com") + expect(ch!.config.port).toBe("8443") + expect(ch!.config.database).toBe("analytics") + expect(ch!.config.user).toBe("default") + expect(ch!.config.password).toBe("***") + }) + + test("detects ClickHouse via CLICKHOUSE_URL", async () => { + clearWarehouseEnvVars() + process.env.CLICKHOUSE_URL = "https://clickhouse.example.com:8443" + + const result = await detectEnvVars() + const ch = result.find((r) => r.type === "clickhouse") + expect(ch).toBeDefined() + expect(ch!.signal).toBe("CLICKHOUSE_URL") + expect(ch!.config.connection_string).toBe("***") + }) + + test("detects ClickHouse via DATABASE_URL with clickhouse scheme", async () => { + clearWarehouseEnvVars() + process.env.DATABASE_URL = "clickhouse://default:pass@clickhouse.example.com:8443/analytics" + + const result = await detectEnvVars() + const ch = result.find((r) => r.type === "clickhouse") + expect(ch).toBeDefined() + expect(ch!.signal).toBe("DATABASE_URL") + expect(ch!.config.connection_string).toBe("***") + }) + + test("detects ClickHouse via DATABASE_URL with clickhouse+http and clickhouse+https schemes", async () => { + for (const scheme of ["clickhouse+http", "clickhouse+https"]) { + clearWarehouseEnvVars() + process.env.DATABASE_URL = `${scheme}://default:pass@clickhouse.example.com:8443/analytics` + + const result = await detectEnvVars() + const ch = result.find((r) => r.type === "clickhouse") + expect(ch).toBeDefined() + expect(ch!.signal).toBe("DATABASE_URL") + expect(ch!.type).toBe("clickhouse") + } + }) + test("detects multiple warehouses simultaneously", async () => { clearWarehouseEnvVars() process.env.SNOWFLAKE_ACCOUNT = "sf_account"