@@ -688,11 +688,12 @@ func TestDiscoveryLogin_AccountIDMismatchWarning(t *testing.T) {
688688 assert .Contains (t , logBuf .String (), "new-account-id" )
689689 assert .Contains (t , logBuf .String (), "old-account-id" )
690690
691- // Verify the profile was saved without account_id (not overwritten) .
691+ // Account ID from introspection is now saved to the profile .
692692 savedProfile , err := loadProfileByName (ctx , "DISCOVERY" , profile .DefaultProfiler )
693693 require .NoError (t , err )
694694 require .NotNil (t , savedProfile )
695695 assert .Equal (t , "https://workspace.example.com" , savedProfile .Host )
696+ assert .Equal (t , "new-account-id" , savedProfile .AccountID )
696697 assert .Equal (t , "12345" , savedProfile .WorkspaceID )
697698}
698699
@@ -826,6 +827,83 @@ func TestDiscoveryLogin_ExplicitScopesOverrideExistingProfile(t *testing.T) {
826827 assert .Equal (t , "all-apis" , savedProfile .Scopes )
827828}
828829
830+ func TestDiscoveryLogin_SPOGHostPopulatesAccountIDFromDiscovery (t * testing.T ) {
831+ // Start a mock server that returns SPOG discovery metadata.
832+ server := newDiscoveryServer (t , map [string ]any {
833+ "account_id" : "discovered-account" ,
834+ "workspace_id" : "discovered-ws" ,
835+ "oidc_endpoint" : "https://spog.example.com/oidc/accounts/discovered-account" ,
836+ })
837+
838+ tmpDir := t .TempDir ()
839+ configPath := filepath .Join (tmpDir , ".databrickscfg" )
840+ err := os .WriteFile (configPath , []byte ("" ), 0o600 )
841+ require .NoError (t , err )
842+ t .Setenv ("DATABRICKS_CONFIG_FILE" , configPath )
843+
844+ oauthArg , err := u2m .NewBasicDiscoveryOAuthArgument ("DISCOVERY" )
845+ require .NoError (t , err )
846+ oauthArg .SetDiscoveredHost (server .URL )
847+
848+ dc := & fakeDiscoveryClient {
849+ oauthArg : oauthArg ,
850+ persistentAuth : & fakeDiscoveryPersistentAuth {
851+ token : & oauth2.Token {AccessToken : "test-token" },
852+ },
853+ // Introspection returns different values to verify discovery takes precedence.
854+ introspection : & auth.IntrospectionResult {
855+ AccountID : "introspection-account" ,
856+ WorkspaceID : "introspection-ws" ,
857+ },
858+ }
859+
860+ ctx , _ := cmdio .NewTestContextWithStdout (t .Context ())
861+ err = discoveryLogin (ctx , dc , "DISCOVERY" , time .Second , "" , nil , func (string ) error { return nil })
862+ require .NoError (t , err )
863+
864+ savedProfile , err := loadProfileByName (ctx , "DISCOVERY" , profile .DefaultProfiler )
865+ require .NoError (t , err )
866+ require .NotNil (t , savedProfile )
867+ assert .Equal (t , server .URL , savedProfile .Host )
868+ assert .Equal (t , "discovered-account" , savedProfile .AccountID , "account_id should come from host discovery" )
869+ assert .Equal (t , "discovered-ws" , savedProfile .WorkspaceID , "workspace_id should come from host discovery" )
870+ }
871+
872+ func TestDiscoveryLogin_IntrospectionFallsBackWhenDiscoveryFails (t * testing.T ) {
873+ tmpDir := t .TempDir ()
874+ configPath := filepath .Join (tmpDir , ".databrickscfg" )
875+ err := os .WriteFile (configPath , []byte ("" ), 0o600 )
876+ require .NoError (t , err )
877+ t .Setenv ("DATABRICKS_CONFIG_FILE" , configPath )
878+
879+ // Use a host that won't respond to .well-known/databricks-config.
880+ oauthArg , err := u2m .NewBasicDiscoveryOAuthArgument ("DISCOVERY" )
881+ require .NoError (t , err )
882+ oauthArg .SetDiscoveredHost ("https://workspace.example.com" )
883+
884+ dc := & fakeDiscoveryClient {
885+ oauthArg : oauthArg ,
886+ persistentAuth : & fakeDiscoveryPersistentAuth {
887+ token : & oauth2.Token {AccessToken : "test-token" },
888+ },
889+ introspection : & auth.IntrospectionResult {
890+ AccountID : "introspection-account" ,
891+ WorkspaceID : "introspection-ws" ,
892+ },
893+ }
894+
895+ ctx , _ := cmdio .NewTestContextWithStdout (t .Context ())
896+ err = discoveryLogin (ctx , dc , "DISCOVERY" , time .Second , "" , nil , func (string ) error { return nil })
897+ require .NoError (t , err )
898+
899+ savedProfile , err := loadProfileByName (ctx , "DISCOVERY" , profile .DefaultProfiler )
900+ require .NoError (t , err )
901+ require .NotNil (t , savedProfile )
902+ assert .Equal (t , "https://workspace.example.com" , savedProfile .Host )
903+ assert .Equal (t , "introspection-account" , savedProfile .AccountID , "account_id should fall back to introspection" )
904+ assert .Equal (t , "introspection-ws" , savedProfile .WorkspaceID , "workspace_id should fall back to introspection" )
905+ }
906+
829907func TestDiscoveryLogin_ClearsStaleRoutingFieldsFromUnifiedProfile (t * testing.T ) {
830908 tmpDir := t .TempDir ()
831909 configPath := filepath .Join (tmpDir , ".databrickscfg" )
@@ -921,5 +999,6 @@ auth_type = databricks-cli
921999 require .NoError (t , err )
9221000 require .NotNil (t , savedProfile )
9231001 assert .Equal (t , "https://new-workspace.example.com" , savedProfile .Host )
1002+ assert .Equal (t , "fresh-account" , savedProfile .AccountID , "account_id should be saved from introspection" )
9241003 assert .Equal (t , "222222" , savedProfile .WorkspaceID , "workspace_id should be updated to fresh introspection value" )
9251004}
0 commit comments