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