common_test.go

  1package dag
  2
  3import (
  4	"encoding/json"
  5	"fmt"
  6	"testing"
  7
  8	"github.com/stretchr/testify/require"
  9
 10	"github.com/MichaelMure/git-bug/entities/identity"
 11	"github.com/MichaelMure/git-bug/entity"
 12	"github.com/MichaelMure/git-bug/repository"
 13)
 14
 15// This file contains an example dummy entity to be used in the tests
 16
 17/*
 18 Operations
 19*/
 20
 21const (
 22	_ OperationType = iota
 23	Op1
 24	Op2
 25)
 26
 27type op1 struct {
 28	OpBase
 29	Field1 string            `json:"field_1"`
 30	Files  []repository.Hash `json:"files"`
 31}
 32
 33func newOp1(author identity.Interface, field1 string, files ...repository.Hash) *op1 {
 34	return &op1{OpBase: NewOpBase(Op1, author, 0), Field1: field1, Files: files}
 35}
 36
 37func (op *op1) Id() entity.Id {
 38	return IdOperation(op, &op.OpBase)
 39}
 40
 41func (op *op1) Validate() error { return nil }
 42
 43func (op *op1) GetFiles() []repository.Hash {
 44	return op.Files
 45}
 46
 47type op2 struct {
 48	OpBase
 49	Field2 string `json:"field_2"`
 50}
 51
 52func newOp2(author identity.Interface, field2 string) *op2 {
 53	return &op2{OpBase: NewOpBase(Op2, author, 0), Field2: field2}
 54}
 55
 56func (op *op2) Id() entity.Id {
 57	return IdOperation(op, &op.OpBase)
 58}
 59
 60func (op *op2) Validate() error { return nil }
 61
 62func unmarshaler(raw json.RawMessage, resolvers entity.Resolvers) (Operation, error) {
 63	var t struct {
 64		OperationType OperationType `json:"type"`
 65	}
 66
 67	if err := json.Unmarshal(raw, &t); err != nil {
 68		return nil, err
 69	}
 70
 71	var op Operation
 72
 73	switch t.OperationType {
 74	case Op1:
 75		op = &op1{}
 76	case Op2:
 77		op = &op2{}
 78	default:
 79		return nil, fmt.Errorf("unknown operation type %v", t.OperationType)
 80	}
 81
 82	err := json.Unmarshal(raw, &op)
 83	if err != nil {
 84		return nil, err
 85	}
 86
 87	return op, nil
 88}
 89
 90/*
 91  Identities + repo + definition
 92*/
 93
 94func makeTestContext() (repository.ClockedRepo, identity.Interface, identity.Interface, entity.Resolvers, Definition) {
 95	repo := repository.NewMockRepo()
 96	id1, id2, resolvers, def := makeTestContextInternal(repo)
 97	return repo, id1, id2, resolvers, def
 98}
 99
100func makeTestContextRemote(t *testing.T) (repository.ClockedRepo, repository.ClockedRepo, repository.ClockedRepo, identity.Interface, identity.Interface, entity.Resolvers, Definition) {
101	repoA := repository.CreateGoGitTestRepo(t, false)
102	repoB := repository.CreateGoGitTestRepo(t, false)
103	remote := repository.CreateGoGitTestRepo(t, true)
104
105	err := repoA.AddRemote("remote", remote.GetLocalRemote())
106	require.NoError(t, err)
107	err = repoA.AddRemote("repoB", repoB.GetLocalRemote())
108	require.NoError(t, err)
109	err = repoB.AddRemote("remote", remote.GetLocalRemote())
110	require.NoError(t, err)
111	err = repoB.AddRemote("repoA", repoA.GetLocalRemote())
112	require.NoError(t, err)
113
114	id1, id2, resolver, def := makeTestContextInternal(repoA)
115
116	// distribute the identities
117	_, err = identity.Push(repoA, "remote")
118	require.NoError(t, err)
119	err = identity.Pull(repoB, "remote")
120	require.NoError(t, err)
121
122	return repoA, repoB, remote, id1, id2, resolver, def
123}
124
125func makeTestContextInternal(repo repository.ClockedRepo) (identity.Interface, identity.Interface, entity.Resolvers, Definition) {
126	id1, err := identity.NewIdentity(repo, "name1", "email1")
127	if err != nil {
128		panic(err)
129	}
130	err = id1.Commit(repo)
131	if err != nil {
132		panic(err)
133	}
134	id2, err := identity.NewIdentity(repo, "name2", "email2")
135	if err != nil {
136		panic(err)
137	}
138	err = id2.Commit(repo)
139	if err != nil {
140		panic(err)
141	}
142
143	resolvers := entity.Resolvers{
144		&identity.Identity{}: entity.ResolverFunc(func(id entity.Id) (entity.Interface, error) {
145			switch id {
146			case id1.Id():
147				return id1, nil
148			case id2.Id():
149				return id2, nil
150			default:
151				return nil, identity.ErrIdentityNotExist
152			}
153		}),
154	}
155
156	def := Definition{
157		Typename:             "foo",
158		Namespace:            "foos",
159		OperationUnmarshaler: unmarshaler,
160		FormatVersion:        1,
161	}
162
163	return id1, id2, resolvers, def
164}