@@ -83,6 +83,7 @@ func TestParseDSNToConfig(t *testing.T) {
8383 DisableExplicitPrepare : true ,
8484 ForwardAuthorizationHeader : true ,
8585 QueryTimeout : & []time.Duration {5 * time .Minute }[0 ],
86+ Roles : map [string ]string {"catalog1" : "role1" , "catalog2" : "role2" },
8687 },
8788 },
8889 {
@@ -158,7 +159,8 @@ func TestParseDSNToConfigAllFieldsHandled(t *testing.T) {
158159 "accessToken=jwt-token-here&" +
159160 "explicitPrepare=false&" +
160161 "forwardAuthorizationHeader=true&" +
161- "query_timeout=5m30s"
162+ "query_timeout=5m30s&" +
163+ "roles=catalog1%3Arole1%3Bcatalog2%3Arole2"
162164
163165 config , err := ParseDSN (complexDSN )
164166 require .NoError (t , err )
@@ -207,6 +209,7 @@ func TestParseDSNToConfigAllFieldsHandled(t *testing.T) {
207209 assert .Equal (t , true , config .ForwardAuthorizationHeader )
208210 assert .NotNil (t , config .QueryTimeout )
209211 assert .Equal (t , 5 * time .Minute + 30 * time .Second , * config .QueryTimeout )
212+ assert .Equal (t , map [string ]string {"catalog1" : "role1" , "catalog2" : "role2" }, config .Roles )
210213}
211214
212215func TestConfigFormatDSNTags (t * testing.T ) {
@@ -1344,29 +1347,59 @@ func TestQueryCancellation(t *testing.T) {
13441347 assert .EqualError (t , err , ErrQueryCancelled .Error (), "unexpected error" )
13451348}
13461349
1347- func TestTrinoRoleHeaderSent (t * testing.T ) {
1348- var receivedHeader string
1350+ func TestTrinoRoleHeader (t * testing.T ) {
1351+ tests := []struct {
1352+ name string
1353+ roles map [string ]string
1354+ namedArg string
1355+ expectedHeader string
1356+ }{
1357+ {
1358+ name : "Roles from config" ,
1359+ roles : map [string ]string {"catalog1" : "role1" , "catalog2" : "role2" },
1360+ namedArg : "" ,
1361+ expectedHeader : `catalog1=ROLE{"role1"},catalog2=ROLE{"role2"}` ,
1362+ },
1363+ {
1364+ name : "Override roles with named argument" ,
1365+ roles : map [string ]string {"catalog1" : "role1" },
1366+ namedArg : `catalog3:role3;catalog4:role4;catalog5:ALL` ,
1367+ expectedHeader : `catalog3=ROLE{"role3"},catalog4=ROLE{"role4"},catalog5=ALL` ,
1368+ },
1369+ }
13491370
1350- ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1351- receivedHeader = r .Header .Get (trinoRoleHeader )
1352- }))
1353- t .Cleanup (ts .Close )
1371+ for _ , tt := range tests {
1372+ t .Run (tt .name , func (t * testing.T ) {
1373+ var receivedHeader string
1374+ var serverURL string
1375+ ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1376+ receivedHeader = r .Header .Get (trinoRoleHeader )
1377+ w .Header ().Set ("Content-Type" , "application/json" )
1378+ w .WriteHeader (http .StatusOK )
1379+ _ , _ = w .Write ([]byte (`{"id":"1","nextUri":"` + serverURL + `/1"}` ))
1380+ }))
1381+ serverURL = ts .URL
1382+ t .Cleanup (ts .Close )
13541383
1355- c := & Config {
1356- ServerURI : ts .URL ,
1357- SessionProperties : map [string ]string {"query_priority" : "1" },
1358- Roles : map [string ]string {"catalog1" : "role1" , "catalog2" : "role2" },
1359- }
1384+ c := & Config {
1385+ ServerURI : ts .URL ,
1386+ Roles : tt .roles ,
1387+ }
13601388
1361- dsn , err := c .FormatDSN ()
1362- require .NoError (t , err )
1363- db , err := sql .Open ("trino" , dsn )
1364- require .NoError (t , err )
1389+ dsn , err := c .FormatDSN ()
1390+ require .NoError (t , err )
1391+ db , err := sql .Open ("trino" , dsn )
1392+ require .NoError (t , err )
13651393
1366- _ , _ = db .Query ("SHOW TABLES" )
1367- require .NoError (t , err )
1394+ if tt .namedArg != "" {
1395+ _ , _ = db .Query ("SELECT 1" , sql .Named ("X-Trino-Role" , tt .namedArg ))
1396+ } else {
1397+ _ , _ = db .Query ("SELECT 1" )
1398+ }
13681399
1369- assert .Equal (t , `catalog1=ROLE{"role1"},catalog2=ROLE{"role2"}` , receivedHeader , "expected X-Trino-Role header to be set" )
1400+ assert .Equal (t , tt .expectedHeader , receivedHeader , "expected X-Trino-Role header to match" )
1401+ })
1402+ }
13701403}
13711404
13721405func TestQueryFailure (t * testing.T ) {
0 commit comments