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}