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