Files
RenewCMS/test/role_support_test.go
T

126 lines
2.7 KiB
Go

package test
import (
"RenewCMS/internal/domain/role"
"slices"
)
const (
ownerRoleID uint32 = 1
adminRoleID uint32 = 2
writerRoleID uint32 = 3
)
type mockRoleRepo struct {
roles map[uint32]role.Role
nextID uint32
fail failSwitch
}
func newMockRoleRepo() *mockRoleRepo {
return &mockRoleRepo{roles: map[uint32]role.Role{}}
}
func newSeededMockRoleRepo() *mockRoleRepo {
repo := newMockRoleRepo()
for _, builtIn := range role.BuiltInRoles() {
_, _ = repo.Create(builtIn)
}
return repo
}
func (m *mockRoleRepo) byName(name string) role.Role {
found, _ := m.GetByName(name)
return found
}
func (m *mockRoleRepo) sortedIDs() []uint32 {
ids := make([]uint32, 0, len(m.roles))
for id := range m.roles {
ids = append(ids, id)
}
slices.Sort(ids)
return ids
}
func (m *mockRoleRepo) List() ([]role.Role, error) {
if err := m.fail.trigger("List"); err != nil {
return nil, err
}
listed := []role.Role{}
for _, id := range m.sortedIDs() {
listed = append(listed, m.roles[id])
}
return listed, nil
}
func (m *mockRoleRepo) Get(id uint32) (role.Role, error) {
if err := m.fail.trigger("Get"); err != nil {
return role.Role{}, err
}
found, ok := m.roles[id]
if !ok {
return role.Role{}, role.ErrRoleNotFound
}
return found, nil
}
func (m *mockRoleRepo) GetByName(name string) (role.Role, error) {
if err := m.fail.trigger("GetByName"); err != nil {
return role.Role{}, err
}
var match *role.Role
for _, id := range m.sortedIDs() {
candidate := m.roles[id]
if candidate.Name == name && (match == nil || candidate.BuiltIn && !match.BuiltIn) {
match = &candidate
}
}
if match == nil {
return role.Role{}, role.ErrRoleNotFound
}
return *match, nil
}
func (m *mockRoleRepo) ListGrants(roleID uint32) ([]role.Grant, error) {
if err := m.fail.trigger("ListGrants"); err != nil {
return nil, err
}
found, ok := m.roles[roleID]
if !ok {
return nil, role.ErrRoleNotFound
}
return slices.Clone(found.Grants), nil
}
func (m *mockRoleRepo) Create(created role.Role) (role.Role, error) {
if err := m.fail.trigger("Create"); err != nil {
return role.Role{}, err
}
m.nextID++
created.ID = m.nextID
m.roles[created.ID] = created
return created, nil
}
func (m *mockRoleRepo) Save(saved role.Role) (role.Role, error) {
if err := m.fail.trigger("Save"); err != nil {
return role.Role{}, err
}
stored, ok := m.roles[saved.ID]
if !ok {
return role.Role{}, role.ErrRoleNotFound
}
if stored.Version != saved.Version {
return role.Role{}, role.ErrRoleConflict
}
stored.Name = saved.Name
stored.Description = saved.Description
stored.Version++
stored.Grants = slices.Clone(saved.Grants)
m.roles[saved.ID] = stored
return stored, nil
}
var _ role.Repository = &mockRoleRepo{}