Files
user-system/internal/repository/social_account_repository_test.go
long-agent 582ad7a069 test: add comprehensive test coverage and improve code quality
- Add new test files for auth, service, and handler modules
- Improve test organization and coverage
- Refactor code for better maintainability
- Add captcha, settings, stats, and theme handler tests
- Add auth module tests (CAS, OAuth, password, SSO, state)
- Add service layer tests for auth, export, permissions, roles
- All Go tests pass (exit code 0)
- All frontend tests pass (325 tests in 59 files)
2026-04-17 20:43:50 +08:00

264 lines
6.4 KiB
Go

package repository
import (
"context"
"fmt"
"sync/atomic"
"testing"
gormsqlite "gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
_ "modernc.org/sqlite"
"github.com/user-management-system/internal/domain"
)
var socialAccountTestCounter int64
func openSocialAccountTestDB(t *testing.T) *gorm.DB {
t.Helper()
id := atomic.AddInt64(&socialAccountTestCounter, 1)
dsn := fmt.Sprintf("file:socialaccounttestdb%d?mode=memory&cache=private", id)
db, err := gorm.Open(gormsqlite.New(gormsqlite.Config{
DriverName: "sqlite",
DSN: dsn,
}), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("打开测试数据库失败: %v", err)
}
if err := db.AutoMigrate(&domain.SocialAccount{}); err != nil {
t.Fatalf("数据库迁移失败: %v", err)
}
return db
}
func setupSocialAccountTestDB(t *testing.T) *gorm.DB {
return openSocialAccountTestDB(t)
}
func TestSocialAccountRepository_Create(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
account := &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-123",
Nickname: "testuser",
Status: domain.SocialAccountStatusActive,
}
if err := repo.Create(ctx, account); err != nil {
t.Fatalf("Create() error = %v", err)
}
if account.ID == 0 {
t.Error("创建后账户ID不应为0")
}
}
func TestSocialAccountRepository_GetByID(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
account := &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-getbyid",
Nickname: "getbyid-user",
Status: domain.SocialAccountStatusActive,
}
repo.Create(ctx, account)
found, err := repo.GetByID(ctx, account.ID)
if err != nil {
t.Fatalf("GetByID() error = %v", err)
}
if found.Nickname != "getbyid-user" {
t.Errorf("Nickname = %v, want getbyid-user", found.Nickname)
}
}
func TestSocialAccountRepository_GetByUserID(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
repo.Create(ctx, &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-user1-1",
Status: domain.SocialAccountStatusActive,
})
repo.Create(ctx, &domain.SocialAccount{
UserID: 1,
Provider: "wechat",
OpenID: "openid-user1-2",
Status: domain.SocialAccountStatusActive,
})
repo.Create(ctx, &domain.SocialAccount{
UserID: 2,
Provider: "github",
OpenID: "openid-user2",
Status: domain.SocialAccountStatusActive,
})
accounts, err := repo.GetByUserID(ctx, 1)
if err != nil {
t.Fatalf("GetByUserID() error = %v", err)
}
if len(accounts) != 2 {
t.Errorf("len(accounts) = %d, want 2", len(accounts))
}
}
func TestSocialAccountRepository_GetByProviderAndOpenID(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
account := &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "unique-openid-123",
Nickname: "github-user",
Status: domain.SocialAccountStatusActive,
}
repo.Create(ctx, account)
found, err := repo.GetByProviderAndOpenID(ctx, "github", "unique-openid-123")
if err != nil {
t.Fatalf("GetByProviderAndOpenID() error = %v", err)
}
if found.UserID != 1 {
t.Errorf("UserID = %d, want 1", found.UserID)
}
}
func TestSocialAccountRepository_Update(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
account := &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-update",
Nickname: "before-update",
Status: domain.SocialAccountStatusActive,
}
repo.Create(ctx, account)
account.Nickname = "after-update"
if err := repo.Update(ctx, account); err != nil {
t.Fatalf("Update() error = %v", err)
}
found, _ := repo.GetByID(ctx, account.ID)
if found.Nickname != "after-update" {
t.Errorf("Nickname = %v, want after-update", found.Nickname)
}
}
func TestSocialAccountRepository_Delete(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
account := &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-delete",
Status: domain.SocialAccountStatusActive,
}
repo.Create(ctx, account)
if err := repo.Delete(ctx, account.ID); err != nil {
t.Fatalf("Delete() error = %v", err)
}
}
func TestSocialAccountRepository_DeleteByProviderAndUserID(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
repo.Create(ctx, &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-del-provider",
Status: domain.SocialAccountStatusActive,
})
err = repo.DeleteByProviderAndUserID(ctx, "github", 1)
if err != nil {
t.Fatalf("DeleteByProviderAndUserID() error = %v", err)
}
accounts, _ := repo.GetByUserID(ctx, 1)
if len(accounts) != 0 {
t.Errorf("len(accounts) = %d, want 0 after delete", len(accounts))
}
}
func TestSocialAccountRepository_List(t *testing.T) {
db := setupSocialAccountTestDB(t)
repo, err := NewSocialAccountRepository(db)
if err != nil {
t.Fatalf("NewSocialAccountRepository() error = %v", err)
}
ctx := context.Background()
repo.Create(ctx, &domain.SocialAccount{
UserID: 1,
Provider: "github",
OpenID: "openid-list-1",
Status: domain.SocialAccountStatusActive,
})
repo.Create(ctx, &domain.SocialAccount{
UserID: 2,
Provider: "wechat",
OpenID: "openid-list-2",
Status: domain.SocialAccountStatusActive,
})
accounts, total, err := repo.List(ctx, 0, 10)
if err != nil {
t.Fatalf("List() error = %v", err)
}
if len(accounts) != 2 {
t.Errorf("len(accounts) = %d, want 2", len(accounts))
}
if total != 2 {
t.Errorf("total = %d, want 2", total)
}
}