Files
ai_english/serve/internal/models/user_test.go
2025-11-17 13:39:05 +08:00

314 lines
6.8 KiB
Go

package models
import (
"testing"
"time"
)
// TestUser tests the User model
func TestUser(t *testing.T) {
t.Run("Create User", func(t *testing.T) {
user := &User{
Username: "testuser",
Email: "test@example.com",
PasswordHash: "hashedpassword",
Status: "active",
Timezone: "Asia/Shanghai",
Language: "zh-CN",
}
if user.Username != "testuser" {
t.Errorf("Expected username 'testuser', got '%s'", user.Username)
}
if user.Email != "test@example.com" {
t.Errorf("Expected email 'test@example.com', got '%s'", user.Email)
}
if user.Status != "active" {
t.Errorf("Expected status 'active', got '%s'", user.Status)
}
})
t.Run("User Validation", func(t *testing.T) {
tests := []struct {
name string
user User
expected bool
}{
{
name: "Valid User",
user: User{
Username: "validuser",
Email: "valid@example.com",
PasswordHash: "validpassword",
Status: "active",
},
expected: true,
},
{
name: "Empty Username",
user: User{
Username: "",
Email: "valid@example.com",
PasswordHash: "validpassword",
},
expected: false,
},
{
name: "Empty Email",
user: User{
Username: "validuser",
Email: "",
PasswordHash: "validpassword",
},
expected: false,
},
{
name: "Empty Password",
user: User{
Username: "validuser",
Email: "valid@example.com",
PasswordHash: "",
},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
isValid := validateUser(tt.user)
if isValid != tt.expected {
t.Errorf("Expected %v, got %v", tt.expected, isValid)
}
})
}
})
t.Run("User Timestamps", func(t *testing.T) {
user := &User{
Username: "testuser",
Email: "test@example.com",
PasswordHash: "hashedpassword",
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
if user.CreatedAt.IsZero() {
t.Error("CreatedAt should not be zero")
}
if user.UpdatedAt.IsZero() {
t.Error("UpdatedAt should not be zero")
}
})
}
// validateUser is a helper function for testing user validation
func validateUser(user User) bool {
if user.Username == "" {
return false
}
if user.Email == "" {
return false
}
if user.PasswordHash == "" {
return false
}
return true
}
// TestUserPreference tests the UserPreference model
func TestUserPreference(t *testing.T) {
t.Run("Create UserPreference", func(t *testing.T) {
preference := &UserPreference{
UserID: 1,
DailyGoal: 50,
WeeklyGoal: 350,
ReminderEnabled: true,
DifficultyLevel: "beginner",
LearningMode: "casual",
}
if preference.UserID != 1 {
t.Errorf("Expected UserID 1, got %d", preference.UserID)
}
if preference.DailyGoal != 50 {
t.Errorf("Expected DailyGoal 50, got %d", preference.DailyGoal)
}
if preference.DifficultyLevel != "beginner" {
t.Errorf("Expected DifficultyLevel 'beginner', got '%s'", preference.DifficultyLevel)
}
})
t.Run("Preference Validation", func(t *testing.T) {
tests := []struct {
name string
preference UserPreference
expected bool
}{
{
name: "Valid Preference",
preference: UserPreference{
UserID: 1,
DailyGoal: 50,
WeeklyGoal: 350,
DifficultyLevel: "beginner",
LearningMode: "casual",
},
expected: true,
},
{
name: "Invalid UserID",
preference: UserPreference{
UserID: 0,
DailyGoal: 50,
DifficultyLevel: "beginner",
},
expected: false,
},
{
name: "Negative Daily Goal",
preference: UserPreference{
UserID: 1,
DailyGoal: -10,
DifficultyLevel: "beginner",
},
expected: false,
},
{
name: "Invalid Difficulty Level",
preference: UserPreference{
UserID: 1,
DailyGoal: 50,
DifficultyLevel: "invalid",
},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
isValid := validateUserPreference(tt.preference)
if isValid != tt.expected {
t.Errorf("Expected %v, got %v", tt.expected, isValid)
}
})
}
})
}
// validateUserPreference is a helper function for testing user preference validation
func validateUserPreference(preference UserPreference) bool {
if preference.UserID <= 0 {
return false
}
if preference.DailyGoal < 0 || preference.WeeklyGoal < 0 {
return false
}
validDifficultyLevels := []string{"beginner", "intermediate", "advanced"}
validDifficulty := false
for _, level := range validDifficultyLevels {
if preference.DifficultyLevel == level {
validDifficulty = true
break
}
}
if !validDifficulty {
return false
}
return true
}
// TestUserSocialLink tests the UserSocialLink model
func TestUserSocialLink(t *testing.T) {
t.Run("Create UserSocialLink", func(t *testing.T) {
socialLink := &UserSocialLink{
UserID: 1,
Platform: "github",
URL: "https://github.com/testuser",
}
if socialLink.UserID != 1 {
t.Errorf("Expected UserID 1, got %d", socialLink.UserID)
}
if socialLink.Platform != "github" {
t.Errorf("Expected Platform 'github', got '%s'", socialLink.Platform)
}
if socialLink.URL != "https://github.com/testuser" {
t.Errorf("Expected URL 'https://github.com/testuser', got '%s'", socialLink.URL)
}
})
t.Run("Social Link Validation", func(t *testing.T) {
tests := []struct {
name string
socialLink UserSocialLink
expected bool
}{
{
name: "Valid Social Link",
socialLink: UserSocialLink{
UserID: 1,
Platform: "github",
URL: "https://github.com/testuser",
},
expected: true,
},
{
name: "Invalid UserID",
socialLink: UserSocialLink{
UserID: 0,
Platform: "github",
URL: "https://github.com/testuser",
},
expected: false,
},
{
name: "Empty Platform",
socialLink: UserSocialLink{
UserID: 1,
Platform: "",
URL: "https://github.com/testuser",
},
expected: false,
},
{
name: "Empty URL",
socialLink: UserSocialLink{
UserID: 1,
Platform: "github",
URL: "",
},
expected: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
isValid := validateUserSocialLink(tt.socialLink)
if isValid != tt.expected {
t.Errorf("Expected %v, got %v", tt.expected, isValid)
}
})
}
})
}
// validateUserSocialLink is a helper function for testing user social link validation
func validateUserSocialLink(socialLink UserSocialLink) bool {
if socialLink.UserID <= 0 {
return false
}
if socialLink.Platform == "" {
return false
}
if socialLink.URL == "" {
return false
}
return true
}