Search Apps Documentation Source Content File Folder Download Copy Actions Download

member_storage_test.gno

7.24 Kb · 292 lines
  1package storage_test
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/nt/commondao/v0"
  7	"gno.land/p/nt/urequire/v0"
  8
  9	"gno.land/p/nt/commondao/v0/exts/storage"
 10)
 11
 12func TestMemberStorageGroupingMemberAdd(t *testing.T) {
 13	tests := []struct {
 14		name   string
 15		setup  func() commondao.MemberStorage
 16		group  string
 17		member address
 18	}{
 19		{
 20			name: "empty group",
 21			setup: func() commondao.MemberStorage {
 22				s := storage.NewMemberStorage()
 23				s.Grouping().Add("foo")
 24				return s
 25			},
 26			group:  "foo",
 27			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 28		},
 29		{
 30			name: "group with members",
 31			setup: func() commondao.MemberStorage {
 32				s := storage.NewMemberStorage()
 33				group, _ := s.Grouping().Add("foo")
 34				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
 35				group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
 36				return s
 37			},
 38			group:  "foo",
 39			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 40		},
 41		{
 42			name: "multiple groups with members",
 43			setup: func() commondao.MemberStorage {
 44				s := storage.NewMemberStorage()
 45				group, _ := s.Grouping().Add("foo")
 46				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
 47				group, _ = s.Grouping().Add("bar")
 48				group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
 49				return s
 50			},
 51			group:  "bar",
 52			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 53		},
 54	}
 55
 56	for _, tt := range tests {
 57		t.Run(tt.name, func(t *testing.T) {
 58			// Arrange
 59			s := tt.setup()
 60			group, _ := s.Grouping().Get(tt.group)
 61
 62			// Act
 63			group.Members().Add(tt.member)
 64
 65			// Assert
 66			urequire.True(t, s.Has(tt.member), "expect member to also be added to parent storage")
 67		})
 68	}
 69}
 70
 71func TestMemberStorageGroupingMemberRemove(t *testing.T) {
 72	tests := []struct {
 73		name   string
 74		setup  func() commondao.MemberStorage
 75		group  string
 76		member address
 77	}{
 78		{
 79			name: "one group one member",
 80			setup: func() commondao.MemberStorage {
 81				s := storage.NewMemberStorage()
 82				group, _ := s.Grouping().Add("foo")
 83				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
 84				return s
 85			},
 86			group:  "foo",
 87			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 88		},
 89		{
 90			name: "one group multiple members",
 91			setup: func() commondao.MemberStorage {
 92				s := storage.NewMemberStorage()
 93				group, _ := s.Grouping().Add("foo")
 94				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
 95				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
 96				group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
 97				return s
 98			},
 99			group:  "foo",
100			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
101		},
102		{
103			name: "multiple groups multiple members",
104			setup: func() commondao.MemberStorage {
105				s := storage.NewMemberStorage()
106				group, _ := s.Grouping().Add("foo")
107				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
108				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
109				group, _ = s.Grouping().Add("bar")
110				group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
111				return s
112			},
113			group:  "foo",
114			member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
115		},
116	}
117
118	for _, tt := range tests {
119		t.Run(tt.name, func(t *testing.T) {
120			// Arrange
121			s := tt.setup()
122			group, _ := s.Grouping().Get(tt.group)
123
124			// Act
125			group.Members().Remove(tt.member)
126
127			// Assert
128			urequire.False(t, s.Has(tt.member), "expect member to also be removed from parent storage")
129		})
130	}
131}
132
133func TestMemberStorageSize(t *testing.T) {
134	tests := []struct {
135		name  string
136		setup func() commondao.MemberStorage
137		size  int
138	}{
139		{
140			name: "empty",
141			setup: func() commondao.MemberStorage {
142				return storage.NewMemberStorage()
143			},
144			size: 0,
145		},
146		{
147			name: "member without group",
148			setup: func() commondao.MemberStorage {
149				s := storage.NewMemberStorage()
150				s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
151				return s
152			},
153			size: 1,
154		},
155		{
156			name: "multiple members without group",
157			setup: func() commondao.MemberStorage {
158				s := storage.NewMemberStorage()
159				s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
160				s.Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
161				return s
162			},
163			size: 2,
164		},
165		{
166			name: "member in group",
167			setup: func() commondao.MemberStorage {
168				s := storage.NewMemberStorage()
169				group, _ := s.Grouping().Add("foo")
170				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
171				return s
172			},
173			size: 1,
174		},
175		{
176			name: "multiple members in group",
177			setup: func() commondao.MemberStorage {
178				s := storage.NewMemberStorage()
179				group, _ := s.Grouping().Add("foo")
180				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
181				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
182				return s
183			},
184			size: 2,
185		},
186		{
187			name: "multiple members in different groups",
188			setup: func() commondao.MemberStorage {
189				s := storage.NewMemberStorage()
190				group, _ := s.Grouping().Add("foo")
191				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
192				group, _ = s.Grouping().Add("bar")
193				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
194				return s
195			},
196			size: 2,
197		},
198	}
199
200	for _, tt := range tests {
201		t.Run(tt.name, func(t *testing.T) {
202			// Arrange
203			s := tt.setup()
204
205			// Act
206			size := s.Size()
207
208			// Assert
209			urequire.Equal(t, tt.size, size)
210		})
211	}
212}
213
214func TestMemberStorageIterateByOffset(t *testing.T) {
215	tests := []struct {
216		name    string
217		setup   func() commondao.MemberStorage
218		members []address
219	}{
220		{
221			name: "empty",
222			setup: func() commondao.MemberStorage {
223				return storage.NewMemberStorage()
224			},
225		},
226		{
227			name: "without group",
228			setup: func() commondao.MemberStorage {
229				s := storage.NewMemberStorage()
230				s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
231				s.Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
232				return s
233			},
234			members: []address{
235				"g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
236				"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
237			},
238		},
239		{
240			name: "single group",
241			setup: func() commondao.MemberStorage {
242				s := storage.NewMemberStorage()
243				group, _ := s.Grouping().Add("foo")
244				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
245				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
246				return s
247			},
248			members: []address{
249				"g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
250				"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
251			},
252		},
253		{
254			name: "multiple groups",
255			setup: func() commondao.MemberStorage {
256				s := storage.NewMemberStorage()
257				group, _ := s.Grouping().Add("foo")
258				group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
259				group, _ = s.Grouping().Add("bar")
260				group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
261				return s
262			},
263			members: []address{
264				"g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
265				"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
266			},
267		},
268	}
269
270	for _, tt := range tests {
271		t.Run(tt.name, func(t *testing.T) {
272			// Arrange
273			var i int
274			s := tt.setup()
275			members := make([]address, s.Size())
276
277			// Act
278			s.IterateByOffset(0, s.Size(), func(addr address) bool {
279				members[i] = addr
280				i++
281				return false
282			})
283
284			// Assert
285			urequire.Equal(t, len(tt.members), len(members), "expect iterated members to match")
286
287			for i, member := range members {
288				urequire.Equal(t, tt.members[i], member, "expect member to match")
289			}
290		})
291	}
292}