operation_test.go

  1package bug
  2
  3import (
  4	"testing"
  5	"time"
  6
  7	"github.com/stretchr/testify/require"
  8
  9	"github.com/MichaelMure/git-bug/entities/identity"
 10	"github.com/MichaelMure/git-bug/entity/dag"
 11	"github.com/MichaelMure/git-bug/repository"
 12)
 13
 14// TODO: move to entity/dag?
 15
 16func TestValidate(t *testing.T) {
 17	repo := repository.NewMockRepoClock()
 18
 19	makeIdentity := func(t *testing.T, name, email string) *identity.Identity {
 20		i, err := identity.NewIdentity(repo, name, email)
 21		require.NoError(t, err)
 22		return i
 23	}
 24
 25	rene := makeIdentity(t, "René Descartes", "rene@descartes.fr")
 26
 27	unix := time.Now().Unix()
 28
 29	good := []Operation{
 30		NewCreateOp(rene, unix, "title", "message", nil),
 31		NewSetTitleOp(rene, unix, "title2", "title1"),
 32		NewAddCommentOp(rene, unix, "message2", nil),
 33		NewSetStatusOp(rene, unix, ClosedStatus),
 34		NewLabelChangeOperation(rene, unix, []Label{"added"}, []Label{"removed"}),
 35	}
 36
 37	for _, op := range good {
 38		if err := op.Validate(); err != nil {
 39			t.Fatal(err)
 40		}
 41	}
 42
 43	bad := []Operation{
 44		// opbase
 45		NewSetStatusOp(makeIdentity(t, "", "rene@descartes.fr"), unix, ClosedStatus),
 46		NewSetStatusOp(makeIdentity(t, "René Descartes\u001b", "rene@descartes.fr"), unix, ClosedStatus),
 47		NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@descartes.fr\u001b"), unix, ClosedStatus),
 48		NewSetStatusOp(makeIdentity(t, "René \nDescartes", "rene@descartes.fr"), unix, ClosedStatus),
 49		NewSetStatusOp(makeIdentity(t, "René Descartes", "rene@\ndescartes.fr"), unix, ClosedStatus),
 50		&CreateOperation{OpBase: dag.NewOpBase(CreateOp, rene, 0),
 51			Title:   "title",
 52			Message: "message",
 53		},
 54
 55		NewCreateOp(rene, unix, "multi\nline", "message", nil),
 56		NewCreateOp(rene, unix, "title", "message", []repository.Hash{repository.Hash("invalid")}),
 57		NewCreateOp(rene, unix, "title\u001b", "message", nil),
 58		NewCreateOp(rene, unix, "title", "message\u001b", nil),
 59		NewSetTitleOp(rene, unix, "multi\nline", "title1"),
 60		NewSetTitleOp(rene, unix, "title", "multi\nline"),
 61		NewSetTitleOp(rene, unix, "title\u001b", "title2"),
 62		NewSetTitleOp(rene, unix, "title", "title2\u001b"),
 63		NewAddCommentOp(rene, unix, "message\u001b", nil),
 64		NewAddCommentOp(rene, unix, "message", []repository.Hash{repository.Hash("invalid")}),
 65		NewSetStatusOp(rene, unix, 1000),
 66		NewSetStatusOp(rene, unix, 0),
 67		NewLabelChangeOperation(rene, unix, []Label{}, []Label{}),
 68		NewLabelChangeOperation(rene, unix, []Label{"multi\nline"}, []Label{}),
 69	}
 70
 71	for i, op := range bad {
 72		if err := op.Validate(); err == nil {
 73			t.Fatal("validation should have failed", i, op)
 74		}
 75	}
 76}
 77
 78func TestMetadata(t *testing.T) {
 79	repo := repository.NewMockRepoClock()
 80
 81	rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
 82	require.NoError(t, err)
 83
 84	op := NewCreateOp(rene, time.Now().Unix(), "title", "message", nil)
 85
 86	op.SetMetadata("key", "value")
 87
 88	val, ok := op.GetMetadata("key")
 89	require.True(t, ok)
 90	require.Equal(t, val, "value")
 91}
 92
 93func TestID(t *testing.T) {
 94	repo := repository.CreateGoGitTestRepo(t, false)
 95
 96	repos := []repository.ClockedRepo{
 97		repository.NewMockRepo(),
 98		repo,
 99	}
100
101	for _, repo := range repos {
102		rene, err := identity.NewIdentity(repo, "René Descartes", "rene@descartes.fr")
103		require.NoError(t, err)
104		err = rene.Commit(repo)
105		require.NoError(t, err)
106
107		b, op, err := Create(rene, time.Now().Unix(), "title", "message", nil, nil)
108		require.NoError(t, err)
109
110		id1 := op.Id()
111		require.NoError(t, id1.Validate())
112
113		err = b.Commit(repo)
114		require.NoError(t, err)
115
116		op2 := b.FirstOp()
117
118		id2 := op2.Id()
119		require.NoError(t, id2.Validate())
120		require.Equal(t, id1, id2)
121
122		b2, err := Read(repo, b.Id())
123		require.NoError(t, err)
124
125		op3 := b2.FirstOp()
126
127		id3 := op3.Id()
128		require.NoError(t, id3.Validate())
129		require.Equal(t, id1, id3)
130	}
131}