@@ -312,6 +312,9 @@ describe("detectEnvVars", () => {
312312 "PGHOST" , "PGPORT" , "PGDATABASE" , "PGUSER" , "PGPASSWORD" , "DATABASE_URL" ,
313313 "MYSQL_HOST" , "MYSQL_TCP_PORT" , "MYSQL_DATABASE" , "MYSQL_USER" , "MYSQL_PASSWORD" ,
314314 "REDSHIFT_HOST" , "REDSHIFT_PORT" , "REDSHIFT_DATABASE" , "REDSHIFT_USER" , "REDSHIFT_PASSWORD" ,
315+ "CLICKHOUSE_HOST" , "CLICKHOUSE_URL" , "CLICKHOUSE_PORT" ,
316+ "CLICKHOUSE_DB" , "CLICKHOUSE_DATABASE" , "CLICKHOUSE_USER" ,
317+ "CLICKHOUSE_USERNAME" , "CLICKHOUSE_PASSWORD" ,
315318 ]
316319 for ( const v of vars ) {
317320 delete process . env [ v ]
@@ -542,6 +545,71 @@ describe("detectEnvVars", () => {
542545 }
543546 } )
544547
548+ test ( "detects ClickHouse via CLICKHOUSE_HOST" , async ( ) => {
549+ clearWarehouseEnvVars ( )
550+ process . env . CLICKHOUSE_HOST = "clickhouse.example.com"
551+ process . env . CLICKHOUSE_PORT = "8123"
552+ process . env . CLICKHOUSE_DB = "analytics"
553+ process . env . CLICKHOUSE_USER = "default"
554+ process . env . CLICKHOUSE_PASSWORD = "secret"
555+
556+ const result = await detectEnvVars ( )
557+ const ch = result . find ( ( r ) => r . type === "clickhouse" )
558+ expect ( ch ) . toBeDefined ( )
559+ expect ( ch ! . name ) . toBe ( "env_clickhouse" )
560+ expect ( ch ! . source ) . toBe ( "env-var" )
561+ expect ( ch ! . signal ) . toBe ( "CLICKHOUSE_HOST" )
562+ expect ( ch ! . config . host ) . toBe ( "clickhouse.example.com" )
563+ expect ( ch ! . config . port ) . toBe ( "8123" )
564+ expect ( ch ! . config . database ) . toBe ( "analytics" )
565+ expect ( ch ! . config . user ) . toBe ( "default" )
566+ expect ( ch ! . config . password ) . toBe ( "***" )
567+ } )
568+
569+ test ( "detects ClickHouse via CLICKHOUSE_URL" , async ( ) => {
570+ clearWarehouseEnvVars ( )
571+ process . env . CLICKHOUSE_URL = "https://clickhouse.example.com:8443"
572+
573+ const result = await detectEnvVars ( )
574+ const ch = result . find ( ( r ) => r . type === "clickhouse" )
575+ expect ( ch ) . toBeDefined ( )
576+ expect ( ch ! . signal ) . toBe ( "CLICKHOUSE_URL" )
577+ expect ( ch ! . config . connection_string ) . toBe ( "***" )
578+ } )
579+
580+ test ( "detects ClickHouse via DATABASE_URL with clickhouse scheme" , async ( ) => {
581+ clearWarehouseEnvVars ( )
582+ process . env . DATABASE_URL = "clickhouse://user:pass@host:8123/db"
583+
584+ const result = await detectEnvVars ( )
585+ const ch = result . find ( ( r ) => r . type === "clickhouse" )
586+ expect ( ch ) . toBeDefined ( )
587+ expect ( ch ! . signal ) . toBe ( "DATABASE_URL" )
588+ expect ( ch ! . config . connection_string ) . toBe ( "***" )
589+ } )
590+
591+ test ( "detects ClickHouse via DATABASE_URL with clickhouse+https scheme" , async ( ) => {
592+ clearWarehouseEnvVars ( )
593+ process . env . DATABASE_URL = "clickhouse+https://user:pass@host:8443/db"
594+
595+ const result = await detectEnvVars ( )
596+ const ch = result . find ( ( r ) => r . type === "clickhouse" )
597+ expect ( ch ) . toBeDefined ( )
598+ expect ( ch ! . signal ) . toBe ( "DATABASE_URL" )
599+ expect ( ch ! . config . connection_string ) . toBe ( "***" )
600+ } )
601+
602+ test ( "CLICKHOUSE_HOST takes precedence over DATABASE_URL clickhouse scheme" , async ( ) => {
603+ clearWarehouseEnvVars ( )
604+ process . env . CLICKHOUSE_HOST = "ch-primary.local"
605+ process . env . DATABASE_URL = "clickhouse://user:pass@ch-secondary.local:8123/db"
606+
607+ const result = await detectEnvVars ( )
608+ const chConns = result . filter ( ( r ) => r . type === "clickhouse" )
609+ expect ( chConns . length ) . toBe ( 1 )
610+ expect ( chConns [ 0 ] . signal ) . toBe ( "CLICKHOUSE_HOST" )
611+ } )
612+
545613 test ( "connection names follow env_ prefix convention" , async ( ) => {
546614 clearWarehouseEnvVars ( )
547615 process . env . SNOWFLAKE_ACCOUNT = "acct"
0 commit comments