mirror of
https://github.com/portainer/portainer.git
synced 2025-07-19 05:19:39 +02:00
93 lines
1.9 KiB
Go
93 lines
1.9 KiB
Go
|
package dataservices
|
||
|
|
||
|
import (
|
||
|
"strconv"
|
||
|
"testing"
|
||
|
|
||
|
portainer "github.com/portainer/portainer/api"
|
||
|
"github.com/portainer/portainer/api/slicesx"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
type testObject struct {
|
||
|
ID int
|
||
|
Value int
|
||
|
}
|
||
|
|
||
|
type mockConnection struct {
|
||
|
store map[int]testObject
|
||
|
|
||
|
portainer.Connection
|
||
|
}
|
||
|
|
||
|
func (m mockConnection) UpdateObject(bucket string, key []byte, value interface{}) error {
|
||
|
obj := value.(*testObject)
|
||
|
|
||
|
m.store[obj.ID] = *obj
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (m mockConnection) GetAll(bucketName string, obj any, appendFn func(o any) (any, error)) error {
|
||
|
for _, v := range m.store {
|
||
|
if _, err := appendFn(&v); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (m mockConnection) UpdateTx(fn func(portainer.Transaction) error) error {
|
||
|
return fn(m)
|
||
|
}
|
||
|
|
||
|
func (m mockConnection) ViewTx(fn func(portainer.Transaction) error) error {
|
||
|
return fn(m)
|
||
|
}
|
||
|
|
||
|
func (m mockConnection) ConvertToKey(v int) []byte {
|
||
|
return []byte(strconv.Itoa(v))
|
||
|
}
|
||
|
|
||
|
func TestReadAll(t *testing.T) {
|
||
|
service := BaseDataService[testObject, int]{
|
||
|
Bucket: "testBucket",
|
||
|
Connection: mockConnection{store: make(map[int]testObject)},
|
||
|
}
|
||
|
|
||
|
data := []testObject{
|
||
|
{ID: 1, Value: 1},
|
||
|
{ID: 2, Value: 2},
|
||
|
{ID: 3, Value: 3},
|
||
|
{ID: 4, Value: 4},
|
||
|
{ID: 5, Value: 5},
|
||
|
}
|
||
|
|
||
|
for _, item := range data {
|
||
|
err := service.Update(item.ID, &item)
|
||
|
require.NoError(t, err)
|
||
|
}
|
||
|
|
||
|
// ReadAll without predicates
|
||
|
result, err := service.ReadAll()
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expected := append([]testObject{}, data...)
|
||
|
|
||
|
require.ElementsMatch(t, expected, result)
|
||
|
|
||
|
// ReadAll with predicates
|
||
|
hasLowID := func(obj testObject) bool { return obj.ID < 3 }
|
||
|
isEven := func(obj testObject) bool { return obj.Value%2 == 0 }
|
||
|
|
||
|
result, err = service.ReadAll(hasLowID, isEven)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expected = slicesx.Filter(expected, hasLowID)
|
||
|
expected = slicesx.Filter(expected, isEven)
|
||
|
|
||
|
require.ElementsMatch(t, expected, result)
|
||
|
}
|