1// SPDX-License-Identifier: AGPL-3.0-or-later
2package kvstore
3
4import (
5 "context"
6 "testing"
7
8 kv "bnema.dev/ermite-kv"
9 "bnema.dev/ermite/internal/domain"
10 "github.com/stretchr/testify/require"
11)
12
13func TestPreparedEventSequenceConflict(t *testing.T) {
14 ctx := context.Background()
15 db, err := kv.Open(ctx, t.TempDir(), kv.Options{})
16 require.NoError(t, err)
17 t.Cleanup(func() { require.NoError(t, db.Close(ctx)) })
18 repo, err := domain.ParseRepoName("proj")
19 require.NoError(t, err)
20 events := []domain.IssueEvent{{Kind: domain.IssueEventClosed, MergeRequest: 9}}
21 var a, b kv.Batch
22 require.NoError(t, prepareIssueEvents(ctx, db, &a, repo, 1, events))
23 require.NoError(t, prepareIssueEvents(ctx, db, &b, repo, 1, events))
24 b.Put([]byte("unrelated"), []byte{1})
25 _, err = db.Apply(ctx, &a)
26 require.NoError(t, err)
27 _, err = db.Apply(ctx, &b)
28 require.ErrorIs(t, err, kv.ErrConflict)
29 _, exists := db.Get(ctx, []byte("unrelated"))
30 require.False(t, exists)
31 var retry kv.Batch
32 require.NoError(t, prepareIssueEvents(ctx, db, &retry, repo, 1, events))
33 _, err = db.Apply(ctx, &retry)
34 require.NoError(t, err)
35 history, err := (&Issues{db: db}).ListEvents(ctx, repo, 1)
36 require.NoError(t, err)
37 require.Len(t, history, 2)
38 require.Equal(t, int64(2), history[1].ID)
39}