248 lines
7.1 KiB
Go
248 lines
7.1 KiB
Go
|
|
package model
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"testing"
|
|||
|
|
|
|||
|
|
"github.com/stretchr/testify/assert"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_ValidInput 测试创建Scope - 有效输入
|
|||
|
|
func TestScopeModel_NewScope_ValidInput(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scopeCode := "platform:read"
|
|||
|
|
scopeName := "读取平台配置"
|
|||
|
|
scopeType := "platform"
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope := NewScope(scopeCode, scopeName, scopeType)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, scopeCode, scope.Code)
|
|||
|
|
assert.Equal(t, scopeName, scope.Name)
|
|||
|
|
assert.Equal(t, scopeType, scope.Type)
|
|||
|
|
assert.True(t, scope.IsActive)
|
|||
|
|
assert.NotEmpty(t, scope.RequestID)
|
|||
|
|
assert.Equal(t, 1, scope.Version)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ScopeCategories 测试Scope分类
|
|||
|
|
func TestScopeModel_ScopeCategories(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
testCases := []struct {
|
|||
|
|
scopeCode string
|
|||
|
|
expectedType string
|
|||
|
|
}{
|
|||
|
|
// platform:* 分类
|
|||
|
|
{"platform:read", ScopeTypePlatform},
|
|||
|
|
{"platform:write", ScopeTypePlatform},
|
|||
|
|
{"platform:admin", ScopeTypePlatform},
|
|||
|
|
{"platform:audit:read", ScopeTypePlatform},
|
|||
|
|
{"platform:audit:export", ScopeTypePlatform},
|
|||
|
|
|
|||
|
|
// tenant:* 分类
|
|||
|
|
{"tenant:read", ScopeTypePlatform},
|
|||
|
|
{"tenant:write", ScopeTypePlatform},
|
|||
|
|
{"tenant:member:manage", ScopeTypePlatform},
|
|||
|
|
|
|||
|
|
// supply:* 分类
|
|||
|
|
{"supply:account:read", ScopeTypeSupply},
|
|||
|
|
{"supply:account:write", ScopeTypeSupply},
|
|||
|
|
{"supply:package:read", ScopeTypeSupply},
|
|||
|
|
{"supply:package:write", ScopeTypeSupply},
|
|||
|
|
|
|||
|
|
// consumer:* 分类
|
|||
|
|
{"consumer:account:read", ScopeTypeConsumer},
|
|||
|
|
{"consumer:apikey:create", ScopeTypeConsumer},
|
|||
|
|
|
|||
|
|
// billing:* 分类
|
|||
|
|
{"billing:read", ScopeTypePlatform},
|
|||
|
|
|
|||
|
|
// router:* 分类
|
|||
|
|
{"router:invoke", ScopeTypeRouter},
|
|||
|
|
{"router:model:list", ScopeTypeRouter},
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
for _, tc := range testCases {
|
|||
|
|
scope := NewScope(tc.scopeCode, tc.scopeCode, tc.expectedType)
|
|||
|
|
assert.Equal(t, tc.expectedType, scope.Type, "scope %s should be type %s", tc.scopeCode, tc.expectedType)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_DefaultFields 测试创建Scope - 默认字段
|
|||
|
|
func TestScopeModel_NewScope_DefaultFields(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scopeCode := "tenant:read"
|
|||
|
|
scopeName := "读取租户信息"
|
|||
|
|
scopeType := ScopeTypePlatform
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope := NewScope(scopeCode, scopeName, scopeType)
|
|||
|
|
|
|||
|
|
// assert - 验证默认字段
|
|||
|
|
assert.Equal(t, 1, scope.Version, "version should default to 1")
|
|||
|
|
assert.NotEmpty(t, scope.RequestID, "request_id should be auto-generated")
|
|||
|
|
assert.True(t, scope.IsActive, "is_active should default to true")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_WithRequestID 测试创建Scope - 指定RequestID
|
|||
|
|
func TestScopeModel_NewScope_WithRequestID(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
requestID := "req-54321"
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope := NewScopeWithRequestID("platform:read", "读取平台配置", ScopeTypePlatform, requestID)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, requestID, scope.RequestID)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_AuditFields 测试创建Scope - 审计字段
|
|||
|
|
func TestScopeModel_NewScope_AuditFields(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
createdIP := "10.0.0.1"
|
|||
|
|
updatedIP := "10.0.0.2"
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope := NewScopeWithAudit("billing:read", "读取账单", ScopeTypePlatform, "req-789", createdIP, updatedIP)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, createdIP, scope.CreatedIP)
|
|||
|
|
assert.Equal(t, updatedIP, scope.UpdatedIP)
|
|||
|
|
assert.Equal(t, 1, scope.Version)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_Activate 测试激活Scope
|
|||
|
|
func TestScopeModel_Activate(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scope := NewScope("test:scope", "测试Scope", ScopeTypePlatform)
|
|||
|
|
scope.IsActive = false
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope.Activate()
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.True(t, scope.IsActive)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_Deactivate 测试停用Scope
|
|||
|
|
func TestScopeModel_Deactivate(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scope := NewScope("test:scope", "测试Scope", ScopeTypePlatform)
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope.Deactivate()
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.False(t, scope.IsActive)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_IncrementVersion 测试版本号递增
|
|||
|
|
func TestScopeModel_IncrementVersion(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scope := NewScope("test:scope", "测试Scope", ScopeTypePlatform)
|
|||
|
|
originalVersion := scope.Version
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scope.IncrementVersion()
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, originalVersion+1, scope.Version)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ScopeType_Platform 测试平台Scope类型
|
|||
|
|
func TestScopeModel_ScopeType_Platform(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope := NewScope("platform:admin", "平台管理", ScopeTypePlatform)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, ScopeTypePlatform, scope.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ScopeType_Supply 测试供应方Scope类型
|
|||
|
|
func TestScopeModel_ScopeType_Supply(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope := NewScope("supply:account:write", "管理供应账号", ScopeTypeSupply)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, ScopeTypeSupply, scope.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ScopeType_Consumer 测试需求方Scope类型
|
|||
|
|
func TestScopeModel_ScopeType_Consumer(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope := NewScope("consumer:apikey:create", "创建API Key", ScopeTypeConsumer)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, ScopeTypeConsumer, scope.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ScopeType_Router 测试路由Scope类型
|
|||
|
|
func TestScopeModel_ScopeType_Router(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope := NewScope("router:invoke", "调用模型", ScopeTypeRouter)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, ScopeTypeRouter, scope.Type)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_EmptyCode 测试创建Scope - 空Scope代码(应返回错误)
|
|||
|
|
func TestScopeModel_NewScope_EmptyCode(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope, err := NewScopeWithValidation("", "测试Scope", ScopeTypePlatform)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Error(t, err)
|
|||
|
|
assert.Nil(t, scope)
|
|||
|
|
assert.Equal(t, ErrInvalidScopeCode, err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_NewScope_InvalidScopeType 测试创建Scope - 无效Scope类型
|
|||
|
|
func TestScopeModel_NewScope_InvalidScopeType(t *testing.T) {
|
|||
|
|
// arrange & act
|
|||
|
|
scope, err := NewScopeWithValidation("test:scope", "测试Scope", "invalid_type")
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Error(t, err)
|
|||
|
|
assert.Nil(t, scope)
|
|||
|
|
assert.Equal(t, ErrInvalidScopeType, err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_ToScopeInfo 测试Scope转换为ScopeInfo
|
|||
|
|
func TestScopeModel_ToScopeInfo(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
scope := NewScope("platform:read", "读取平台配置", ScopeTypePlatform)
|
|||
|
|
scope.ID = 1
|
|||
|
|
|
|||
|
|
// act
|
|||
|
|
scopeInfo := scope.ToScopeInfo()
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.Equal(t, "platform:read", scopeInfo.ScopeCode)
|
|||
|
|
assert.Equal(t, "读取平台配置", scopeInfo.ScopeName)
|
|||
|
|
assert.Equal(t, ScopeTypePlatform, scopeInfo.ScopeType)
|
|||
|
|
assert.True(t, scopeInfo.IsActive)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_GetScopeTypeFromCode 测试从Scope Code推断类型
|
|||
|
|
func TestScopeModel_GetScopeTypeFromCode(t *testing.T) {
|
|||
|
|
// arrange & act & assert
|
|||
|
|
assert.Equal(t, ScopeTypePlatform, GetScopeTypeFromCode("platform:read"))
|
|||
|
|
assert.Equal(t, ScopeTypePlatform, GetScopeTypeFromCode("tenant:read"))
|
|||
|
|
assert.Equal(t, ScopeTypeSupply, GetScopeTypeFromCode("supply:account:read"))
|
|||
|
|
assert.Equal(t, ScopeTypeConsumer, GetScopeTypeFromCode("consumer:apikey:read"))
|
|||
|
|
assert.Equal(t, ScopeTypeRouter, GetScopeTypeFromCode("router:invoke"))
|
|||
|
|
assert.Equal(t, ScopeTypePlatform, GetScopeTypeFromCode("billing:read"))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// TestScopeModel_IsWildcardScope 测试通配符Scope
|
|||
|
|
func TestScopeModel_IsWildcardScope(t *testing.T) {
|
|||
|
|
// arrange
|
|||
|
|
wildcardScope := NewScope("*", "通配符", ScopeTypePlatform)
|
|||
|
|
normalScope := NewScope("platform:read", "读取平台配置", ScopeTypePlatform)
|
|||
|
|
|
|||
|
|
// assert
|
|||
|
|
assert.True(t, wildcardScope.IsWildcard())
|
|||
|
|
assert.False(t, normalScope.IsWildcard())
|
|||
|
|
}
|