Files
user-system/internal/service/export_internal_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

187 lines
5.3 KiB
Go

package service
import (
"context"
"testing"
"github.com/user-management-system/internal/domain"
"github.com/user-management-system/internal/repository"
gormsqlite "gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
// =============================================================================
// Export Internal Functions Tests
// =============================================================================
func setupExportInternalTestEnv(t *testing.T) (*ExportService, *gorm.DB) {
t.Helper()
db, err := gorm.Open(gormsqlite.New(gormsqlite.Config{
DriverName: "sqlite",
DSN: "file:export_internal_test?mode=memory&cache=shared",
}), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("failed to connect database: %v", err)
}
if err := db.AutoMigrate(&domain.User{}); err != nil {
t.Fatalf("failed to migrate: %v", err)
}
userRepo := repository.NewUserRepository(db)
svc := NewExportService(userRepo, nil)
return svc, db
}
func TestListUsersForExport(t *testing.T) {
svc, db := setupExportInternalTestEnv(t)
ctx := context.Background()
// Create test users with various fields
email := "list@test.com"
phone := "13900139000"
users := []*domain.User{
{Username: "listuser1", Password: "$2a$10$hash", Status: domain.UserStatusActive, Email: &email, Phone: &phone, Nickname: "List User 1"},
{Username: "listuser2", Password: "$2a$10$hash", Status: domain.UserStatusInactive},
{Username: "listuser3", Password: "$2a$10$hash", Status: domain.UserStatusLocked},
}
for _, u := range users {
db.Create(u)
}
t.Run("List users for export with empty request", func(t *testing.T) {
req := &ExportUsersRequest{}
result, err := svc.listUsersForExport(ctx, req)
if err != nil {
t.Fatalf("listUsersForExport failed: %v", err)
}
if len(result) < 3 {
t.Errorf("Expected at least 3 users, got %d", len(result))
}
})
t.Run("List users with filter request", func(t *testing.T) {
status := int(domain.UserStatusActive)
req := &ExportUsersRequest{
Status: &status,
}
result, err := svc.listUsersForExport(ctx, req)
if err != nil {
t.Fatalf("listUsersForExport failed: %v", err)
}
if len(result) < 1 {
t.Error("Expected at least 1 active user")
}
})
t.Run("List users with keyword", func(t *testing.T) {
req := &ExportUsersRequest{
Keyword: "listuser",
}
result, err := svc.listUsersForExport(ctx, req)
if err != nil {
t.Fatalf("listUsersForExport failed: %v", err)
}
if len(result) < 1 {
t.Error("Expected at least 1 user matching keyword")
}
})
}
func TestImportUsersRecords(t *testing.T) {
svc, db := setupExportInternalTestEnv(t)
ctx := context.Background()
t.Run("Import records with empty data", func(t *testing.T) {
successCount, failCount, _ := svc.importUsersRecords(ctx, [][]string{})
if successCount != 0 || failCount != 0 {
t.Errorf("Expected (0, 0), got (%d, %d)", successCount, failCount)
}
})
t.Run("Import records with only header", func(t *testing.T) {
records := [][]string{{"用户名", "密码"}}
successCount, failCount, _ := svc.importUsersRecords(ctx, records)
if successCount != 0 {
t.Errorf("Expected 0 success, got %d", successCount)
}
_ = failCount
})
t.Run("Import records with valid data", func(t *testing.T) {
records := [][]string{
{"用户名", "密码", "邮箱", "手机号"},
{"importuser1", "Password123!", "import1@test.com", "13800138001"},
{"importuser2", "Password123!", "import2@test.com", "13800138002"},
}
successCount, failCount, errs := svc.importUsersRecords(ctx, records)
if successCount != 2 {
t.Errorf("Expected 2 success, got %d, errors: %v", successCount, errs)
}
_ = failCount
})
t.Run("Import records with missing username", func(t *testing.T) {
records := [][]string{
{"用户名", "密码"},
{"", "Password123!"},
}
successCount, failCount, errs := svc.importUsersRecords(ctx, records)
if successCount != 0 {
t.Errorf("Expected 0 success, got %d", successCount)
}
if failCount == 0 {
t.Error("Expected at least one failure")
}
if len(errs) == 0 {
t.Error("Expected error message")
}
})
t.Run("Import records with missing password", func(t *testing.T) {
records := [][]string{
{"用户名", "密码"},
{"nopwduser", ""},
}
successCount, failCount, errs := svc.importUsersRecords(ctx, records)
if successCount != 0 {
t.Errorf("Expected 0 success, got %d", successCount)
}
if failCount == 0 {
t.Error("Expected at least one failure")
}
_ = errs
})
t.Run("Import records with duplicate username", func(t *testing.T) {
// Create existing user
db.Create(&domain.User{Username: "duplicateuser", Password: "$2a$10$hash", Status: domain.UserStatusActive})
records := [][]string{
{"用户名", "密码"},
{"duplicateuser", "Password123!"},
}
successCount, failCount, _ := svc.importUsersRecords(ctx, records)
if successCount != 0 {
t.Errorf("Expected 0 success for duplicate, got %d", successCount)
}
if failCount == 0 {
t.Error("Expected failure for duplicate username")
}
})
}
func TestParseXLSXRecords(t *testing.T) {
t.Run("Parse invalid XLSX data", func(t *testing.T) {
_, err := parseXLSXRecords([]byte("not a valid xlsx"))
if err == nil {
t.Error("Expected error for invalid XLSX data")
}
})
}