mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-30 22:26:38 +08:00
100 lines
2.9 KiB
Go
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
|
|
}
|