407 lines
9.0 KiB
Go
407 lines
9.0 KiB
Go
|
|
package service
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"testing"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// TestProfileService_Validation 测试Profile服务验证逻辑
|
|||
|
|
func TestProfileService_Validation(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
userID int64
|
|||
|
|
profileName string
|
|||
|
|
wantValid bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "有效的用户ID和角色名",
|
|||
|
|
userID: 1,
|
|||
|
|
profileName: "TestProfile",
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "用户ID为0时无效",
|
|||
|
|
userID: 0,
|
|||
|
|
profileName: "TestProfile",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "角色名为空时无效",
|
|||
|
|
userID: 1,
|
|||
|
|
profileName: "",
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
isValid := tt.userID > 0 && tt.profileName != ""
|
|||
|
|
if isValid != tt.wantValid {
|
|||
|
|
t.Errorf("Validation failed: got %v, want %v", isValid, tt.wantValid)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestProfileService_StatusValidation 测试用户状态验证
|
|||
|
|
func TestProfileService_StatusValidation(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
status int16
|
|||
|
|
wantValid bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "状态为1(正常)时有效",
|
|||
|
|
status: 1,
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "状态为0(禁用)时无效",
|
|||
|
|
status: 0,
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "状态为-1(删除)时无效",
|
|||
|
|
status: -1,
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
isValid := tt.status == 1
|
|||
|
|
if isValid != tt.wantValid {
|
|||
|
|
t.Errorf("Status validation failed: got %v, want %v", isValid, tt.wantValid)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestProfileService_IsActiveDefault 测试Profile默认活跃状态
|
|||
|
|
func TestProfileService_IsActiveDefault(t *testing.T) {
|
|||
|
|
// 新创建的档案默认为活跃状态
|
|||
|
|
isActive := true
|
|||
|
|
if !isActive {
|
|||
|
|
t.Error("新创建的Profile应该默认为活跃状态")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestUpdateProfile_PermissionCheck 测试更新Profile的权限检查逻辑
|
|||
|
|
func TestUpdateProfile_PermissionCheck(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
profileUserID int64
|
|||
|
|
requestUserID int64
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "用户ID匹配,允许操作",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 1,
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "用户ID不匹配,拒绝操作",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 2,
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
hasError := tt.profileUserID != tt.requestUserID
|
|||
|
|
if hasError != tt.wantErr {
|
|||
|
|
t.Errorf("Permission check failed: got %v, want %v", hasError, tt.wantErr)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestUpdateProfile_NameValidation 测试更新Profile时名称验证逻辑
|
|||
|
|
func TestUpdateProfile_NameValidation(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
currentName string
|
|||
|
|
newName *string
|
|||
|
|
shouldCheck bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "名称未改变,不检查",
|
|||
|
|
currentName: "TestProfile",
|
|||
|
|
newName: stringPtr("TestProfile"),
|
|||
|
|
shouldCheck: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "名称改变,需要检查",
|
|||
|
|
currentName: "TestProfile",
|
|||
|
|
newName: stringPtr("NewProfile"),
|
|||
|
|
shouldCheck: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "名称为nil,不检查",
|
|||
|
|
currentName: "TestProfile",
|
|||
|
|
newName: nil,
|
|||
|
|
shouldCheck: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
shouldCheck := tt.newName != nil && *tt.newName != tt.currentName
|
|||
|
|
if shouldCheck != tt.shouldCheck {
|
|||
|
|
t.Errorf("Name validation check failed: got %v, want %v", shouldCheck, tt.shouldCheck)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestDeleteProfile_PermissionCheck 测试删除Profile的权限检查
|
|||
|
|
func TestDeleteProfile_PermissionCheck(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
profileUserID int64
|
|||
|
|
requestUserID int64
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "用户ID匹配,允许删除",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 1,
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "用户ID不匹配,拒绝删除",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 2,
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
hasError := tt.profileUserID != tt.requestUserID
|
|||
|
|
if hasError != tt.wantErr {
|
|||
|
|
t.Errorf("Permission check failed: got %v, want %v", hasError, tt.wantErr)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestSetActiveProfile_PermissionCheck 测试设置活跃Profile的权限检查
|
|||
|
|
func TestSetActiveProfile_PermissionCheck(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
profileUserID int64
|
|||
|
|
requestUserID int64
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "用户ID匹配,允许设置",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 1,
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "用户ID不匹配,拒绝设置",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 2,
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
hasError := tt.profileUserID != tt.requestUserID
|
|||
|
|
if hasError != tt.wantErr {
|
|||
|
|
t.Errorf("Permission check failed: got %v, want %v", hasError, tt.wantErr)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestCheckProfileLimit_Logic 测试Profile数量限制检查逻辑
|
|||
|
|
func TestCheckProfileLimit_Logic(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
count int
|
|||
|
|
maxProfiles int
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "未达到上限",
|
|||
|
|
count: 5,
|
|||
|
|
maxProfiles: 10,
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "达到上限",
|
|||
|
|
count: 10,
|
|||
|
|
maxProfiles: 10,
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "超过上限",
|
|||
|
|
count: 15,
|
|||
|
|
maxProfiles: 10,
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
hasError := tt.count >= tt.maxProfiles
|
|||
|
|
if hasError != tt.wantErr {
|
|||
|
|
t.Errorf("Limit check failed: got %v, want %v", hasError, tt.wantErr)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestValidateProfileByUserID_InputValidation 测试ValidateProfileByUserID输入验证
|
|||
|
|
func TestValidateProfileByUserID_InputValidation(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
userID int64
|
|||
|
|
uuid string
|
|||
|
|
wantErr bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "有效输入",
|
|||
|
|
userID: 1,
|
|||
|
|
uuid: "test-uuid",
|
|||
|
|
wantErr: false,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "userID为0",
|
|||
|
|
userID: 0,
|
|||
|
|
uuid: "test-uuid",
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "uuid为空",
|
|||
|
|
userID: 1,
|
|||
|
|
uuid: "",
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "两者都无效",
|
|||
|
|
userID: 0,
|
|||
|
|
uuid: "",
|
|||
|
|
wantErr: true,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
hasError := tt.userID == 0 || tt.uuid == ""
|
|||
|
|
if hasError != tt.wantErr {
|
|||
|
|
t.Errorf("Input validation failed: got %v, want %v", hasError, tt.wantErr)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestValidateProfileByUserID_UserIDMatching 测试用户ID匹配逻辑
|
|||
|
|
func TestValidateProfileByUserID_UserIDMatching(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
profileUserID int64
|
|||
|
|
requestUserID int64
|
|||
|
|
wantValid bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "用户ID匹配",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 1,
|
|||
|
|
wantValid: true,
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
name: "用户ID不匹配",
|
|||
|
|
profileUserID: 1,
|
|||
|
|
requestUserID: 2,
|
|||
|
|
wantValid: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
isValid := tt.profileUserID == tt.requestUserID
|
|||
|
|
if isValid != tt.wantValid {
|
|||
|
|
t.Errorf("UserID matching failed: got %v, want %v", isValid, tt.wantValid)
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestGenerateRSAPrivateKey 测试RSA私钥生成
|
|||
|
|
func TestGenerateRSAPrivateKey(t *testing.T) {
|
|||
|
|
tests := []struct {
|
|||
|
|
name string
|
|||
|
|
wantError bool
|
|||
|
|
}{
|
|||
|
|
{
|
|||
|
|
name: "生成RSA私钥",
|
|||
|
|
wantError: false,
|
|||
|
|
},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for _, tt := range tests {
|
|||
|
|
t.Run(tt.name, func(t *testing.T) {
|
|||
|
|
privateKey, err := generateRSAPrivateKey()
|
|||
|
|
if (err != nil) != tt.wantError {
|
|||
|
|
t.Errorf("generateRSAPrivateKey() error = %v, wantError %v", err, tt.wantError)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
if !tt.wantError {
|
|||
|
|
if privateKey == "" {
|
|||
|
|
t.Error("generateRSAPrivateKey() 返回的私钥不应为空")
|
|||
|
|
}
|
|||
|
|
// 验证PEM格式
|
|||
|
|
if len(privateKey) < 100 {
|
|||
|
|
t.Errorf("generateRSAPrivateKey() 返回的私钥长度异常: %d", len(privateKey))
|
|||
|
|
}
|
|||
|
|
// 验证包含PEM头部
|
|||
|
|
if !contains(privateKey, "BEGIN RSA PRIVATE KEY") {
|
|||
|
|
t.Error("generateRSAPrivateKey() 返回的私钥应包含PEM头部")
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestGenerateRSAPrivateKey_Uniqueness 测试RSA私钥唯一性
|
|||
|
|
func TestGenerateRSAPrivateKey_Uniqueness(t *testing.T) {
|
|||
|
|
keys := make(map[string]bool)
|
|||
|
|
for i := 0; i < 10; i++ {
|
|||
|
|
key, err := generateRSAPrivateKey()
|
|||
|
|
if err != nil {
|
|||
|
|
t.Fatalf("generateRSAPrivateKey() 失败: %v", err)
|
|||
|
|
}
|
|||
|
|
if keys[key] {
|
|||
|
|
t.Errorf("第%d次生成的密钥与之前重复", i+1)
|
|||
|
|
}
|
|||
|
|
keys[key] = true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 辅助函数
|
|||
|
|
func stringPtr(s string) *string {
|
|||
|
|
return &s
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
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 ||
|
|||
|
|
containsMiddle(s, substr))))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func containsMiddle(s, substr string) bool {
|
|||
|
|
for i := 0; i <= len(s)-len(substr); i++ {
|
|||
|
|
if s[i:i+len(substr)] == substr {
|
|||
|
|
return true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return false
|
|||
|
|
}
|