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 _ entity.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 entity.Identity, 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 entity.Identity, 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 entity.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 Entity
92*/
93
94type Foo struct {
95 *Entity
96}
97
98func wrapper(e *Entity) *Foo {
99 return &Foo{Entity: e}
100}
101
102/*
103 Identities + repo + definition
104*/
105
106func makeTestContext() (repository.ClockedRepo, entity.Identity, entity.Identity, entity.Resolvers, Definition) {
107 repo := repository.NewMockRepo()
108 id1, id2, resolvers, def := makeTestContextInternal(repo)
109 return repo, id1, id2, resolvers, def
110}
111
112func makeTestContextRemote(t *testing.T) (repository.ClockedRepo, repository.ClockedRepo, repository.ClockedRepo, entity.Identity, entity.Identity, entity.Resolvers, Definition) {
113 repoA := repository.CreateGoGitTestRepo(t, false)
114 repoB := repository.CreateGoGitTestRepo(t, false)
115 remote := repository.CreateGoGitTestRepo(t, true)
116
117 err := repoA.AddRemote("remote", remote.GetLocalRemote())
118 require.NoError(t, err)
119 err = repoA.AddRemote("repoB", repoB.GetLocalRemote())
120 require.NoError(t, err)
121 err = repoB.AddRemote("remote", remote.GetLocalRemote())
122 require.NoError(t, err)
123 err = repoB.AddRemote("repoA", repoA.GetLocalRemote())
124 require.NoError(t, err)
125
126 id1, id2, resolver, def := makeTestContextInternal(repoA)
127
128 // distribute the identities
129 _, err = identity.Push(repoA, "remote")
130 require.NoError(t, err)
131 err = identity.Pull(repoB, "remote")
132 require.NoError(t, err)
133
134 return repoA, repoB, remote, id1, id2, resolver, def
135}
136
137func makeTestContextInternal(repo repository.ClockedRepo) (entity.Identity, entity.Identity, entity.Resolvers, Definition) {
138 id1, err := identity.NewIdentity(repo, "name1", "email1")
139 if err != nil {
140 panic(err)
141 }
142 err = id1.Commit(repo)
143 if err != nil {
144 panic(err)
145 }
146 id2, err := identity.NewIdentity(repo, "name2", "email2")
147 if err != nil {
148 panic(err)
149 }
150 err = id2.Commit(repo)
151 if err != nil {
152 panic(err)
153 }
154
155 resolvers := entity.Resolvers{
156 &identity.Identity{}: entity.MakeResolver(id1, id2),
157 }
158
159 def := Definition{
160 Typename: "foo",
161 Namespace: "foos",
162 OperationUnmarshaler: unmarshaler,
163 FormatVersion: 1,
164 }
165
166 return id1, id2, resolvers, def
167}