339 lines
7.0 KiB
Go
339 lines
7.0 KiB
Go
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
|
|
}())))
|
|
}
|