2026-02-18 12:24:19 +01:00
|
|
|
package utils_test
|
2025-06-16 11:24:39 +02:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"cloud.o-forge.io/core/oc-lib/models/utils"
|
|
|
|
|
"cloud.o-forge.io/core/oc-lib/tools"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
)
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
// ---- AbstractObject ----
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GetID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{UUID: "abc-123"}
|
|
|
|
|
assert.Equal(t, "abc-123", obj.GetID())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GetName(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{Name: "test-name"}
|
|
|
|
|
assert.Equal(t, "test-name", obj.GetName())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GetCreatorID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: "peer-xyz"}
|
|
|
|
|
assert.Equal(t, "peer-xyz", obj.GetCreatorID())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_SetID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
obj.SetID("new-id")
|
|
|
|
|
assert.Equal(t, "new-id", obj.UUID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_SetName(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
obj.SetName("hello")
|
|
|
|
|
assert.Equal(t, "hello", obj.Name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GenerateID_WhenEmpty(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
obj.GenerateID()
|
|
|
|
|
assert.NotEmpty(t, obj.UUID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GenerateID_KeepsExisting(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{UUID: "existing-id"}
|
|
|
|
|
obj.GenerateID()
|
|
|
|
|
assert.Equal(t, "existing-id", obj.UUID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_StoreDraftDefault(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{IsDraft: true}
|
|
|
|
|
obj.StoreDraftDefault()
|
|
|
|
|
assert.False(t, obj.IsDraft)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_IsDrafted(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{IsDraft: true}
|
|
|
|
|
assert.True(t, obj.IsDrafted())
|
|
|
|
|
|
|
|
|
|
obj.IsDraft = false
|
|
|
|
|
assert.False(t, obj.IsDrafted())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_CanDelete(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
assert.True(t, obj.CanDelete())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_CanUpdate(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{UUID: "id-1"}
|
|
|
|
|
other := &utils.AbstractObject{UUID: "id-2"}
|
|
|
|
|
ok, returned := obj.CanUpdate(other)
|
|
|
|
|
assert.True(t, ok)
|
|
|
|
|
assert.Equal(t, other, returned)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_Unsign(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{Signature: []byte("sig")}
|
|
|
|
|
obj.Unsign()
|
|
|
|
|
assert.Nil(t, obj.Signature)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GetSignature(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{Signature: []byte("sig")}
|
|
|
|
|
assert.Equal(t, []byte("sig"), obj.GetSignature())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_DeepCopy(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{UUID: "id-1", Name: "original"}
|
|
|
|
|
copy := obj.DeepCopy()
|
|
|
|
|
assert.NotNil(t, copy)
|
|
|
|
|
assert.Equal(t, obj.UUID, copy.UUID)
|
|
|
|
|
assert.Equal(t, obj.Name, copy.Name)
|
|
|
|
|
|
|
|
|
|
// Mutating the copy should not affect the original
|
|
|
|
|
copy.Name = "modified"
|
|
|
|
|
assert.Equal(t, "original", obj.Name)
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_UpToDate_Create(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: ""}
|
|
|
|
|
obj.UpToDate("user1", "peer1", true)
|
|
|
|
|
assert.Equal(t, "peer1", obj.UpdaterID)
|
|
|
|
|
assert.Equal(t, "user1", obj.UserUpdaterID)
|
|
|
|
|
// CreatorID was empty so create branch is skipped
|
|
|
|
|
assert.Empty(t, obj.CreatorID)
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_UpToDate_CreateWithExistingCreator(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: "existing-peer"}
|
|
|
|
|
obj.UpToDate("user1", "peer1", true)
|
|
|
|
|
assert.Equal(t, "peer1", obj.CreatorID)
|
|
|
|
|
assert.Equal(t, "user1", obj.UserCreatorID)
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_UpToDate_Update(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: "original-peer"}
|
|
|
|
|
obj.UpToDate("user2", "peer2", false)
|
|
|
|
|
assert.Equal(t, "peer2", obj.UpdaterID)
|
|
|
|
|
assert.Equal(t, "original-peer", obj.CreatorID) // unchanged
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
// ---- VerifyAuth ----
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_VerifyAuth_NilRequest_GetPublic(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{AccessMode: 1} // Public = 1
|
|
|
|
|
assert.True(t, obj.VerifyAuth("get", nil))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_NilRequest_DeletePublic(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{AccessMode: 1} // Public = 1
|
|
|
|
|
// non-"get" call with nil request → false
|
|
|
|
|
assert.False(t, obj.VerifyAuth("delete", nil))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_NilRequest_Private(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{AccessMode: 0} // Private
|
|
|
|
|
assert.False(t, obj.VerifyAuth("get", nil))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_AdminRequest(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
req := &tools.APIRequest{Admin: true}
|
|
|
|
|
assert.True(t, obj.VerifyAuth("get", req))
|
|
|
|
|
assert.True(t, obj.VerifyAuth("delete", req))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_MatchingPeerID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: "peer-abc"}
|
|
|
|
|
req := &tools.APIRequest{PeerID: "peer-abc"}
|
|
|
|
|
assert.True(t, obj.VerifyAuth("get", req))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_MismatchedPeerID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: "peer-abc"}
|
|
|
|
|
req := &tools.APIRequest{PeerID: "peer-xyz"}
|
|
|
|
|
assert.False(t, obj.VerifyAuth("get", req))
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_VerifyAuth_EmptyPeerID(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{CreatorID: ""}
|
|
|
|
|
req := &tools.APIRequest{PeerID: ""}
|
|
|
|
|
// both empty → condition `ao.CreatorID == request.PeerID && request.PeerID != ""` is false
|
|
|
|
|
assert.False(t, obj.VerifyAuth("get", req))
|
|
|
|
|
}
|
2025-06-16 11:24:39 +02:00
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
// ---- GetObjectFilters ----
|
2025-06-16 11:24:39 +02:00
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_GetObjectFilters_Star(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
f := obj.GetObjectFilters("*")
|
|
|
|
|
assert.NotNil(t, f)
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractObject_GetObjectFilters_Search(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
f := obj.GetObjectFilters("my-search")
|
2025-06-16 11:24:39 +02:00
|
|
|
assert.NotNil(t, f)
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
// ---- Serialize / Deserialize ----
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_SerializeDeserialize(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{UUID: "serial-id", Name: "serial-name"}
|
|
|
|
|
m := obj.Serialize(obj)
|
|
|
|
|
assert.NotNil(t, m)
|
|
|
|
|
|
|
|
|
|
dst := &utils.AbstractObject{}
|
|
|
|
|
result := obj.Deserialize(m, dst)
|
|
|
|
|
assert.NotNil(t, result)
|
|
|
|
|
assert.Equal(t, "serial-id", result.GetID())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ---- GetAccessor ----
|
|
|
|
|
|
|
|
|
|
func TestAbstractObject_GetAccessor_ReturnsNil(t *testing.T) {
|
|
|
|
|
obj := &utils.AbstractObject{}
|
|
|
|
|
acc := obj.GetAccessor(nil)
|
|
|
|
|
assert.Nil(t, acc)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ---- AbstractAccessor ----
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetUser_NilRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{Request: nil}
|
|
|
|
|
assert.Equal(t, "", acc.GetUser())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetUser_WithRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{
|
|
|
|
|
Request: &tools.APIRequest{Username: "alice"},
|
|
|
|
|
}
|
|
|
|
|
assert.Equal(t, "alice", acc.GetUser())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetPeerID_NilRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{Request: nil}
|
|
|
|
|
assert.Equal(t, "", acc.GetPeerID())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetPeerID_WithRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{
|
|
|
|
|
Request: &tools.APIRequest{PeerID: "peer-42"},
|
|
|
|
|
}
|
|
|
|
|
assert.Equal(t, "peer-42", acc.GetPeerID())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetGroups_NilRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{Request: nil}
|
|
|
|
|
assert.Equal(t, []string{}, acc.GetGroups())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetGroups_WithRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{
|
|
|
|
|
Request: &tools.APIRequest{Groups: []string{"g1", "g2"}},
|
|
|
|
|
}
|
|
|
|
|
assert.Equal(t, []string{"g1", "g2"}, acc.GetGroups())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_ShouldVerifyAuth(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{}
|
|
|
|
|
assert.True(t, acc.ShouldVerifyAuth())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestAbstractAccessor_GetType(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{
|
|
|
|
|
Type: tools.WORKFLOW,
|
|
|
|
|
}
|
|
|
|
|
assert.Equal(t, tools.WORKFLOW, acc.GetType())
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractAccessor_GetRequest(t *testing.T) {
|
|
|
|
|
req := &tools.APIRequest{Admin: true}
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{Request: req}
|
|
|
|
|
assert.Equal(t, req, acc.GetRequest())
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|
|
|
|
|
|
2026-02-18 12:24:19 +01:00
|
|
|
func TestAbstractAccessor_GetCaller_NilRequest(t *testing.T) {
|
|
|
|
|
acc := &utils.AbstractAccessor[*utils.AbstractObject]{Request: nil}
|
|
|
|
|
assert.Nil(t, acc.GetCaller())
|
2025-06-16 11:24:39 +02:00
|
|
|
}
|