@@ -481,6 +481,133 @@ func TestLoadFromReaderWithUsernamePassword(t *testing.T) {
481481 }
482482}
483483
484+ const envTestUserPassConfig = `{
485+ "auths": {
486+ "env.example.test": {
487+ "username": "env_user",
488+ "password": "env_pass",
489+ "serveraddress": "env.example.test"
490+ }
491+ }
492+ }`
493+
494+ const envTestAuthConfig = `{
495+ "auths": {
496+ "env.example.test": {
497+ "auth": "ZW52X3VzZXI6ZW52X3Bhc3M="
498+ }
499+ }
500+ }`
501+
502+ func TestGetAllCredentialsFromEnvironment (t * testing.T ) {
503+ t .Run ("can parse DOCKER_AUTH_CONFIG auth field" , func (t * testing.T ) {
504+ config := & ConfigFile {}
505+
506+ t .Setenv ("DOCKER_AUTH_CONFIG" , envTestAuthConfig )
507+
508+ authConfigs , err := config .GetAllCredentials ()
509+ assert .NilError (t , err )
510+
511+ expected := map [string ]types.AuthConfig {
512+ "env.example.test" : {
513+ Username : "env_user" ,
514+ Password : "env_pass" ,
515+ ServerAddress : "env.example.test" ,
516+ },
517+ }
518+ assert .Check (t , is .DeepEqual (authConfigs , expected ))
519+ })
520+
521+ t .Run ("malformed DOCKER_AUTH_CONFIG should fallback to underlying store" , func (t * testing.T ) {
522+ fallbackStore := map [string ]types.AuthConfig {
523+ "fallback.example.test" : {
524+ Username : "fallback_user" ,
525+ Password : "fallback_pass" ,
526+ ServerAddress : "fallback.example.test" ,
527+ },
528+ }
529+ config := & ConfigFile {
530+ AuthConfigs : fallbackStore ,
531+ }
532+
533+ t .Setenv ("DOCKER_AUTH_CONFIG" , envTestUserPassConfig )
534+
535+ authConfigs , err := config .GetAllCredentials ()
536+ assert .NilError (t , err )
537+
538+ expected := fallbackStore
539+ assert .Check (t , is .DeepEqual (authConfigs , expected ))
540+ })
541+
542+ t .Run ("can fetch credentials from DOCKER_AUTH_CONFIG and underlying store" , func (t * testing.T ) {
543+ configFile := New ("filename" )
544+ exampleAuth := types.AuthConfig {
545+ Username : "user" ,
546+ Password : "pass" ,
547+ }
548+ configFile .AuthConfigs ["foo.example.test" ] = exampleAuth
549+
550+ t .Setenv ("DOCKER_AUTH_CONFIG" , envTestAuthConfig )
551+
552+ authConfigs , err := configFile .GetAllCredentials ()
553+ assert .NilError (t , err )
554+
555+ expected := map [string ]types.AuthConfig {
556+ "foo.example.test" : exampleAuth ,
557+ "env.example.test" : {
558+ Username : "env_user" ,
559+ Password : "env_pass" ,
560+ ServerAddress : "env.example.test" ,
561+ },
562+ }
563+ assert .Check (t , is .DeepEqual (authConfigs , expected ))
564+
565+ fooConfig , err := configFile .GetAuthConfig ("foo.example.test" )
566+ assert .NilError (t , err )
567+ expectedAuth := expected ["foo.example.test" ]
568+ assert .Check (t , is .DeepEqual (fooConfig , expectedAuth ))
569+
570+ envConfig , err := configFile .GetAuthConfig ("env.example.test" )
571+ assert .NilError (t , err )
572+ expectedAuth = expected ["env.example.test" ]
573+ assert .Check (t , is .DeepEqual (envConfig , expectedAuth ))
574+ })
575+
576+ t .Run ("env is ignored when empty" , func (t * testing.T ) {
577+ configFile := New ("filename" )
578+
579+ t .Setenv ("DOCKER_AUTH_CONFIG" , "" )
580+
581+ authConfigs , err := configFile .GetAllCredentials ()
582+ assert .NilError (t , err )
583+ assert .Check (t , is .Len (authConfigs , 0 ))
584+ })
585+ }
586+
587+ func TestParseEnvConfig (t * testing.T ) {
588+ t .Run ("should error on unexpected fields" , func (t * testing.T ) {
589+ _ , err := parseEnvConfig (envTestUserPassConfig )
590+ assert .ErrorContains (t , err , "json: unknown field \" username\" " )
591+ })
592+ t .Run ("should be able to load env credentials" , func (t * testing.T ) {
593+ got , err := parseEnvConfig (envTestAuthConfig )
594+ assert .NilError (t , err )
595+ expected := map [string ]types.AuthConfig {
596+ "env.example.test" : {
597+ Username : "env_user" ,
598+ Password : "env_pass" ,
599+ ServerAddress : "env.example.test" ,
600+ },
601+ }
602+ assert .NilError (t , err )
603+ assert .Check (t , is .DeepEqual (got , expected ))
604+ })
605+ t .Run ("should not support multiple JSON objects" , func (t * testing.T ) {
606+ _ , err := parseEnvConfig (`{"auths":{"env.example.test":{"auth":"something"}}}{}` )
607+ assert .ErrorContains (t , err , "does not support more than one JSON object" )
608+ })
609+ }
610+
484611func TestSave (t * testing.T ) {
485612 configFile := New ("test-save" )
486613 defer os .Remove ("test-save" )
0 commit comments