1package bug
  2
  3import (
  4	"fmt"
  5	"testing"
  6	"time"
  7
  8	"github.com/stretchr/testify/require"
  9
 10	"github.com/MichaelMure/git-bug/identity"
 11	"github.com/MichaelMure/git-bug/repository"
 12)
 13
 14func TestBugId(t *testing.T) {
 15	mockRepo := repository.NewMockRepoForTest()
 16
 17	bug1 := NewBug()
 18
 19	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 20	err := rene.Commit(mockRepo)
 21	require.NoError(t, err)
 22
 23	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 24
 25	bug1.Append(createOp)
 26
 27	err = bug1.Commit(mockRepo)
 28
 29	if err != nil {
 30		t.Fatal(err)
 31	}
 32
 33	bug1.Id()
 34}
 35
 36func TestBugValidity(t *testing.T) {
 37	mockRepo := repository.NewMockRepoForTest()
 38
 39	bug1 := NewBug()
 40
 41	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 42	err := rene.Commit(mockRepo)
 43	require.NoError(t, err)
 44
 45	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 46
 47	if bug1.Validate() == nil {
 48		t.Fatal("Empty bug should be invalid")
 49	}
 50
 51	bug1.Append(createOp)
 52
 53	if bug1.Validate() != nil {
 54		t.Fatal("Bug with just a CreateOp should be valid")
 55	}
 56
 57	err = bug1.Commit(mockRepo)
 58	if err != nil {
 59		t.Fatal(err)
 60	}
 61
 62	bug1.Append(createOp)
 63
 64	if bug1.Validate() == nil {
 65		t.Fatal("Bug with multiple CreateOp should be invalid")
 66	}
 67
 68	err = bug1.Commit(mockRepo)
 69	if err == nil {
 70		t.Fatal("Invalid bug should not commit")
 71	}
 72}
 73
 74func TestBugCommitLoad(t *testing.T) {
 75	repo := repository.NewMockRepoForTest()
 76
 77	bug1 := NewBug()
 78
 79	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 80	err := rene.Commit(repo)
 81	require.NoError(t, err)
 82
 83	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 84	setTitleOp := NewSetTitleOp(rene, time.Now().Unix(), "title2", "title1")
 85	addCommentOp := NewAddCommentOp(rene, time.Now().Unix(), "message2", nil)
 86
 87	bug1.Append(createOp)
 88	bug1.Append(setTitleOp)
 89
 90	require.True(t, bug1.NeedCommit())
 91
 92	err = bug1.Commit(repo)
 93	require.Nil(t, err)
 94	require.False(t, bug1.NeedCommit())
 95
 96	bug2, err := ReadLocal(repo, bug1.Id())
 97	require.NoError(t, err)
 98	equivalentBug(t, bug1, bug2)
 99
100	// add more op
101
102	bug1.Append(addCommentOp)
103
104	require.True(t, bug1.NeedCommit())
105
106	err = bug1.Commit(repo)
107	require.Nil(t, err)
108	require.False(t, bug1.NeedCommit())
109
110	bug3, err := ReadLocal(repo, bug1.Id())
111	require.NoError(t, err)
112	equivalentBug(t, bug1, bug3)
113}
114
115func equivalentBug(t *testing.T, expected, actual *Bug) {
116	require.Equal(t, len(expected.packs), len(actual.packs))
117
118	for i := range expected.packs {
119		for j := range expected.packs[i].Operations {
120			actual.packs[i].Operations[j].base().id = expected.packs[i].Operations[j].base().id
121		}
122	}
123
124	require.Equal(t, expected, actual)
125}
126
127func TestBugRemove(t *testing.T) {
128	repo := repository.CreateGoGitTestRepo(false)
129	remoteA := repository.CreateGoGitTestRepo(true)
130	remoteB := repository.CreateGoGitTestRepo(true)
131	defer repository.CleanupTestRepos(repo, remoteA, remoteB)
132
133	err := repo.AddRemote("remoteA", remoteA.GetLocalRemote())
134	require.NoError(t, err)
135
136	err = repo.AddRemote("remoteB", remoteB.GetLocalRemote())
137	require.NoError(t, err)
138
139	// generate a bunch of bugs
140	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
141	err = rene.Commit(repo)
142	require.NoError(t, err)
143
144	for i := 0; i < 100; i++ {
145		b := NewBug()
146		createOp := NewCreateOp(rene, time.Now().Unix(), "title", fmt.Sprintf("message%v", i), nil)
147		b.Append(createOp)
148		err = b.Commit(repo)
149		require.NoError(t, err)
150	}
151
152	// and one more for testing
153	b := NewBug()
154	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
155	b.Append(createOp)
156	err = b.Commit(repo)
157	require.NoError(t, err)
158
159	_, err = Push(repo, "remoteA")
160	require.NoError(t, err)
161
162	_, err = Push(repo, "remoteB")
163	require.NoError(t, err)
164
165	_, err = Fetch(repo, "remoteA")
166	require.NoError(t, err)
167
168	_, err = Fetch(repo, "remoteB")
169	require.NoError(t, err)
170
171	err = RemoveBug(repo, b.Id())
172	require.NoError(t, err)
173
174	_, err = ReadLocal(repo, b.Id())
175	require.Error(t, ErrBugNotExist, err)
176
177	_, err = ReadRemote(repo, "remoteA", b.Id())
178	require.Error(t, ErrBugNotExist, err)
179
180	_, err = ReadRemote(repo, "remoteB", b.Id())
181	require.Error(t, ErrBugNotExist, err)
182
183	ids, err := ListLocalIds(repo)
184	require.NoError(t, err)
185	require.Len(t, ids, 100)
186}