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