member_storage_test.gno
3.72 Kb · 154 lines
1package commondao_test
2
3import (
4 "testing"
5
6 "gno.land/p/nt/uassert/v0"
7 "gno.land/p/nt/urequire/v0"
8
9 "gno.land/p/nt/commondao/v0"
10)
11
12func TestMemberStorageWithGrouping(t *testing.T) {
13 // Prepare
14 tiers := []struct {
15 Name string
16 Weight int
17 Members []address
18 }{
19 {
20 Name: "Tier 1",
21 Weight: 3,
22 Members: []address{
23 "g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
24 "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
25 },
26 },
27 {
28 Name: "Tier 2",
29 Weight: 2,
30 Members: []address{
31 "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj",
32 },
33 },
34 }
35
36 storage := commondao.NewMemberStorageWithGrouping()
37 for _, tier := range tiers {
38 mg, err := storage.Grouping().Add(tier.Name)
39 urequire.NoError(t, err, "expect no error adding tier")
40
41 mg.SetMeta(tier.Weight)
42
43 for _, addr := range tier.Members {
44 ok := mg.Members().Add(addr)
45 urequire.True(t, ok, "expect member to be added")
46 }
47 }
48
49 // Assert
50 for i := 0; i < len(tiers); i++ {
51 tier := tiers[i]
52 mg, found := storage.Grouping().Get(tier.Name)
53 urequire.True(t, found, "expect member group to be found")
54
55 v := mg.GetMeta()
56 urequire.True(t, v != nil, "expect meta to be not nil")
57
58 weight, ok := v.(int)
59 urequire.True(t, ok, "expect group metadata to be an integer")
60 uassert.Equal(t, tier.Weight, weight, "expect group weight to match")
61
62 var i int
63 mg.Members().IterateByOffset(0, len(tier.Members), func(addr address) bool {
64 uassert.Equal(t, tier.Members[i], addr, "expect tier member to match")
65
66 i++
67 return false
68 })
69
70 uassert.Equal(t, len(tier.Members), i, "expect all tier members to be iterated")
71 }
72}
73
74func TestMemberStorageHas(t *testing.T) {
75 cases := []struct {
76 name string
77 found bool
78 setup func() commondao.MemberStorage
79 }{
80 {
81 name: "found",
82 found: true,
83 setup: func() commondao.MemberStorage {
84 s := commondao.NewMemberStorage()
85 s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
86 return s
87 },
88 },
89 {
90 name: "not found",
91 found: false,
92 setup: func() commondao.MemberStorage { return commondao.NewMemberStorage() },
93 },
94 {
95 name: "found in base storage with grouping",
96 found: true,
97 setup: func() commondao.MemberStorage {
98 s := commondao.NewMemberStorageWithGrouping()
99 s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
100
101 g, _ := s.Grouping().Add("foo")
102 g.Members().Add("g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt")
103 return s
104 },
105 },
106 {
107 name: "found with grouping",
108 found: true,
109 setup: func() commondao.MemberStorage {
110 s := commondao.NewMemberStorageWithGrouping()
111 g, _ := s.Grouping().Add("foo")
112 g.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
113 return s
114 },
115 },
116 {
117 name: "not found with grouping",
118 found: false,
119 setup: func() commondao.MemberStorage { return commondao.NewMemberStorageWithGrouping() },
120 },
121 }
122
123 for _, tc := range cases {
124 t.Run(tc.name, func(t *testing.T) {
125 // Arrange
126 storage := tc.setup()
127
128 // Act
129 found := storage.Has("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
130
131 // Assert
132 urequire.Equal(t, tc.found, found)
133 })
134 }
135}
136
137func TestCountStorageMembers(t *testing.T) {
138 storage := commondao.NewMemberStorageWithGrouping()
139 storage.Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
140
141 g, err := storage.Grouping().Add("A")
142 urequire.NoError(t, err, "expect no error creating member group A")
143
144 g.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
145 g.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
146
147 g, err = storage.Grouping().Add("B")
148 urequire.NoError(t, err, "expect no error creating member group B")
149
150 g.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") // Add a member that exists in other group
151
152 s := commondao.MustNewReadonlyMemberStorage(storage)
153 uassert.Equal(t, 4, commondao.CountStorageMembers(s))
154}