1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package usecase
4
5import (
6 "strconv"
7 "strings"
8 "testing"
9
10 "github.com/stretchr/testify/assert"
11 "github.com/stretchr/testify/require"
12
13 "bnema.dev/ermite/internal/domain"
14)
15
16func TestPullAttemptsRememberConflictsByTipsAndAreBounded(t *testing.T) {
17 id := func(c string) domain.ObjectID {
18 o, err := domain.ParseObjectID(strings.Repeat(c, 40))
19 require.NoError(t, err)
20 return o
21 }
22 key := func(i int) pullKey {
23 r, err := domain.ParseRepoName("r" + strconv.Itoa(i))
24 require.NoError(t, err)
25 return pullKey{repo: r, number: 1}
26 }
27 a := newPullAttempts(2)
28 a.conflicted(key(0), id("a"), id("b"))
29 assert.True(t, a.tried(key(0), id("a"), id("b")), "the same tips were tried")
30 assert.False(t, a.tried(key(0), id("c"), id("b")), "the target moved: try again")
31 assert.False(t, a.tried(key(0), id("a"), id("c")), "the source moved: try again")
32 assert.False(t, a.tried(key(1), id("a"), id("b")), "another merge request")
33
34 a.conflicted(key(1), id("a"), id("b"))
35 a.tried(key(0), id("a"), id("b")) // 0 is the most recently used; 1 the oldest
36 a.conflicted(key(2), id("a"), id("b"))
37 assert.False(t, a.tried(key(1), id("a"), id("b")), "the least recently used is forgotten")
38 assert.True(t, a.tried(key(0), id("a"), id("b")))
39 assert.True(t, a.tried(key(2), id("a"), id("b")))
40 assert.Len(t, a.items, 2)
41 assert.Len(t, a.order, 2)
42
43 a.merged(key(0))
44 assert.False(t, a.tried(key(0), id("a"), id("b")), "a merge that went through is forgotten")
45 assert.Len(t, a.items, 1)
46 assert.Len(t, a.order, 1)
47}