Passed
Pull Request — master (#2485)
by Tolga
03:17
created

pkg/database/collections_test.go   A

Size/Duplication

Total Lines 211
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 134
dl 0
loc 211
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A database.TestSubjectCollection 0 22 1
A database.TestTupleCollection 0 31 1
A database.TestAttributeCollection 0 28 1
A database.TestEntityCollection 0 22 1
A database.TestToSubjectCollection 0 24 1
A database.TestBundles 0 41 1
A database.TestEmptyCollections 0 20 1
1
package database
2
3
import (
4
	"testing"
5
6
	"github.com/stretchr/testify/assert"
7
8
	"github.com/Permify/permify/pkg/attribute"
9
	base "github.com/Permify/permify/pkg/pb/base/v1"
10
)
11
12
func TestTupleCollection(t *testing.T) {
13
	// Create a new TupleCollection with two tuples
14
	tuple1 := &base.Tuple{
15
		Subject: &base.Subject{Type: "user", Id: "u1"},
16
		Entity:  &base.Entity{Type: "book", Id: "b1"},
17
	}
18
	tuple2 := &base.Tuple{
19
		Subject: &base.Subject{Type: "user", Id: "u2"},
20
		Entity:  &base.Entity{Type: "book", Id: "b2"},
21
	}
22
	tupleColl := NewTupleCollection(tuple1, tuple2)
23
24
	// Test the CreateTupleIterator method
25
	iter := tupleColl.CreateTupleIterator()
26
	assert.NotNil(t, iter)
27
28
	// Test the GetTuples method
29
	tuples := tupleColl.GetTuples()
30
	assert.Equal(t, 2, len(tuples))
31
	assert.Equal(t, tuple1, tuples[0])
32
	assert.Equal(t, tuple2, tuples[1])
33
34
	// Test the Add method
35
	tuple3 := &base.Tuple{
36
		Subject: &base.Subject{Type: "user", Id: "u3"},
37
		Entity:  &base.Entity{Type: "book", Id: "b3"},
38
	}
39
	tupleColl.Add(tuple3)
40
	tuples = tupleColl.GetTuples()
41
	assert.Equal(t, 3, len(tuples))
42
	assert.Equal(t, tuple3, tuples[2])
43
}
44
45
func TestSubjectCollection(t *testing.T) {
46
	// Create a new SubjectCollection with two subjects
47
	subject1 := &base.Subject{Type: "user", Id: "u1"}
48
	subject2 := &base.Subject{Type: "user", Id: "u2"}
49
	subjectColl := NewSubjectCollection(subject1, subject2)
50
51
	// Test the CreateSubjectIterator method
52
	iter := subjectColl.CreateSubjectIterator()
53
	assert.NotNil(t, iter)
54
55
	// Test the GetSubjects method
56
	subjects := subjectColl.GetSubjects()
57
	assert.Equal(t, 2, len(subjects))
58
	assert.Equal(t, subject1, subjects[0])
59
	assert.Equal(t, subject2, subjects[1])
60
61
	// Test the Add method
62
	subject3 := &base.Subject{Type: "user", Id: "u3"}
63
	subjectColl.Add(subject3)
64
	subjects = subjectColl.GetSubjects()
65
	assert.Equal(t, 3, len(subjects))
66
	assert.Equal(t, subject3, subjects[2])
67
}
68
69
func TestEntityCollection(t *testing.T) {
70
	// Create a new EntityCollection with two entities
71
	entity1 := &base.Entity{Type: "book", Id: "b1"}
72
	entity2 := &base.Entity{Type: "book", Id: "b2"}
73
	entityColl := NewEntityCollection(entity1, entity2)
74
75
	// Test the CreateEntityIterator method
76
	iter := entityColl.CreateEntityIterator()
77
	assert.NotNil(t, iter)
78
79
	// Test the GetEntities method
80
	entities := entityColl.GetEntities()
81
	assert.Equal(t, 2, len(entities))
82
	assert.Equal(t, entity1, entities[0])
83
	assert.Equal(t, entity2, entities[1])
84
85
	// Test the Add method
86
	entity3 := &base.Entity{Type: "book", Id: "b3"}
87
	entityColl.Add(entity3)
88
	entities = entityColl.GetEntities()
89
	assert.Equal(t, 3, len(entities))
90
	assert.Equal(t, entity3, entities[2])
91
}
92
93
func TestAttributeCollection(t *testing.T) {
94
	// Create a new AttributeCollection with two attributes
95
	attr1, err := attribute.Attribute("book:b1$status|string:published")
96
	assert.NoError(t, err)
97
98
	attr2, err := attribute.Attribute("book:b2$status|string:draft")
99
	assert.NoError(t, err)
100
101
	attrColl := NewAttributeCollection(attr1, attr2)
102
103
	// Test the CreateAttributeIterator method
104
	iter := attrColl.CreateAttributeIterator()
105
	assert.NotNil(t, iter)
106
107
	// Test the GetAttributes method
108
	attributes := attrColl.GetAttributes()
109
	assert.Equal(t, 2, len(attributes))
110
	assert.Equal(t, attr1, attributes[0])
111
	assert.Equal(t, attr2, attributes[1])
112
113
	// Test the Add method
114
	attr3, err := attribute.Attribute("book:b3$status|string:archived")
115
	assert.NoError(t, err)
116
117
	attrColl.Add(attr3)
118
	attributes = attrColl.GetAttributes()
119
	assert.Equal(t, 3, len(attributes))
120
	assert.Equal(t, attr3, attributes[2])
121
}
122
123
func TestEmptyCollections(t *testing.T) {
124
	// Test empty TupleCollection
125
	emptyTupleColl := NewTupleCollection()
126
	assert.NotNil(t, emptyTupleColl)
127
	assert.Equal(t, 0, len(emptyTupleColl.GetTuples()))
128
129
	// Test empty SubjectCollection
130
	emptySubjectColl := NewSubjectCollection()
131
	assert.NotNil(t, emptySubjectColl)
132
	assert.Equal(t, 0, len(emptySubjectColl.GetSubjects()))
133
134
	// Test empty EntityCollection
135
	emptyEntityColl := NewEntityCollection()
136
	assert.NotNil(t, emptyEntityColl)
137
	assert.Equal(t, 0, len(emptyEntityColl.GetEntities()))
138
139
	// Test empty AttributeCollection
140
	emptyAttrColl := NewAttributeCollection()
141
	assert.NotNil(t, emptyAttrColl)
142
	assert.Equal(t, 0, len(emptyAttrColl.GetAttributes()))
143
}
144
145
func TestToSubjectCollection(t *testing.T) {
146
	// Create a TupleCollection with tuples
147
	tuple1 := &base.Tuple{
148
		Subject: &base.Subject{Type: "user", Id: "u1"},
149
		Entity:  &base.Entity{Type: "book", Id: "b1"},
150
	}
151
	tuple2 := &base.Tuple{
152
		Subject: &base.Subject{Type: "user", Id: "u2"},
153
		Entity:  &base.Entity{Type: "book", Id: "b2"},
154
	}
155
	tupleColl := NewTupleCollection(tuple1, tuple2)
156
157
	// Test ToSubjectCollection method
158
	subjectColl := tupleColl.ToSubjectCollection()
159
	assert.NotNil(t, subjectColl)
160
	assert.Equal(t, 2, len(subjectColl.GetSubjects()))
161
	assert.Equal(t, tuple1.Subject, subjectColl.GetSubjects()[0])
162
	assert.Equal(t, tuple2.Subject, subjectColl.GetSubjects()[1])
163
164
	// Test with empty tuple collection
165
	emptyTupleColl := NewTupleCollection()
166
	emptySubjectColl := emptyTupleColl.ToSubjectCollection()
167
	assert.NotNil(t, emptySubjectColl)
168
	assert.Equal(t, 0, len(emptySubjectColl.GetSubjects()))
169
}
170
171
func TestBundles(t *testing.T) {
172
	// Test TupleBundle
173
	tuple1 := &base.Tuple{
174
		Subject: &base.Subject{Type: "user", Id: "u1"},
175
		Entity:  &base.Entity{Type: "book", Id: "b1"},
176
	}
177
	tuple2 := &base.Tuple{
178
		Subject: &base.Subject{Type: "user", Id: "u2"},
179
		Entity:  &base.Entity{Type: "book", Id: "b2"},
180
	}
181
182
	tupleBundle := TupleBundle{
183
		Write:  *NewTupleCollection(tuple1),
184
		Delete: *NewTupleCollection(tuple2),
185
	}
186
187
	assert.NotNil(t, tupleBundle.Write)
188
	assert.NotNil(t, tupleBundle.Delete)
189
	assert.Equal(t, 1, len(tupleBundle.Write.GetTuples()))
190
	assert.Equal(t, 1, len(tupleBundle.Delete.GetTuples()))
191
	assert.Equal(t, tuple1, tupleBundle.Write.GetTuples()[0])
192
	assert.Equal(t, tuple2, tupleBundle.Delete.GetTuples()[0])
193
194
	// Test AttributeBundle
195
	attr1, err := attribute.Attribute("book:b1$status|string:published")
196
	assert.NoError(t, err)
197
198
	attr2, err := attribute.Attribute("book:b2$status|string:draft")
199
	assert.NoError(t, err)
200
201
	attrBundle := AttributeBundle{
202
		Write:  *NewAttributeCollection(attr1),
203
		Delete: *NewAttributeCollection(attr2),
204
	}
205
206
	assert.NotNil(t, attrBundle.Write)
207
	assert.NotNil(t, attrBundle.Delete)
208
	assert.Equal(t, 1, len(attrBundle.Write.GetAttributes()))
209
	assert.Equal(t, 1, len(attrBundle.Delete.GetAttributes()))
210
	assert.Equal(t, attr1, attrBundle.Write.GetAttributes()[0])
211
	assert.Equal(t, attr2, attrBundle.Delete.GetAttributes()[0])
212
}
213