169 lines
4.5 KiB
Go
169 lines
4.5 KiB
Go
package models_test
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
"cloud.o-forge.io/core/oc-lib/dbs"
|
|
"cloud.o-forge.io/core/oc-lib/models/utils"
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
|
"github.com/rs/zerolog"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/mock"
|
|
)
|
|
|
|
// --- Mock Definitions ---
|
|
|
|
type MockDBObject struct {
|
|
mock.Mock
|
|
}
|
|
|
|
func (m *MockAccessor) GetLogger() *zerolog.Logger {
|
|
return nil
|
|
}
|
|
func (m *MockAccessor) GetGroups() []string {
|
|
return []string{}
|
|
}
|
|
|
|
func (m *MockAccessor) GetCaller() *tools.HTTPCaller {
|
|
return nil
|
|
}
|
|
|
|
func (m *MockDBObject) GenerateID() { m.Called() }
|
|
func (m *MockDBObject) StoreDraftDefault() { m.Called() }
|
|
func (m *MockDBObject) UpToDate(user, peer string, create bool) {
|
|
m.Called(user, peer, create)
|
|
}
|
|
func (m *MockDBObject) VerifyAuth(req *tools.APIRequest) bool {
|
|
args := m.Called(req)
|
|
return args.Bool(0)
|
|
}
|
|
func (m *MockDBObject) CanDelete() bool {
|
|
args := m.Called()
|
|
return args.Bool(0)
|
|
}
|
|
func (m *MockDBObject) CanUpdate(set utils.DBObject) (bool, utils.DBObject) {
|
|
args := m.Called(set)
|
|
return args.Bool(0), args.Get(1).(utils.DBObject)
|
|
}
|
|
func (m *MockDBObject) IsDrafted() bool {
|
|
args := m.Called()
|
|
return args.Bool(0)
|
|
}
|
|
func (m *MockDBObject) Serialize(obj utils.DBObject) map[string]interface{} {
|
|
args := m.Called(obj)
|
|
return args.Get(0).(map[string]interface{})
|
|
}
|
|
func (m *MockDBObject) Deserialize(mdata map[string]interface{}, obj utils.DBObject) utils.DBObject {
|
|
args := m.Called(mdata, obj)
|
|
return args.Get(0).(utils.DBObject)
|
|
}
|
|
func (m *MockDBObject) GetID() string {
|
|
args := m.Called()
|
|
return args.String(0)
|
|
}
|
|
func (m *MockDBObject) GetName() string {
|
|
args := m.Called()
|
|
return args.String(0)
|
|
}
|
|
|
|
type MockAccessor struct {
|
|
mock.Mock
|
|
}
|
|
|
|
func (m *MockAccessor) DeleteOne(id string) (utils.DBObject, int, error) {
|
|
args := m.Called(id)
|
|
return args.Get(0).(utils.DBObject), args.Int(1), args.Error(2)
|
|
}
|
|
func (m *MockAccessor) LoadOne(id string) (utils.DBObject, int, error) {
|
|
args := m.Called(id)
|
|
return args.Get(0).(utils.DBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) LoadAll(isDraft bool) ([]utils.ShallowDBObject, int, error) {
|
|
args := m.Called(isDraft)
|
|
return args.Get(0).([]utils.ShallowDBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) UpdateOne(set utils.DBObject, id string) (utils.DBObject, int, error) {
|
|
args := m.Called(set, id)
|
|
return args.Get(0).(utils.DBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) CopyOne(data utils.DBObject) (utils.DBObject, int, error) {
|
|
args := m.Called(data)
|
|
return args.Get(0).(utils.DBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) StoreOne(data utils.DBObject) (utils.DBObject, int, error) {
|
|
args := m.Called(data)
|
|
return args.Get(0).(utils.DBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) ShouldVerifyAuth() bool {
|
|
args := m.Called()
|
|
return args.Bool(0)
|
|
}
|
|
func (m *MockAccessor) GetRequest() *tools.APIRequest {
|
|
args := m.Called()
|
|
return args.Get(0).(*tools.APIRequest)
|
|
}
|
|
func (m *MockAccessor) GetType() tools.DataType {
|
|
args := m.Called()
|
|
return args.Get(0).(tools.DataType)
|
|
}
|
|
func (m *MockAccessor) Search(filters *dbs.Filters, s string, d bool) ([]utils.ShallowDBObject, int, error) {
|
|
args := m.Called(filters, s, d)
|
|
return args.Get(0).([]utils.ShallowDBObject), args.Int(1), args.Error(2)
|
|
}
|
|
|
|
func (m *MockAccessor) GetUser() string {
|
|
args := m.Called()
|
|
return args.String(0)
|
|
}
|
|
func (m *MockAccessor) GetPeerID() string {
|
|
args := m.Called()
|
|
return args.String(0)
|
|
}
|
|
|
|
// --- Test Cases ---
|
|
|
|
func TestVerifyAccess_Authorized(t *testing.T) {
|
|
mockObj := new(MockDBObject)
|
|
mockAcc := new(MockAccessor)
|
|
|
|
req := &tools.APIRequest{PeerID: "peer"}
|
|
mockAcc.On("LoadOne", "123").Return(mockObj, 200, nil)
|
|
mockAcc.On("ShouldVerifyAuth").Return(true)
|
|
mockObj.On("VerifyAuth", req).Return(true)
|
|
mockAcc.On("GetRequest").Return(req)
|
|
|
|
err := utils.VerifyAccess(mockAcc, "123")
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestVerifyAccess_Unauthorized(t *testing.T) {
|
|
mockObj := new(MockDBObject)
|
|
mockAcc := new(MockAccessor)
|
|
|
|
req := &tools.APIRequest{PeerID: "peer"}
|
|
mockAcc.On("LoadOne", "123").Return(mockObj, 200, nil)
|
|
mockAcc.On("ShouldVerifyAuth").Return(true)
|
|
mockObj.On("VerifyAuth", req).Return(false)
|
|
mockAcc.On("GetRequest").Return(req)
|
|
|
|
err := utils.VerifyAccess(mockAcc, "123")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "not allowed")
|
|
}
|
|
|
|
func TestVerifyAccess_LoadError(t *testing.T) {
|
|
mockAcc := new(MockAccessor)
|
|
|
|
mockAcc.On("LoadOne", "bad-id").Return(nil, 404, errors.New("not found"))
|
|
|
|
err := utils.VerifyAccess(mockAcc, "bad-id")
|
|
assert.Error(t, err)
|
|
assert.Equal(t, "not found", err.Error())
|
|
}
|