Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}