Files
gochat/internal/auth/policy_test.go_BAK
T
2026-06-04 15:44:48 +08:00

239 lines
8.4 KiB
Plaintext

package auth
import (
"testing"
"github.com/stretchr/testify/assert"
)
// === PermissionLevel tests ===
func TestPermissionLevel_IsValid(t *testing.T) {
assert.True(t, PermissionFull.IsValid())
assert.True(t, PermissionRead.IsValid())
assert.True(t, PermissionNone.IsValid())
assert.False(t, PermissionLevel("invalid").IsValid())
assert.False(t, PermissionLevel("").IsValid())
}
func TestPermissionLevel_CanWrite(t *testing.T) {
assert.True(t, PermissionFull.CanWrite())
assert.False(t, PermissionRead.CanWrite())
assert.False(t, PermissionNone.CanWrite())
}
func TestPermissionLevel_CanRead(t *testing.T) {
assert.True(t, PermissionFull.CanRead())
assert.True(t, PermissionRead.CanRead())
assert.False(t, PermissionNone.CanRead())
}
// === PermissionMatrix tests ===
func TestAgentDefaultPermissions(t *testing.T) {
assert.Equal(t, PermissionRead, AgentDefaultPermissions[DimensionConversationManage])
assert.Equal(t, PermissionNone, AgentDefaultPermissions[DimensionConversationDelete])
assert.Equal(t, PermissionRead, AgentDefaultPermissions[DimensionContactManage])
assert.Equal(t, PermissionNone, AgentDefaultPermissions[DimensionReportManage])
assert.Equal(t, PermissionNone, AgentDefaultPermissions[DimensionKnowledgeBaseManage])
assert.Equal(t, PermissionNone, AgentDefaultPermissions[DimensionAutomationManage])
}
func TestAdministratorPermissions(t *testing.T) {
for _, dim := range AllDimensions {
assert.Equal(t, PermissionFull, AdministratorPermissions[dim], "admin should have full on %s", dim)
}
}
func TestAllDimensions_ContainsAllSix(t *testing.T) {
assert.Len(t, AllDimensions, 6)
expected := []PermissionDimension{
DimensionConversationManage,
DimensionConversationDelete,
DimensionContactManage,
DimensionReportManage,
DimensionKnowledgeBaseManage,
DimensionAutomationManage,
}
assert.ElementsMatch(t, expected, AllDimensions)
}
func TestPermissionMatrixMap_ToJSON(t *testing.T) {
data, err := AgentDefaultPermissions.ToJSON()
assert.NoError(t, err)
assert.Contains(t, string(data), "conversation_manage")
assert.Contains(t, string(data), "read")
}
func TestPermissionMatrixFromJSON_Valid(t *testing.T) {
data, err := AgentDefaultPermissions.ToJSON()
assert.NoError(t, err)
matrix, err := PermissionMatrixFromJSON(data)
assert.NoError(t, err)
assert.Equal(t, PermissionRead, matrix[DimensionConversationManage])
}
func TestPermissionMatrixFromJSON_InvalidLevel(t *testing.T) {
invalidJSON := `{"conversation_manage": "superuser"}`
matrix, err := PermissionMatrixFromJSON([]byte(invalidJSON))
assert.Error(t, err)
assert.Nil(t, matrix)
}
func TestPermissionMatrixFromJSON_Empty(t *testing.T) {
matrix, err := PermissionMatrixFromJSON([]byte(`{}`))
assert.NoError(t, err)
assert.Empty(t, matrix)
}
// === PolicyContext tests ===
func TestNewPolicyContext_Administrator(t *testing.T) {
pc := NewPolicyContext(1, 1, "administrator", 0, nil)
assert.True(t, pc.IsAdministrator())
assert.False(t, pc.IsAgent())
assert.False(t, pc.IsCustomRole())
assert.Equal(t, AdministratorPermissions, pc.Permissions)
}
func TestNewPolicyContext_Agent(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.IsAdministrator())
assert.True(t, pc.IsAgent())
assert.False(t, pc.IsCustomRole())
assert.Equal(t, AgentDefaultPermissions, pc.Permissions)
}
func TestNewPolicyContext_CustomRole(t *testing.T) {
customPerms := PermissionMatrixMap{
DimensionConversationManage: PermissionFull,
DimensionContactManage: PermissionRead,
}
pc := NewPolicyContext(3, 1, "custom_role", 10, customPerms)
assert.True(t, pc.IsCustomRole())
assert.Equal(t, customPerms, pc.Permissions)
}
func TestNewPolicyContext_CustomRole_FallbackToAgent(t *testing.T) {
pc := NewPolicyContext(3, 1, "custom_role", 10, nil)
assert.True(t, pc.IsCustomRole())
assert.Equal(t, AgentDefaultPermissions, pc.Permissions) // nil perms → agent defaults
}
// === Can() tests ===
func TestCan_AdministratorAlwaysTrue(t *testing.T) {
pc := NewPolicyContext(1, 1, "administrator", 0, nil)
actions := []string{"manage", "read", "create", "update", "delete", "assign", "resolve"}
resources := []string{"conversation", "contact", "report", "knowledge_base", "automation"}
for _, action := range actions {
for _, resource := range resources {
assert.True(t, pc.Can(action, resource), "admin Can(%s,%s) should be true", action, resource)
}
}
}
func TestCan_AgentConversationManage(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.True(t, pc.Can("read", "conversation")) // agent has read on conversation_manage
assert.False(t, pc.Can("manage", "conversation")) // agent has read, not full
assert.False(t, pc.Can("create", "conversation"))
assert.False(t, pc.Can("update", "conversation"))
}
func TestCan_AgentConversationDelete(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.Can("delete", "conversation")) // agent has none on conversation_delete
}
func TestCan_AgentContactManage(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.True(t, pc.Can("read", "contact"))
assert.False(t, pc.Can("manage", "contact"))
}
func TestCan_AgentNoReportAccess(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.Can("read", "report"))
assert.False(t, pc.Can("manage", "report"))
}
func TestCan_AgentNoKnowledgeBaseAccess(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.Can("read", "knowledge_base"))
}
func TestCan_AgentNoAutomationAccess(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.Can("read", "automation"))
}
func TestCan_CustomRoleFullConversation(t *testing.T) {
pc := NewPolicyContext(3, 1, "custom_role", 10, PermissionMatrixMap{
DimensionConversationManage: PermissionFull,
DimensionConversationDelete: PermissionFull,
})
assert.True(t, pc.Can("manage", "conversation"))
assert.True(t, pc.Can("create", "conversation"))
assert.True(t, pc.Can("read", "conversation"))
assert.True(t, pc.Can("delete", "conversation"))
}
func TestCan_CustomRoleMixedPermissions(t *testing.T) {
pc := NewPolicyContext(3, 1, "custom_role", 10, PermissionMatrixMap{
DimensionConversationManage: PermissionRead,
DimensionContactManage: PermissionFull,
DimensionReportManage: PermissionNone,
})
assert.True(t, pc.Can("read", "conversation"))
assert.False(t, pc.Can("manage", "conversation"))
assert.True(t, pc.Can("manage", "contact"))
assert.False(t, pc.Can("read", "report"))
}
func TestCan_UnknownResource(t *testing.T) {
pc := NewPolicyContext(2, 1, "agent", 0, nil)
assert.False(t, pc.Can("read", "unknown_resource"))
}
// === mapActionToDimension tests ===
func TestMapActionToDimension_Conversation(t *testing.T) {
assert.Equal(t, DimensionConversationDelete, mapActionToDimension("delete", "conversation"))
assert.Equal(t, DimensionConversationManage, mapActionToDimension("read", "conversation"))
assert.Equal(t, DimensionConversationManage, mapActionToDimension("manage", "conversation"))
assert.Equal(t, DimensionConversationManage, mapActionToDimension("create", "conversation"))
}
func TestMapActionToDimension_OtherResources(t *testing.T) {
assert.Equal(t, DimensionContactManage, mapActionToDimension("read", "contact"))
assert.Equal(t, DimensionReportManage, mapActionToDimension("read", "report"))
assert.Equal(t, DimensionKnowledgeBaseManage, mapActionToDimension("manage", "knowledge_base"))
assert.Equal(t, DimensionAutomationManage, mapActionToDimension("create", "automation"))
}
func TestMapActionToDimension_UnknownResource(t *testing.T) {
assert.Equal(t, PermissionDimension(""), mapActionToDimension("read", "widget"))
}
// === matchesAction tests ===
func TestMatchesAction_Read(t *testing.T) {
assert.True(t, matchesAction(PermissionFull, "read"))
assert.True(t, matchesAction(PermissionRead, "read"))
assert.False(t, matchesAction(PermissionNone, "read"))
}
func TestMatchesAction_WriteActions(t *testing.T) {
writeActions := []string{"manage", "create", "update", "assign", "resolve", "manage_labels", "delete"}
for _, action := range writeActions {
assert.True(t, matchesAction(PermissionFull, action), "full should match %s", action)
assert.False(t, matchesAction(PermissionRead, action), "read should not match %s", action)
assert.False(t, matchesAction(PermissionNone, action), "none should not match %s", action)
}
}
func TestMatchesAction_UnknownAction(t *testing.T) {
assert.False(t, matchesAction(PermissionFull, "teleport"))
}