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