92 рядки
4.6 KiB
Go
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)
|
|
}
|
|
})
|
|
}
|
|
}
|