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