cache: add a push/pull test

Michael Muré created

Change summary

cache/repo_cache.go      | 21 ++++++++++++++++
cache/repo_cache_test.go | 55 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 76 insertions(+)

Detailed changes

cache/repo_cache.go 🔗

@@ -19,6 +19,7 @@ import (
 	"github.com/MichaelMure/git-bug/repository"
 	"github.com/MichaelMure/git-bug/util/git"
 	"github.com/MichaelMure/git-bug/util/process"
+	"github.com/pkg/errors"
 )
 
 const bugCacheFile = "bug-cache"
@@ -675,6 +676,26 @@ func (c *RepoCache) Push(remote string) (string, error) {
 	return stdout1 + stdout2, nil
 }
 
+// Pull will do a Fetch + MergeAll
+// This function will return an error if a merge fail
+func (c *RepoCache) Pull(remote string) error {
+	_, err := c.Fetch(remote)
+	if err != nil {
+		return err
+	}
+
+	for merge := range c.MergeAll(remote) {
+		if merge.Err != nil {
+			return merge.Err
+		}
+		if merge.Status == entity.MergeStatusInvalid {
+			return errors.Errorf("merge failure: %s", merge.Reason)
+		}
+	}
+
+	return nil
+}
+
 func repoLockFilePath(repo repository.Repo) string {
 	return path.Join(repo.GetPath(), ".git", "git-bug", lockfile)
 }

cache/repo_cache_test.go 🔗

@@ -99,3 +99,58 @@ func TestCache(t *testing.T) {
 	_, err = cache.ResolveBugPrefix(bug1.Id()[:10])
 	require.NoError(t, err)
 }
+
+func TestPushPull(t *testing.T) {
+	repoA, repoB, remote := test.SetupReposAndRemote(t)
+	defer test.CleanupRepos(repoA, repoB, remote)
+
+	cacheA, err := NewRepoCache(repoA)
+	require.NoError(t, err)
+
+	cacheB, err := NewRepoCache(repoB)
+	require.NoError(t, err)
+
+	// Create, set and get user identity
+	reneA, err := cacheA.NewIdentity("René Descartes", "rene@descartes.fr")
+	require.NoError(t, err)
+	err = cacheA.SetUserIdentity(reneA)
+	require.NoError(t, err)
+
+	// distribute the identity
+	_, err = cacheA.Push("origin")
+	require.NoError(t, err)
+	err = cacheB.Pull("origin")
+	require.NoError(t, err)
+
+	// Create a bug in A
+	_, err = cacheA.NewBug("bug1", "message")
+	require.NoError(t, err)
+
+	// A --> remote --> B
+	_, err = cacheA.Push("origin")
+	require.NoError(t, err)
+
+	err = cacheB.Pull("origin")
+	require.NoError(t, err)
+
+	require.Len(t, cacheB.AllBugsIds(), 1)
+
+	// retrieve and set identity
+	reneB, err := cacheB.ResolveIdentity(reneA.Id())
+	require.NoError(t, err)
+
+	err = cacheB.SetUserIdentity(reneB)
+	require.NoError(t, err)
+
+	// B --> remote --> A
+	_, err = cacheB.NewBug("bug2", "message")
+	require.NoError(t, err)
+
+	_, err = cacheB.Push("origin")
+	require.NoError(t, err)
+
+	err = cacheA.Pull("origin")
+	require.NoError(t, err)
+
+	require.Len(t, cacheA.AllBugsIds(), 2)
+}