temp
This commit is contained in:
338
internal/domains/user/entities/user_test.go
Normal file
338
internal/domains/user/entities/user_test.go
Normal file
@@ -0,0 +1,338 @@
|
||||
package entities
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestUser_ChangePassword(t *testing.T) {
|
||||
// 创建测试用户
|
||||
user, err := NewUser("13800138000", "OldPassword123!")
|
||||
if err != nil {
|
||||
t.Fatalf("创建用户失败: %v", err)
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
oldPassword string
|
||||
newPassword string
|
||||
confirmPassword string
|
||||
wantErr bool
|
||||
errorContains string
|
||||
}{
|
||||
{
|
||||
name: "正常修改密码",
|
||||
oldPassword: "OldPassword123!",
|
||||
newPassword: "NewPassword123!",
|
||||
confirmPassword: "NewPassword123!",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "旧密码错误",
|
||||
oldPassword: "WrongPassword123!",
|
||||
newPassword: "NewPassword123!",
|
||||
confirmPassword: "NewPassword123!",
|
||||
wantErr: true,
|
||||
errorContains: "当前密码错误",
|
||||
},
|
||||
{
|
||||
name: "确认密码不匹配",
|
||||
oldPassword: "OldPassword123!",
|
||||
newPassword: "NewPassword123!",
|
||||
confirmPassword: "DifferentPassword123!",
|
||||
wantErr: true,
|
||||
errorContains: "新密码和确认新密码不匹配",
|
||||
},
|
||||
{
|
||||
name: "新密码与旧密码相同",
|
||||
oldPassword: "OldPassword123!",
|
||||
newPassword: "OldPassword123!",
|
||||
confirmPassword: "OldPassword123!",
|
||||
wantErr: true,
|
||||
errorContains: "新密码不能与当前密码相同",
|
||||
},
|
||||
{
|
||||
name: "新密码强度不足",
|
||||
oldPassword: "OldPassword123!",
|
||||
newPassword: "weak",
|
||||
confirmPassword: "weak",
|
||||
wantErr: true,
|
||||
errorContains: "密码长度至少8位",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
// 重置用户密码为初始状态
|
||||
user.SetPassword("OldPassword123!")
|
||||
|
||||
err := user.ChangePassword(tt.oldPassword, tt.newPassword, tt.confirmPassword)
|
||||
if tt.wantErr {
|
||||
if err == nil {
|
||||
t.Errorf("期望错误但没有得到错误")
|
||||
return
|
||||
}
|
||||
if tt.errorContains != "" && !contains(err.Error(), tt.errorContains) {
|
||||
t.Errorf("错误信息不包含期望的内容,期望包含: %s, 实际: %s", tt.errorContains, err.Error())
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Errorf("不期望错误但得到了错误: %v", err)
|
||||
}
|
||||
// 验证密码确实被修改了
|
||||
if !user.CheckPassword(tt.newPassword) {
|
||||
t.Errorf("密码修改后验证失败")
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_CheckPassword(t *testing.T) {
|
||||
user, err := NewUser("13800138000", "TestPassword123!")
|
||||
if err != nil {
|
||||
t.Fatalf("创建用户失败: %v", err)
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
password string
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "正确密码",
|
||||
password: "TestPassword123!",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "错误密码",
|
||||
password: "WrongPassword123!",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "空密码",
|
||||
password: "",
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := user.CheckPassword(tt.password)
|
||||
if got != tt.want {
|
||||
t.Errorf("CheckPassword() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_SetPhone(t *testing.T) {
|
||||
user := &User{}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
phone string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "有效手机号",
|
||||
phone: "13800138000",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-太短",
|
||||
phone: "1380013800",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-太长",
|
||||
phone: "138001380000",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-格式错误",
|
||||
phone: "1380013800a",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-不以1开头",
|
||||
phone: "23800138000",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := user.SetPhone(tt.phone)
|
||||
if tt.wantErr {
|
||||
if err == nil {
|
||||
t.Errorf("期望错误但没有得到错误")
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Errorf("不期望错误但得到了错误: %v", err)
|
||||
}
|
||||
if user.Phone != tt.phone {
|
||||
t.Errorf("手机号设置失败,期望: %s, 实际: %s", tt.phone, user.Phone)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestUser_GetMaskedPhone(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
phone string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "正常手机号",
|
||||
phone: "13800138000",
|
||||
expected: "138****8000",
|
||||
},
|
||||
{
|
||||
name: "短手机号",
|
||||
phone: "138001",
|
||||
expected: "138001",
|
||||
},
|
||||
{
|
||||
name: "空手机号",
|
||||
phone: "",
|
||||
expected: "",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
user := &User{Phone: tt.phone}
|
||||
got := user.GetMaskedPhone()
|
||||
if got != tt.expected {
|
||||
t.Errorf("GetMaskedPhone() = %v, want %v", got, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsValidPhoneFormat(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
phone string
|
||||
want bool
|
||||
}{
|
||||
{
|
||||
name: "有效手机号-13开头",
|
||||
phone: "13800138000",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "有效手机号-15开头",
|
||||
phone: "15800138000",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "有效手机号-18开头",
|
||||
phone: "18800138000",
|
||||
want: true,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-12开头",
|
||||
phone: "12800138000",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-20开头",
|
||||
phone: "20800138000",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-太短",
|
||||
phone: "1380013800",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-太长",
|
||||
phone: "138001380000",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号-包含字母",
|
||||
phone: "1380013800a",
|
||||
want: false,
|
||||
},
|
||||
{
|
||||
name: "空手机号",
|
||||
phone: "",
|
||||
want: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := IsValidPhoneFormat(tt.phone)
|
||||
if got != tt.want {
|
||||
t.Errorf("IsValidPhoneFormat() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNewUser(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
phone string
|
||||
password string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "有效用户信息",
|
||||
phone: "13800138000",
|
||||
password: "TestPassword123!",
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "无效手机号",
|
||||
phone: "1380013800",
|
||||
password: "TestPassword123!",
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "无效密码",
|
||||
phone: "13800138000",
|
||||
password: "weak",
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
user, err := NewUser(tt.phone, tt.password)
|
||||
if tt.wantErr {
|
||||
if err == nil {
|
||||
t.Errorf("期望错误但没有得到错误")
|
||||
}
|
||||
} else {
|
||||
if err != nil {
|
||||
t.Errorf("不期望错误但得到了错误: %v", err)
|
||||
}
|
||||
if user.Phone != tt.phone {
|
||||
t.Errorf("手机号设置失败,期望: %s, 实际: %s", tt.phone, user.Phone)
|
||||
}
|
||||
if !user.CheckPassword(tt.password) {
|
||||
t.Errorf("密码设置失败")
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 辅助函数
|
||||
func contains(s, substr string) bool {
|
||||
return len(s) >= len(substr) && (s == substr || (len(s) > len(substr) && (s[:len(substr)] == substr || s[len(s)-len(substr):] == substr || func() bool {
|
||||
for i := 1; i <= len(s)-len(substr); i++ {
|
||||
if s[i:i+len(substr)] == substr {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}())))
|
||||
}
|
||||
Reference in New Issue
Block a user