1package bug
  2
  3import (
  4	"testing"
  5	"time"
  6
  7	"github.com/MichaelMure/git-bug/identity"
  8	"github.com/MichaelMure/git-bug/repository"
  9	"github.com/stretchr/testify/assert"
 10)
 11
 12func TestBugId(t *testing.T) {
 13	mockRepo := repository.NewMockRepoForTest()
 14
 15	bug1 := NewBug()
 16
 17	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 18	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 19
 20	bug1.Append(createOp)
 21
 22	err := bug1.Commit(mockRepo)
 23
 24	if err != nil {
 25		t.Fatal(err)
 26	}
 27
 28	bug1.Id()
 29}
 30
 31func TestBugValidity(t *testing.T) {
 32	mockRepo := repository.NewMockRepoForTest()
 33
 34	bug1 := NewBug()
 35
 36	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 37	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 38
 39	if bug1.Validate() == nil {
 40		t.Fatal("Empty bug should be invalid")
 41	}
 42
 43	bug1.Append(createOp)
 44
 45	if bug1.Validate() != nil {
 46		t.Fatal("Bug with just a CreateOp should be valid")
 47	}
 48
 49	err := bug1.Commit(mockRepo)
 50	if err != nil {
 51		t.Fatal(err)
 52	}
 53
 54	bug1.Append(createOp)
 55
 56	if bug1.Validate() == nil {
 57		t.Fatal("Bug with multiple CreateOp should be invalid")
 58	}
 59
 60	err = bug1.Commit(mockRepo)
 61	if err == nil {
 62		t.Fatal("Invalid bug should not commit")
 63	}
 64}
 65
 66func TestBugCommitLoad(t *testing.T) {
 67	bug1 := NewBug()
 68
 69	rene := identity.NewIdentity("René Descartes", "rene@descartes.fr")
 70	createOp := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 71	setTitleOp := NewSetTitleOp(rene, time.Now().Unix(), "title2", "title1")
 72	addCommentOp := NewAddCommentOp(rene, time.Now().Unix(), "message2", nil)
 73
 74	bug1.Append(createOp)
 75	bug1.Append(setTitleOp)
 76
 77	repo := repository.NewMockRepoForTest()
 78
 79	assert.True(t, bug1.NeedCommit())
 80
 81	err := bug1.Commit(repo)
 82	assert.Nil(t, err)
 83	assert.False(t, bug1.NeedCommit())
 84
 85	bug2, err := ReadLocalBug(repo, bug1.Id())
 86	assert.NoError(t, err)
 87	equivalentBug(t, bug1, bug2)
 88
 89	// add more op
 90
 91	bug1.Append(addCommentOp)
 92
 93	assert.True(t, bug1.NeedCommit())
 94
 95	err = bug1.Commit(repo)
 96	assert.Nil(t, err)
 97	assert.False(t, bug1.NeedCommit())
 98
 99	bug3, err := ReadLocalBug(repo, bug1.Id())
100	assert.NoError(t, err)
101	equivalentBug(t, bug1, bug3)
102}
103
104func equivalentBug(t *testing.T, expected, actual *Bug) {
105	assert.Equal(t, len(expected.packs), len(actual.packs))
106
107	for i := range expected.packs {
108		for j := range expected.packs[i].Operations {
109			actual.packs[i].Operations[j].base().id = expected.packs[i].Operations[j].base().id
110		}
111	}
112
113	assert.Equal(t, expected, actual)
114}