Files
backend/pkg/auth/password_test.go

146 lines
3.3 KiB
Go
Raw Permalink Normal View History

package auth
import (
"testing"
)
// TestHashPassword 测试密码加密
func TestHashPassword(t *testing.T) {
tests := []struct {
name string
password string
wantError bool
}{
{
name: "正常密码",
password: "testpassword123",
wantError: false,
},
{
name: "空密码",
password: "",
wantError: false, // bcrypt允许空密码
},
{
name: "长密码",
password: "thisisaverylongpasswordthatexceedsnormallength",
wantError: false,
},
{
name: "包含特殊字符的密码",
password: "P@ssw0rd!#$%",
wantError: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
hashed, err := HashPassword(tt.password)
if (err != nil) != tt.wantError {
t.Errorf("HashPassword() error = %v, wantError %v", err, tt.wantError)
return
}
if !tt.wantError {
// 验证哈希值不为空
if hashed == "" {
t.Error("HashPassword() 返回的哈希值不应为空")
}
// 验证哈希值与原密码不同
if hashed == tt.password {
t.Error("HashPassword() 返回的哈希值不应与原密码相同")
}
// 验证哈希值长度合理bcrypt哈希通常是60个字符
if len(hashed) < 50 {
t.Errorf("HashPassword() 返回的哈希值长度异常: %d", len(hashed))
}
}
})
}
}
// TestCheckPassword 测试密码验证
func TestCheckPassword(t *testing.T) {
// 先加密一个密码
password := "testpassword123"
hashed, err := HashPassword(password)
if err != nil {
t.Fatalf("HashPassword() 失败: %v", err)
}
tests := []struct {
name string
hashedPassword string
password string
wantMatch bool
}{
{
name: "密码匹配",
hashedPassword: hashed,
password: password,
wantMatch: true,
},
{
name: "密码不匹配",
hashedPassword: hashed,
password: "wrongpassword",
wantMatch: false,
},
{
name: "空密码与空哈希",
hashedPassword: "",
password: "",
wantMatch: false, // 空哈希无法验证
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := CheckPassword(tt.hashedPassword, tt.password)
if result != tt.wantMatch {
t.Errorf("CheckPassword() = %v, want %v", result, tt.wantMatch)
}
})
}
}
// TestHashPassword_Uniqueness 测试每次加密结果不同
func TestHashPassword_Uniqueness(t *testing.T) {
password := "testpassword123"
// 多次加密同一密码
hashes := make(map[string]bool)
for i := 0; i < 10; i++ {
hashed, err := HashPassword(password)
if err != nil {
t.Fatalf("HashPassword() 失败: %v", err)
}
// 验证每次加密的结果都不同由于salt
if hashes[hashed] {
t.Errorf("第%d次加密的结果与之前重复", i+1)
}
hashes[hashed] = true
// 但都能验证通过
if !CheckPassword(hashed, password) {
t.Errorf("第%d次加密的哈希无法验证原密码", i+1)
}
}
}
// TestCheckPassword_Consistency 测试密码验证的一致性
func TestCheckPassword_Consistency(t *testing.T) {
password := "testpassword123"
hashed, err := HashPassword(password)
if err != nil {
t.Fatalf("HashPassword() 失败: %v", err)
}
// 多次验证应该结果一致
for i := 0; i < 10; i++ {
if !CheckPassword(hashed, password) {
t.Errorf("第%d次验证失败", i+1)
}
}
}