1package identity
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7
8 bootstrap "github.com/MichaelMure/git-bug/entity/boostrap"
9 "github.com/MichaelMure/git-bug/repository"
10)
11
12func TestIdentityPushPull(t *testing.T) {
13 repoA, repoB, _ := repository.SetupGoGitReposAndRemote(t)
14
15 identity1, err := NewIdentity(repoA, "name1", "email1")
16 require.NoError(t, err)
17 err = identity1.Commit(repoA)
18 require.NoError(t, err)
19
20 // A --> remote --> B
21 _, err = Push(repoA, "origin")
22 require.NoError(t, err)
23
24 err = Pull(repoB, "origin")
25 require.NoError(t, err)
26
27 identities := allIdentities(t, ReadAllLocal(repoB))
28
29 if len(identities) != 1 {
30 t.Fatal("Unexpected number of bugs")
31 }
32
33 // B --> remote --> A
34 identity2, err := NewIdentity(repoB, "name2", "email2")
35 require.NoError(t, err)
36 err = identity2.Commit(repoB)
37 require.NoError(t, err)
38
39 _, err = Push(repoB, "origin")
40 require.NoError(t, err)
41
42 err = Pull(repoA, "origin")
43 require.NoError(t, err)
44
45 identities = allIdentities(t, ReadAllLocal(repoA))
46
47 if len(identities) != 2 {
48 t.Fatal("Unexpected number of bugs")
49 }
50
51 // Update both
52
53 err = identity1.Mutate(repoA, func(orig *Mutator) {
54 orig.Name = "name1b"
55 orig.Email = "email1b"
56 })
57 require.NoError(t, err)
58 err = identity1.Commit(repoA)
59 require.NoError(t, err)
60
61 err = identity2.Mutate(repoB, func(orig *Mutator) {
62 orig.Name = "name2b"
63 orig.Email = "email2b"
64 })
65 require.NoError(t, err)
66 err = identity2.Commit(repoB)
67 require.NoError(t, err)
68
69 // A --> remote --> B
70
71 _, err = Push(repoA, "origin")
72 require.NoError(t, err)
73
74 err = Pull(repoB, "origin")
75 require.NoError(t, err)
76
77 identities = allIdentities(t, ReadAllLocal(repoB))
78
79 if len(identities) != 2 {
80 t.Fatal("Unexpected number of bugs")
81 }
82
83 // B --> remote --> A
84
85 _, err = Push(repoB, "origin")
86 require.NoError(t, err)
87
88 err = Pull(repoA, "origin")
89 require.NoError(t, err)
90
91 identities = allIdentities(t, ReadAllLocal(repoA))
92
93 if len(identities) != 2 {
94 t.Fatal("Unexpected number of bugs")
95 }
96
97 // Concurrent update
98
99 err = identity1.Mutate(repoA, func(orig *Mutator) {
100 orig.Name = "name1c"
101 orig.Email = "email1c"
102 })
103 require.NoError(t, err)
104 err = identity1.Commit(repoA)
105 require.NoError(t, err)
106
107 identity1B, err := ReadLocal(repoB, identity1.Id())
108 require.NoError(t, err)
109
110 err = identity1B.Mutate(repoB, func(orig *Mutator) {
111 orig.Name = "name1concurrent"
112 orig.Email = "name1concurrent"
113 })
114 require.NoError(t, err)
115 err = identity1B.Commit(repoB)
116 require.NoError(t, err)
117
118 // A --> remote --> B
119
120 _, err = Push(repoA, "origin")
121 require.NoError(t, err)
122
123 // Pulling a non-fast-forward update should fail
124 err = Pull(repoB, "origin")
125 require.Error(t, err)
126
127 identities = allIdentities(t, ReadAllLocal(repoB))
128
129 if len(identities) != 2 {
130 t.Fatal("Unexpected number of bugs")
131 }
132
133 // B --> remote --> A
134
135 // Pushing a non-fast-forward update should fail
136 _, err = Push(repoB, "origin")
137 require.Error(t, err)
138
139 err = Pull(repoA, "origin")
140 require.NoError(t, err)
141
142 identities = allIdentities(t, ReadAllLocal(repoA))
143
144 if len(identities) != 2 {
145 t.Fatal("Unexpected number of bugs")
146 }
147}
148
149func allIdentities(t testing.TB, identities <-chan bootstrap.StreamedEntity[*Identity]) []*Identity {
150 var result []*Identity
151 for streamed := range identities {
152 if streamed.Err != nil {
153 t.Fatal(streamed.Err)
154 }
155 result = append(result, streamed.Entity)
156 }
157 return result
158}