diff --git a/index_test.go b/index_test.go index 477b92f..62ff5ce 100644 --- a/index_test.go +++ b/index_test.go @@ -15,6 +15,7 @@ import ( "github.com/ethersphere/proximity-order-trie/pkg/elements" "github.com/ethersphere/proximity-order-trie/pkg/persister" "golang.org/x/sync/errgroup" + "github.com/stretchr/testify/assert" ) var basePotMode = elements.NewSingleOrder(256) @@ -348,6 +349,31 @@ func TestPersistence(t *testing.T) { for i := 0; i < count+10; i++ { checkFound(t, ctx, idx, newDetMockEntry(t, i)) } + t.Run("delete only existent tuple, then save", func(t *testing.T) { + ls = persister.NewInmemLoadSaver() + mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) + idx, err = pot.New(mode) + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + e0 := newDetMockEntry(t, 0) + idx.Add(ctx, e0) + idx.Delete(ctx, e0.key) + _, err := idx.Save(ctx) + assert.Error(t, err) + }) + t.Run("delete non-existent tuple from non empty POT, then save", func(t *testing.T) { + ls = persister.NewInmemLoadSaver() + mode = elements.NewSwarmPot(basePotMode, ls, func(key []byte) elements.Entry { return &mockEntry{key: key} }) + idx, err = pot.New(mode) + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + e0 := newDetMockEntry(t, 0) + e1 := newDetMockEntry(t, 1) + idx.Add(ctx, e0) + idx.Delete(ctx, e1.key) + _, err := idx.Save(ctx) + assert.NoError(t, err) + }) } func TestConcurrency(t *testing.T) { diff --git a/pkg/elements/mode.go b/pkg/elements/mode.go index 182c16c..694bdb8 100644 --- a/pkg/elements/mode.go +++ b/pkg/elements/mode.go @@ -129,8 +129,10 @@ func (pm *SwarmPot) Update(ctx context.Context, root Node, k []byte, e *Entry) ( if err != nil { return nil, err } - pm.n = update - return update, nil + if update != nil { + pm.n = update + } + return pm.n, nil } // Pack serialises and saves the object