diff --git a/backend/ent/schema/auth_identity_schema_test.go b/backend/ent/schema/auth_identity_schema_test.go index fbb93236..d3e24050 100644 --- a/backend/ent/schema/auth_identity_schema_test.go +++ b/backend/ent/schema/auth_identity_schema_test.go @@ -83,10 +83,10 @@ func TestAuthIdentityFoundationSchemas(t *testing.T) { require.Equal(t, 1, signupSource.Validators) validator := requireStringFieldValidator(t, User{}.Fields(), "signup_source") - for _, value := range []string{"email", "linuxdo", "wechat", "oidc"} { + for _, value := range []string{"email", "linuxdo", "wechat", "oidc", "github", "google"} { require.NoError(t, validator(value)) } - require.Error(t, validator("github")) + require.Error(t, validator("unknown")) } func requireSchema(t *testing.T, schemas map[string]*load.Schema, name string) *load.Schema { diff --git a/backend/internal/server/api_contract_test.go b/backend/internal/server/api_contract_test.go index 34f560fc..84259050 100644 --- a/backend/internal/server/api_contract_test.go +++ b/backend/internal/server/api_contract_test.go @@ -685,6 +685,16 @@ func TestAPIContracts(t *testing.T) { "oidc_connect_userinfo_email_path": "", "oidc_connect_userinfo_id_path": "", "oidc_connect_userinfo_username_path": "", + "github_oauth_enabled": false, + "github_oauth_client_id": "", + "github_oauth_client_secret_configured": false, + "github_oauth_redirect_url": "", + "github_oauth_frontend_redirect_url": "/auth/oauth/callback", + "google_oauth_enabled": false, + "google_oauth_client_id": "", + "google_oauth_client_secret_configured": false, + "google_oauth_redirect_url": "", + "google_oauth_frontend_redirect_url": "/auth/oauth/callback", "ops_monitoring_enabled": false, "ops_realtime_monitoring_enabled": true, "ops_query_mode_default": "auto", @@ -700,6 +710,16 @@ func TestAPIContracts(t *testing.T) { "auth_source_default_email_subscriptions": [], "auth_source_default_email_grant_on_signup": false, "auth_source_default_email_grant_on_first_bind": false, + "auth_source_default_github_balance": 0, + "auth_source_default_github_concurrency": 5, + "auth_source_default_github_subscriptions": [], + "auth_source_default_github_grant_on_signup": false, + "auth_source_default_github_grant_on_first_bind": false, + "auth_source_default_google_balance": 0, + "auth_source_default_google_concurrency": 5, + "auth_source_default_google_subscriptions": [], + "auth_source_default_google_grant_on_signup": false, + "auth_source_default_google_grant_on_first_bind": false, "auth_source_default_linuxdo_balance": 0, "auth_source_default_linuxdo_concurrency": 5, "auth_source_default_linuxdo_subscriptions": [], @@ -898,6 +918,16 @@ func TestAPIContracts(t *testing.T) { "oidc_connect_userinfo_email_path": "", "oidc_connect_userinfo_id_path": "", "oidc_connect_userinfo_username_path": "", + "github_oauth_enabled": false, + "github_oauth_client_id": "", + "github_oauth_client_secret_configured": false, + "github_oauth_redirect_url": "", + "github_oauth_frontend_redirect_url": "/auth/oauth/callback", + "google_oauth_enabled": false, + "google_oauth_client_id": "", + "google_oauth_client_secret_configured": false, + "google_oauth_redirect_url": "", + "google_oauth_frontend_redirect_url": "/auth/oauth/callback", "site_name": "Sub2API", "site_logo": "", "site_subtitle": "Subscription to API Conversion Platform", @@ -1005,6 +1035,16 @@ func TestAPIContracts(t *testing.T) { "auth_source_default_email_subscriptions": [], "auth_source_default_email_grant_on_signup": false, "auth_source_default_email_grant_on_first_bind": false, + "auth_source_default_github_balance": 0, + "auth_source_default_github_concurrency": 5, + "auth_source_default_github_subscriptions": [], + "auth_source_default_github_grant_on_signup": false, + "auth_source_default_github_grant_on_first_bind": false, + "auth_source_default_google_balance": 0, + "auth_source_default_google_concurrency": 5, + "auth_source_default_google_subscriptions": [], + "auth_source_default_google_grant_on_signup": false, + "auth_source_default_google_grant_on_first_bind": false, "auth_source_default_linuxdo_balance": 0, "auth_source_default_linuxdo_concurrency": 5, "auth_source_default_linuxdo_subscriptions": [], diff --git a/backend/internal/service/auth_oauth_email_flow_test.go b/backend/internal/service/auth_oauth_email_flow_test.go index 21d9d6e9..cd76c6b7 100644 --- a/backend/internal/service/auth_oauth_email_flow_test.go +++ b/backend/internal/service/auth_oauth_email_flow_test.go @@ -229,6 +229,67 @@ func TestRegisterOAuthEmailAccountSetsNormalizedSignupSourceOnCreatedUser(t *tes require.Equal(t, "oidc", userRepo.created[0].SignupSource) } +func TestRegisterOAuthEmailAccountKeepsGitHubAndGoogleSignupSource(t *testing.T) { + tests := []struct { + name string + email string + signupSource string + want string + }{ + { + name: "github", + email: "github@example.com", + signupSource: " GitHub ", + want: "github", + }, + { + name: "google", + email: "google@example.com", + signupSource: " Google ", + want: "google", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + userRepo := &userRepoStub{nextID: 43} + emailCache := &emailCacheStub{ + data: &VerificationCodeData{ + Code: "246810", + Attempts: 0, + CreatedAt: time.Now().UTC(), + ExpiresAt: time.Now().UTC().Add(15 * time.Minute), + }, + } + authService := newOAuthEmailFlowAuthService( + userRepo, + &redeemCodeRepoStub{}, + &refreshTokenCacheStub{}, + map[string]string{ + SettingKeyRegistrationEnabled: "true", + SettingKeyEmailVerifyEnabled: "true", + }, + emailCache, + ) + + tokenPair, user, err := authService.RegisterOAuthEmailAccount( + context.Background(), + tt.email, + "secret-123", + "246810", + "", + tt.signupSource, + ) + + require.NoError(t, err) + require.NotNil(t, tokenPair) + require.NotNil(t, user) + require.Len(t, userRepo.created, 1) + require.Equal(t, tt.want, userRepo.created[0].SignupSource) + }) + } +} + func TestRegisterOAuthEmailAccountFallsBackUnknownSignupSourceToEmail(t *testing.T) { userRepo := &userRepoStub{nextID: 43} emailCache := &emailCacheStub{ @@ -256,7 +317,7 @@ func TestRegisterOAuthEmailAccountFallsBackUnknownSignupSourceToEmail(t *testing "secret-123", "246810", "", - "github", + "unknown-provider", ) require.NoError(t, err)