Files
lijiaoqiao/supply-api/internal/iam/model/scope_test.go

248 lines
7.1 KiB
Go
Raw Normal View History

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())
}