diff --git a/commonspace/settings/settings_test.go b/commonspace/settings/settings_test.go index 1526b1f4..a1c8b516 100644 --- a/commonspace/settings/settings_test.go +++ b/commonspace/settings/settings_test.go @@ -125,7 +125,7 @@ func TestSettingsObject_Init(t *testing.T) { require.NoError(t, err) } -func TestSettingsObject_DeleteObject(t *testing.T) { +func TestSettingsObject_DeleteObject_NoSnapshot(t *testing.T) { fx := newSettingsFixture(t) defer fx.stop() @@ -134,11 +134,11 @@ func TestSettingsObject_DeleteObject(t *testing.T) { err := fx.doc.Init(context.Background()) require.NoError(t, err) - time.Sleep(100 * time.Millisecond) delId := "delId" fx.syncTree.EXPECT().Id().Return("syncId") + fx.syncTree.EXPECT().Len().Return(10) fx.delState.EXPECT().Exists(delId).Return(false) fx.spaceStorage.EXPECT().TreeStorage(delId).Return(nil, nil) res := []byte("settingsData") @@ -165,6 +165,49 @@ func TestSettingsObject_DeleteObject(t *testing.T) { require.NoError(t, err) } +func TestSettingsObject_DeleteObject_WithSnapshot(t *testing.T) { + fx := newSettingsFixture(t) + defer fx.stop() + + fx.spaceStorage.EXPECT().SpaceSettingsId().Return(fx.docId) + fx.deleter.EXPECT().Delete() + + err := fx.doc.Init(context.Background()) + require.NoError(t, err) + + delId := "delId" + doSnapshot = func(len int) bool { + return true + } + + fx.syncTree.EXPECT().Id().Return("syncId") + fx.syncTree.EXPECT().Len().Return(10) + fx.delState.EXPECT().Exists(delId).Return(false) + fx.spaceStorage.EXPECT().TreeStorage(delId).Return(nil, nil) + res := []byte("settingsData") + fx.doc.state = &settingsstate.State{LastIteratedId: "someId"} + fx.changeFactory.EXPECT().CreateObjectDeleteChange(delId, fx.doc.state, true).Return(res, nil) + + accountData, err := accountdata.NewRandom() + require.NoError(t, err) + fx.account.EXPECT().Account().Return(accountData) + fx.syncTree.EXPECT().AddContent(gomock.Any(), objecttree.SignableChangeContent{ + Data: res, + Key: accountData.SignKey, + IsSnapshot: true, + IsEncrypted: false, + }).Return(objecttree.AddResult{}, nil) + + fx.stateBuilder.EXPECT().Build(fx.doc, fx.doc.state).Return(fx.doc.state, nil) + fx.deletionManager.EXPECT().UpdateState(gomock.Any(), fx.doc.state).Return(nil) + err = fx.doc.DeleteObject(delId) + require.NoError(t, err) + + fx.syncTree.EXPECT().Close().Return(nil) + err = fx.doc.Close() + require.NoError(t, err) +} + func TestSettingsObject_Rebuild(t *testing.T) { fx := newSettingsFixture(t) defer fx.stop() diff --git a/commonspace/settings/settingsstate/changefactory.go b/commonspace/settings/settingsstate/changefactory.go index fc379097..a5a70dc5 100644 --- a/commonspace/settings/settingsstate/changefactory.go +++ b/commonspace/settings/settingsstate/changefactory.go @@ -49,12 +49,18 @@ func (c *changeFactory) CreateSpaceDeleteChange(peerId string, state *State, isS } func (c *changeFactory) makeSnapshot(state *State, objectId, deleterPeer string) *spacesyncproto.SpaceSettingsSnapshot { - deletedIds := state.DeletedIds + var ( + deletedIds = state.DeletedIds + deleterId = state.DeleterId + ) if objectId != "" { deletedIds = append(deletedIds, objectId) } + if deleterPeer != "" { + deleterId = deleterPeer + } return &spacesyncproto.SpaceSettingsSnapshot{ DeletedIds: deletedIds, - DeleterPeerId: deleterPeer, + DeleterPeerId: deleterId, } } diff --git a/commonspace/settings/settingsstate/changefactory_test.go b/commonspace/settings/settingsstate/changefactory_test.go new file mode 100644 index 00000000..41135b36 --- /dev/null +++ b/commonspace/settings/settingsstate/changefactory_test.go @@ -0,0 +1,59 @@ +package settingsstate + +import ( + "github.com/anytypeio/any-sync/commonspace/spacesyncproto" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" + "testing" +) + +func TestChangeFactory_CreateObjectDeleteChange(t *testing.T) { + factory := NewChangeFactory() + state := &State{ + DeletedIds: []string{"1", "2"}, + DeleterId: "del", + } + marshalled, err := factory.CreateObjectDeleteChange("3", state, false) + require.NoError(t, err) + data := &spacesyncproto.SettingsData{} + err = proto.Unmarshal(marshalled, data) + require.NoError(t, err) + require.Nil(t, data.Snapshot) + require.Equal(t, "3", data.Content[0].Value.(*spacesyncproto.SpaceSettingsContent_ObjectDelete).ObjectDelete.Id) + + marshalled, err = factory.CreateObjectDeleteChange("3", state, true) + require.NoError(t, err) + data = &spacesyncproto.SettingsData{} + err = proto.Unmarshal(marshalled, data) + require.NoError(t, err) + require.Equal(t, &spacesyncproto.SpaceSettingsSnapshot{ + DeletedIds: []string{"1", "2", "3"}, + DeleterPeerId: "del", + }, data.Snapshot) + require.Equal(t, "3", data.Content[0].Value.(*spacesyncproto.SpaceSettingsContent_ObjectDelete).ObjectDelete.Id) +} + +func TestChangeFactory_CreateSpaceDeleteChange(t *testing.T) { + factory := NewChangeFactory() + state := &State{ + DeletedIds: []string{"1", "2"}, + } + marshalled, err := factory.CreateSpaceDeleteChange("del", state, false) + require.NoError(t, err) + data := &spacesyncproto.SettingsData{} + err = proto.Unmarshal(marshalled, data) + require.NoError(t, err) + require.Nil(t, data.Snapshot) + require.Equal(t, "del", data.Content[0].Value.(*spacesyncproto.SpaceSettingsContent_SpaceDelete).SpaceDelete.DeleterPeerId) + + marshalled, err = factory.CreateSpaceDeleteChange("del", state, true) + require.NoError(t, err) + data = &spacesyncproto.SettingsData{} + err = proto.Unmarshal(marshalled, data) + require.NoError(t, err) + require.Equal(t, &spacesyncproto.SpaceSettingsSnapshot{ + DeletedIds: []string{"1", "2"}, + DeleterPeerId: "del", + }, data.Snapshot) + require.Equal(t, "del", data.Content[0].Value.(*spacesyncproto.SpaceSettingsContent_SpaceDelete).SpaceDelete.DeleterPeerId) +}