diff --git a/settings/pkg/store/metadata/assignments_test.go b/settings/pkg/store/metadata/assignments_test.go index a0353b8d6d..ec78aed68b 100644 --- a/settings/pkg/store/metadata/assignments_test.go +++ b/settings/pkg/store/metadata/assignments_test.go @@ -2,6 +2,7 @@ package store import ( "log" + "sync" "testing" olog "github.com/owncloud/ocis/ocis-pkg/log" @@ -16,6 +17,7 @@ var ( s = Store{ Logger: logger, mdc: mdc, + l: &sync.Mutex{}, } logger = olog.NewLogger( @@ -85,7 +87,7 @@ func init() { func setupRoles() { for i := range bundles { if _, err := s.WriteBundle(bundles[i]); err != nil { - log.Fatal(err) + log.Fatal("error initializing ", err) } } } diff --git a/settings/pkg/store/metadata/bundles.go b/settings/pkg/store/metadata/bundles.go index bac42175de..309685afda 100644 --- a/settings/pkg/store/metadata/bundles.go +++ b/settings/pkg/store/metadata/bundles.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" + "github.com/gofrs/uuid" settingsmsg "github.com/owncloud/ocis/protogen/gen/ocis/messages/settings/v0" ) @@ -86,7 +87,22 @@ func (s Store) WriteBundle(record *settingsmsg.Bundle) (*settingsmsg.Bundle, err // AddSettingToBundle adds the given setting to the bundle with the given bundleID. func (s Store) AddSettingToBundle(bundleID string, setting *settingsmsg.Setting) (*settingsmsg.Setting, error) { - return nil, errors.New("not implemented") + s.Init() + b, err := s.ReadBundle(bundleID) + if err != nil { + // TODO: How to differentiate 'not found'? + b = new(settingsmsg.Bundle) + b.Id = bundleID + b.Type = settingsmsg.Bundle_TYPE_DEFAULT + } + + if setting.Id == "" { + setting.Id = uuid.Must(uuid.NewV4()).String() + } + + b.Settings = append(b.Settings, setting) + _, err = s.WriteBundle(b) + return setting, err } // RemoveSettingFromBundle removes the setting from the bundle with the given ids. diff --git a/settings/pkg/store/metadata/bundles_test.go b/settings/pkg/store/metadata/bundles_test.go index 8a690a7deb..7e8e47817a 100644 --- a/settings/pkg/store/metadata/bundles_test.go +++ b/settings/pkg/store/metadata/bundles_test.go @@ -1,6 +1,7 @@ package store import ( + "sync" "testing" olog "github.com/owncloud/ocis/ocis-pkg/log" @@ -101,6 +102,42 @@ var bundleScenarios = []struct { }, } +var ( + appendTestBundleID = "append-test-bundle" + + appendTestSetting1 = &settingsmsg.Setting{ + Id: "append-test-setting-1", + Description: "test-desc-3", + DisplayName: "test-displayname-3", + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: setting1, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READ, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + } + + appendTestSetting2 = &settingsmsg.Setting{ + Id: "append-test-setting-2", + Description: "test-desc-3", + DisplayName: "test-displayname-3", + Resource: &settingsmsg.Resource{ + Type: settingsmsg.Resource_TYPE_SETTING, + Id: setting1, + }, + Value: &settingsmsg.Setting_PermissionValue{ + PermissionValue: &settingsmsg.Permission{ + Operation: settingsmsg.Permission_OPERATION_READ, + Constraint: settingsmsg.Permission_CONSTRAINT_OWN, + }, + }, + } +) + func TestBundles(t *testing.T) { mdc := NewMDC() s := Store{ @@ -110,6 +147,7 @@ func TestBundles(t *testing.T) { olog.Level("info"), ), + l: &sync.Mutex{}, mdc: mdc, } @@ -147,3 +185,33 @@ func TestBundles(t *testing.T) { require.Equal(t, settingsmsg.Bundle_TYPE_ROLE, roles[i].Type) } } + +func TestAppendSetting(t *testing.T) { + mdc := NewMDC() + s := Store{ + Logger: olog.NewLogger( + olog.Color(true), + olog.Pretty(true), + olog.Level("info"), + ), + + l: &sync.Mutex{}, + mdc: mdc, + } + + // appending to non existing bundle creates new + _, err := s.AddSettingToBundle(appendTestBundleID, appendTestSetting1) + require.NoError(t, err) + + b, err := s.ReadBundle(appendTestBundleID) + require.NoError(t, err) + require.Len(t, b.Settings, 1) + + _, err = s.AddSettingToBundle(appendTestBundleID, appendTestSetting2) + require.NoError(t, err) + + b, err = s.ReadBundle(appendTestBundleID) + require.NoError(t, err) + require.Len(t, b.Settings, 2) + +} diff --git a/settings/pkg/store/metadata/store.go b/settings/pkg/store/metadata/store.go index aac096ec4d..28d3d66110 100644 --- a/settings/pkg/store/metadata/store.go +++ b/settings/pkg/store/metadata/store.go @@ -118,7 +118,9 @@ func (s Store) initMetadataClient() error { } } - s.initStore(s) + if s.initStore != nil { + s.initStore(s) + } return nil }