Файли
rilaxik 0b716e8f25
ci / test (push) Successful in 1m29s
ci / test (pull_request) Successful in 1m3s
feat: roadmap polish
2026-11-08 03:52:49 +00:00

92 рядки
4.6 KiB
Go

package service
import (
"context"
"errors"
"testing"
"git.entityseven.com/rilaxik/pllist/internal/domain"
)
type fakeAccessRepository struct {
lists map[int64]domain.List
roles map[[2]int64]domain.Role
}
func (f *fakeAccessRepository) Get(_ context.Context, id int64) (domain.List, error) {
list, ok := f.lists[id]
if !ok {
return domain.List{}, domain.ErrNotFound
}
return list, nil
}
func (f *fakeAccessRepository) Role(_ context.Context, listID, userID int64) (domain.Role, bool, error) {
role, ok := f.roles[[2]int64{listID, userID}]
return role, ok, nil
}
func TestAuthorize(t *testing.T) {
const listID = int64(10)
repo := &fakeAccessRepository{
lists: map[int64]domain.List{
listID: {ID: listID, OwnerID: 1, Title: "Groceries"},
},
roles: map[[2]int64]domain.Role{
{listID, 2}: domain.RoleEditor,
{listID, 3}: domain.RoleReader,
},
}
access := NewAccessService(repo)
tests := []struct {
name string
userID int64
listID int64
action domain.Action
wantErr error
}{
{name: "owner views", userID: 1, listID: listID, action: domain.ActionViewList},
{name: "owner renames", userID: 1, listID: listID, action: domain.ActionEditListMeta},
{name: "owner deletes", userID: 1, listID: listID, action: domain.ActionDeleteList},
{name: "owner views items", userID: 1, listID: listID, action: domain.ActionViewItems},
{name: "owner edits items", userID: 1, listID: listID, action: domain.ActionEditItem},
{name: "owner deletes items", userID: 1, listID: listID, action: domain.ActionDeleteItem},
{name: "owner changes item state", userID: 1, listID: listID, action: domain.ActionChangeItemState},
{name: "owner manages shares", userID: 1, listID: listID, action: domain.ActionManageShares},
{name: "owner adds items", userID: 1, listID: listID, action: domain.ActionAddItem},
{name: "owner reserves", userID: 1, listID: listID, action: domain.ActionReserveItem},
{name: "editor views", userID: 2, listID: listID, action: domain.ActionViewList},
{name: "editor views items", userID: 2, listID: listID, action: domain.ActionViewItems},
{name: "editor adds items", userID: 2, listID: listID, action: domain.ActionAddItem},
{name: "editor edits items", userID: 2, listID: listID, action: domain.ActionEditItem},
{name: "editor deletes items", userID: 2, listID: listID, action: domain.ActionDeleteItem},
{name: "editor changes item state", userID: 2, listID: listID, action: domain.ActionChangeItemState},
{name: "editor reserves", userID: 2, listID: listID, action: domain.ActionReserveItem},
{name: "editor cannot rename", userID: 2, listID: listID, action: domain.ActionEditListMeta, wantErr: domain.ErrForbidden},
{name: "editor cannot delete", userID: 2, listID: listID, action: domain.ActionDeleteList, wantErr: domain.ErrForbidden},
{name: "editor cannot manage shares", userID: 2, listID: listID, action: domain.ActionManageShares, wantErr: domain.ErrForbidden},
{name: "reader views", userID: 3, listID: listID, action: domain.ActionViewList},
{name: "reader views items", userID: 3, listID: listID, action: domain.ActionViewItems},
{name: "reader cannot add items", userID: 3, listID: listID, action: domain.ActionAddItem, wantErr: domain.ErrForbidden},
{name: "reader cannot edit items", userID: 3, listID: listID, action: domain.ActionEditItem, wantErr: domain.ErrForbidden},
{name: "reader cannot delete items", userID: 3, listID: listID, action: domain.ActionDeleteItem, wantErr: domain.ErrForbidden},
{name: "reader cannot change item state", userID: 3, listID: listID, action: domain.ActionChangeItemState, wantErr: domain.ErrForbidden},
{name: "reader cannot reserve", userID: 3, listID: listID, action: domain.ActionReserveItem, wantErr: domain.ErrForbidden},
{name: "reader cannot rename", userID: 3, listID: listID, action: domain.ActionEditListMeta, wantErr: domain.ErrForbidden},
{name: "reader cannot manage shares", userID: 3, listID: listID, action: domain.ActionManageShares, wantErr: domain.ErrForbidden},
{name: "stranger gets not found", userID: 4, listID: listID, action: domain.ActionViewList, wantErr: domain.ErrNotFound},
{name: "stranger cannot view items", userID: 4, listID: listID, action: domain.ActionViewItems, wantErr: domain.ErrNotFound},
{name: "missing list", userID: 1, listID: 99, action: domain.ActionViewList, wantErr: domain.ErrNotFound},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := access.Authorize(context.Background(), tt.userID, tt.listID, tt.action)
if !errors.Is(err, tt.wantErr) {
t.Fatalf("Authorize() error = %v, want %v", err, tt.wantErr)
}
})
}
}