Files
OpenFlare/openflare_server/service/auth_source_test.go
T
2026-05-13 11:44:01 +08:00

100 lines
2.9 KiB
Go

package service
import (
"testing"
"openflare/common"
"openflare/model"
)
func TestCompleteOAuthLoginRequiresLinkWhenRegistrationDisabled(t *testing.T) {
setupServiceTestDB(t)
previousRegisterEnabled := common.RegisterEnabled
common.RegisterEnabled = false
t.Cleanup(func() {
common.RegisterEnabled = previousRegisterEnabled
})
source := createTestAuthSource(t)
result, pending, err := CompleteOAuthLogin(source, &OAuthProfile{
ExternalID: "external-1",
ExternalUsername: "external-user",
DisplayName: "External User",
Email: "external@example.com",
}, nil)
if err != nil {
t.Fatalf("CompleteOAuthLogin failed: %v", err)
}
if result.Status != "link_required" || pending == nil {
t.Fatalf("expected link_required with pending account, got %#v pending=%#v", result, pending)
}
user, err := LinkPendingExternalAccount(pending, LinkExistingRequest{
Username: "root",
Password: "123456",
})
if err != nil {
t.Fatalf("LinkPendingExternalAccount failed: %v", err)
}
if user.Username != "root" {
t.Fatalf("expected root user, got %s", user.Username)
}
account, err := model.FindExternalAccount(source.ID, "external-1")
if err != nil {
t.Fatalf("expected external account to be linked: %v", err)
}
if account.UserID != user.Id {
t.Fatalf("expected external account user %d, got %d", user.Id, account.UserID)
}
}
func TestCompleteOAuthLoginAutoRegistersWhenEnabled(t *testing.T) {
setupServiceTestDB(t)
previousRegisterEnabled := common.RegisterEnabled
common.RegisterEnabled = true
t.Cleanup(func() {
common.RegisterEnabled = previousRegisterEnabled
})
source := createTestAuthSource(t)
result, pending, err := CompleteOAuthLogin(source, &OAuthProfile{
ExternalID: "external-2",
ExternalUsername: "oidc-user",
DisplayName: "OIDC User",
Email: "oidc@example.com",
}, nil)
if err != nil {
t.Fatalf("CompleteOAuthLogin failed: %v", err)
}
if pending != nil {
t.Fatalf("expected no pending account when registration is enabled")
}
if result.Status != "registered" || result.User == nil {
t.Fatalf("expected registered user result, got %#v", result)
}
account, err := model.FindExternalAccount(source.ID, "external-2")
if err != nil {
t.Fatalf("expected external account to be linked: %v", err)
}
if account.UserID != result.User.Id {
t.Fatalf("expected external account user %d, got %d", result.User.Id, account.UserID)
}
}
func createTestAuthSource(t *testing.T) *model.AuthSource {
t.Helper()
source := &model.AuthSource{
Name: "Test OIDC",
Type: model.AuthSourceTypeOIDC,
DisplayName: "Test OIDC",
ClientID: "client-id",
ClientSecret: "client-secret",
Scopes: "openid profile email",
OpenIDDiscoveryURL: "https://idp.example.com/.well-known/openid-configuration",
}
if err := model.CreateAuthSource(source); err != nil {
t.Fatalf("CreateAuthSource failed: %v", err)
}
return source
}