Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

flag_storage_test.gno

4.91 Kb · 237 lines
  1package boards_test
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/nt/urequire/v0"
  7
  8	"gno.land/p/gnoland/boards/v0"
  9)
 10
 11func TestFlagStorageExists(t *testing.T) {
 12	tests := []struct {
 13		name   string
 14		setup  func() boards.FlagStorage
 15		user   address
 16		exists bool
 17	}{
 18		{
 19			name: "found",
 20			setup: func() boards.FlagStorage {
 21				s := boards.NewFlagStorage()
 22				s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
 23				return s
 24			},
 25			user:   "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 26			exists: true,
 27		},
 28		{
 29			name: "not found",
 30			setup: func() boards.FlagStorage {
 31				return boards.NewFlagStorage()
 32			},
 33			user:   "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 34			exists: false,
 35		},
 36	}
 37
 38	for _, tt := range tests {
 39		t.Run(tt.name, func(t *testing.T) {
 40			s := tt.setup()
 41
 42			urequire.Equal(t, tt.exists, s.Exists(tt.user))
 43		})
 44	}
 45}
 46
 47func TestFlagStorageAdd(t *testing.T) {
 48	tests := []struct {
 49		name   string
 50		setup  func() boards.FlagStorage
 51		flag   boards.Flag
 52		errMsg string
 53	}{
 54		{
 55			name: "ok",
 56			setup: func() boards.FlagStorage {
 57				return boards.NewFlagStorage()
 58			},
 59			flag: boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"},
 60		},
 61		{
 62			name: "flag exists",
 63			setup: func() boards.FlagStorage {
 64				s := boards.NewFlagStorage()
 65				s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
 66				return s
 67			},
 68			flag:   boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"},
 69			errMsg: "flag from user already exists: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 70		},
 71		{
 72			name: "invalid user address",
 73			setup: func() boards.FlagStorage {
 74				return boards.NewFlagStorage()
 75			},
 76			flag:   boards.Flag{User: "foo"},
 77			errMsg: "post flagging error, invalid user address: foo",
 78		},
 79	}
 80
 81	for _, tt := range tests {
 82		t.Run(tt.name, func(t *testing.T) {
 83			s := tt.setup()
 84
 85			err := s.Add(tt.flag)
 86
 87			if tt.errMsg != "" {
 88				urequire.Error(t, err, "expect an error")
 89				urequire.ErrorContains(t, err, tt.errMsg, "expect error to match")
 90				return
 91			}
 92
 93			urequire.NoError(t, err, "expect no error")
 94			urequire.True(t, s.Exists(tt.flag.User), "expect flag to be added")
 95		})
 96	}
 97}
 98
 99func TestFlagStorageRemove(t *testing.T) {
100	tests := []struct {
101		name    string
102		setup   func() boards.FlagStorage
103		address address
104		removed bool
105	}{
106		{
107			name: "ok",
108			setup: func() boards.FlagStorage {
109				s := boards.NewFlagStorage()
110				s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
111				return s
112			},
113			address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
114			removed: true,
115		},
116		{
117			name: "not found",
118			setup: func() boards.FlagStorage {
119				return boards.NewFlagStorage()
120			},
121			address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
122		},
123	}
124
125	for _, tt := range tests {
126		t.Run(tt.name, func(t *testing.T) {
127			s := tt.setup()
128
129			urequire.Equal(t, tt.removed, s.Remove(tt.address))
130		})
131	}
132}
133
134func TestFlagStorageSize(t *testing.T) {
135	tests := []struct {
136		name  string
137		setup func() boards.FlagStorage
138		size  int
139	}{
140		{
141			name: "empty",
142			setup: func() boards.FlagStorage {
143				return boards.NewFlagStorage()
144			},
145			size: 0,
146		},
147		{
148			name: "one flag",
149			setup: func() boards.FlagStorage {
150				s := boards.NewFlagStorage()
151				s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
152				return s
153			},
154			size: 1,
155		},
156		{
157			name: "multiple flags",
158			setup: func() boards.FlagStorage {
159				s := boards.NewFlagStorage()
160				s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
161				s.Add(boards.Flag{User: "g1skl80cuz8zq3lul9pgz5pc35l2pfzgxgfpsqkx"})
162				return s
163			},
164			size: 2,
165		},
166	}
167
168	for _, tt := range tests {
169		t.Run(tt.name, func(t *testing.T) {
170			s := tt.setup()
171
172			urequire.Equal(t, tt.size, s.Size())
173		})
174	}
175}
176
177func TestFlagStorageIterate(t *testing.T) {
178	// Listed in sorted (bech32-string) user order, which is the order
179	// Iterate yields them in.
180	flags := []boards.Flag{
181		{
182			User:   "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
183			Reason: "a",
184		},
185		{
186			User:   "g1skl80cuz8zq3lul9pgz5pc35l2pfzgxgfpsqkx",
187			Reason: "b",
188		},
189	}
190	tests := []struct {
191		name    string
192		setup   func() boards.FlagStorage
193		reverse bool
194		flags   []boards.Flag
195	}{
196		{
197			name: "default",
198			setup: func() boards.FlagStorage {
199				s := boards.NewFlagStorage()
200				s.Add(flags[0])
201				s.Add(flags[1])
202				return s
203			},
204			flags: flags,
205		},
206		{
207			name: "reverse",
208			setup: func() boards.FlagStorage {
209				s := boards.NewFlagStorage()
210				s.Add(flags[0])
211				s.Add(flags[1])
212				return s
213			},
214			reverse: true,
215			flags:   []boards.Flag{flags[1], flags[0]},
216		},
217	}
218
219	for _, tt := range tests {
220		t.Run(tt.name, func(t *testing.T) {
221			s := tt.setup()
222			count := s.Size()
223			if tt.reverse {
224				count = -count
225			}
226
227			var i int
228			s.Iterate(0, count, func(f boards.Flag) bool {
229				urequire.Equal(t, tt.flags[i].User, f.User, "expect user to match")
230				urequire.Equal(t, tt.flags[i].Reason, f.Reason, "expect reason to match")
231
232				i++
233				return false
234			})
235		})
236	}
237}