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(t)
 13	defer repository.CleanupTestRepos(t, 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.AddVersion(&Version{
 52		name:  "name1b",
 53		email: "email1b",
 54	})
 55	err = identity1.Commit(repoA)
 56	require.NoError(t, err)
 57
 58	identity2.AddVersion(&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.AddVersion(&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.AddVersion(&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}