hof_test.gno

8.87 Kb ยท 338 lines
  1package hor
  2
  3import (
  4	"std"
  5	"testing"
  6
  7	"gno.land/p/demo/testutils"
  8	"gno.land/p/demo/uassert"
  9	"gno.land/p/demo/urequire"
 10	"gno.land/p/moul/addrset"
 11)
 12
 13const (
 14	rlmPath  = "gno.land/r/gnoland/home"
 15	rlmPath2 = "gno.land/r/gnoland/test2"
 16
 17	rlmPath3 = "gno.land/r/gnoland/test3"
 18	rlmPath4 = "gno.land/r/gnoland/test4"
 19	rlmPath5 = "gno.land/r/gnoland/test5"
 20
 21	validTitle         = "valid title"
 22	invalidTitle       = "This title is very very very long, longer than 30 characters"
 23	validDesc          = "valid description"
 24	invalidDescription = "This description is very very very long, longer than 50 characters"
 25)
 26
 27var (
 28	admin      = Ownable.Owner()
 29	adminRealm = std.NewUserRealm(admin)
 30	alice      = testutils.TestAddress("alice")
 31)
 32
 33func TestRegister(t *testing.T) {
 34	// Test user realm register
 35	aliceRealm := std.NewUserRealm(alice)
 36	testing.SetRealm(aliceRealm)
 37
 38	Register(cross, validTitle, validDesc)
 39	uassert.False(t, itemExists(t, rlmPath))
 40
 41	// Test register while paused
 42	testing.SetRealm(adminRealm)
 43	Pausable.Pause()
 44
 45	// Set legitimate caller
 46	testing.SetRealm(std.NewCodeRealm(rlmPath))
 47
 48	Register(cross, validTitle, validDesc)
 49	uassert.False(t, itemExists(t, rlmPath))
 50
 51	// Unpause
 52	testing.SetRealm(adminRealm)
 53	Pausable.Unpause()
 54
 55	// Set legitimate caller
 56	testing.SetRealm(std.NewCodeRealm(rlmPath))
 57	Register(cross, validTitle, validDesc)
 58
 59	// Find registered items
 60	uassert.True(t, itemExists(t, rlmPath))
 61
 62	// Test register with invalid title
 63	testing.SetRealm(std.NewCodeRealm(rlmPath2))
 64	Register(cross, invalidTitle, validDesc)
 65	uassert.False(t, itemExists(t, rlmPath2))
 66
 67	// Test register with invalid description
 68	testing.SetRealm(std.NewCodeRealm(rlmPath2))
 69	Register(cross, validTitle, invalidDescription)
 70	uassert.False(t, itemExists(t, rlmPath2))
 71}
 72
 73func TestUpvote(t *testing.T) {
 74	raw, _ := exhibition.items.Get(rlmPath)
 75	item := raw.(*Item)
 76
 77	// 0 upvotes by default
 78	urequire.Equal(t, item.upvote.Size(), 0)
 79
 80	testing.SetRealm(adminRealm)
 81
 82	urequire.NotPanics(t, func() {
 83		Upvote(cross, rlmPath)
 84	})
 85
 86	// Check both trees for 1 upvote
 87	uassert.Equal(t, item.upvote.Size(), 1)
 88
 89	// Check double upvote
 90	uassert.AbortsWithMessage(t, ErrDoubleUpvote.Error(), func() {
 91		Upvote(cross, rlmPath)
 92	})
 93}
 94
 95func TestDownvote(t *testing.T) {
 96	raw, _ := exhibition.items.Get(rlmPath)
 97	item := raw.(*Item)
 98
 99	// 0 downvotes by default
100	urequire.Equal(t, item.downvote.Size(), 0)
101
102	userRealm := std.NewUserRealm(alice)
103	testing.SetRealm(userRealm)
104
105	urequire.NotPanics(t, func() {
106		Downvote(cross, rlmPath)
107	})
108
109	// Check both trees for 1 upvote
110	uassert.Equal(t, item.downvote.Size(), 1)
111
112	// Check double downvote
113	uassert.AbortsWithMessage(t, ErrDoubleDownvote.Error(), func() {
114		Downvote(cross, rlmPath)
115	})
116}
117
118func TestDelete(t *testing.T) {
119	userRealm := std.NewUserRealm(admin)
120	testing.SetRealm(userRealm)
121	testing.SetOriginCaller(admin)
122
123	uassert.AbortsWithMessage(t, ErrNoSuchItem.Error(), func() {
124		Delete(cross, "nonexistentpkgpath")
125	})
126
127	i, _ := exhibition.items.Get(rlmPath)
128	_ = i.(*Item).id
129
130	uassert.NotPanics(t, func() {
131		Delete(cross, rlmPath)
132	})
133
134	uassert.False(t, exhibition.items.Has(rlmPath))
135}
136
137func itemExists(t *testing.T, rlmPath string) bool {
138	t.Helper()
139
140	_, ok1 := exhibition.items.Get(rlmPath)
141
142	return ok1
143}
144
145func TestgetVoteSortKey(t *testing.T) {
146	i := &Item{
147		id:          1,
148		title:       validTitle,
149		description: validDesc,
150		pkgpath:     rlmPath,
151		blockNum:    std.ChainHeight(),
152		upvote:      &addrset.Set{},
153		downvote:    &addrset.Set{},
154	}
155
156	i.upvote.Add(alice)
157
158	generatedKey := getVoteSortKey(i.upvote.Size(), i.id)
159	expectedKey := "0000000001:1"
160
161	urequire.Equal(t, generatedKey, expectedKey)
162}
163
164func TestSortByUpvote(t *testing.T) {
165	// Remove all items from all trees
166	exhibition.items.Iterate("", "", func(key string, value interface{}) bool {
167		exhibition.items.Remove(key)
168		return false
169	})
170	exhibition.itemsSortedByUpvotes.Iterate("", "", func(key string, value interface{}) bool {
171		exhibition.itemsSortedByUpvotes.Remove(key)
172		return false
173	})
174	exhibition.itemsSortedByDownvotes.Iterate("", "", func(key string, value interface{}) bool {
175		exhibition.itemsSortedByDownvotes.Remove(key)
176		return false
177	})
178	exhibition.itemsSortedByCreation.Iterate("", "", func(key string, value interface{}) bool {
179		exhibition.itemsSortedByCreation.Remove(key)
180		return false
181	})
182
183	// Add items
184	testing.SetRealm(std.NewCodeRealm(rlmPath3))
185	Register(cross, validTitle, validDesc)
186
187	testing.SetRealm(std.NewCodeRealm(rlmPath4))
188	Register(cross, validTitle, validDesc)
189
190	testing.SetRealm(std.NewCodeRealm(rlmPath5))
191	Register(cross, validTitle, validDesc)
192
193	user1 := testutils.TestAddress("user1")
194	user2 := testutils.TestAddress("user2")
195	user3 := testutils.TestAddress("user3")
196
197	testing.SetOriginCaller(user1)
198	testing.SetRealm(std.NewUserRealm(user1))
199	Upvote(cross, rlmPath3)
200	Upvote(cross, rlmPath4)
201	Upvote(cross, rlmPath5)
202
203	testing.SetOriginCaller(user2)
204	testing.SetRealm(std.NewUserRealm(user2))
205	Upvote(cross, rlmPath4)
206	Upvote(cross, rlmPath5)
207
208	testing.SetOriginCaller(user3)
209	testing.SetRealm(std.NewUserRealm(user3))
210	Upvote(cross, rlmPath5)
211
212	// We are displaying data in reverse order in render, so items should be sorted in reverse order
213	_, firstRawValue := exhibition.itemsSortedByUpvotes.GetByIndex(0)
214	firstValue := firstRawValue.(*Item)
215	uassert.Equal(t, firstValue.pkgpath, rlmPath3)
216
217	_, secondRawValue := exhibition.itemsSortedByUpvotes.GetByIndex(1)
218	secondValue := secondRawValue.(*Item)
219	uassert.Equal(t, secondValue.pkgpath, rlmPath4)
220}
221
222func TestSortByDownvote(t *testing.T) {
223	// Remove all items from all trees
224	exhibition.items.Iterate("", "", func(key string, value interface{}) bool {
225		exhibition.items.Remove(key)
226		return false
227	})
228	exhibition.itemsSortedByUpvotes.Iterate("", "", func(key string, value interface{}) bool {
229		exhibition.itemsSortedByUpvotes.Remove(key)
230		return false
231	})
232	exhibition.itemsSortedByDownvotes.Iterate("", "", func(key string, value interface{}) bool {
233		exhibition.itemsSortedByDownvotes.Remove(key)
234		return false
235	})
236	exhibition.itemsSortedByCreation.Iterate("", "", func(key string, value interface{}) bool {
237		exhibition.itemsSortedByCreation.Remove(key)
238		return false
239	})
240
241	// Add items
242	testing.SetRealm(std.NewCodeRealm(rlmPath3))
243	Register(cross, validTitle, validDesc)
244
245	testing.SetRealm(std.NewCodeRealm(rlmPath4))
246	Register(cross, validTitle, validDesc)
247
248	testing.SetRealm(std.NewCodeRealm(rlmPath5))
249	Register(cross, validTitle, validDesc)
250
251	user1 := testutils.TestAddress("user1")
252	user2 := testutils.TestAddress("user2")
253	user3 := testutils.TestAddress("user3")
254
255	testing.SetOriginCaller(user1)
256	testing.SetRealm(std.NewUserRealm(user1))
257	Downvote(cross, rlmPath3)
258	Downvote(cross, rlmPath4)
259	Downvote(cross, rlmPath5)
260
261	testing.SetOriginCaller(user2)
262	testing.SetRealm(std.NewUserRealm(user2))
263	Downvote(cross, rlmPath4)
264	Downvote(cross, rlmPath5)
265
266	testing.SetOriginCaller(user3)
267	testing.SetRealm(std.NewUserRealm(user3))
268	Downvote(cross, rlmPath5)
269
270	// We are dispalying data is reverse order in render, so items should be sorted in reverse order
271	_, firstRawValue := exhibition.itemsSortedByDownvotes.GetByIndex(0)
272
273	firstValue := firstRawValue.(*Item)
274
275	uassert.Equal(t, firstValue.pkgpath, rlmPath3)
276
277	_, secondRawValue := exhibition.itemsSortedByDownvotes.GetByIndex(1)
278
279	secondValue := secondRawValue.(*Item)
280
281	uassert.Equal(t, secondValue.pkgpath, rlmPath4)
282}
283
284func TestSortByCreation(t *testing.T) {
285	// Remove all items from all trees
286	exhibition.items.Iterate("", "", func(key string, value interface{}) bool {
287		exhibition.items.Remove(key)
288		return false
289	})
290	exhibition.itemsSortedByUpvotes.Iterate("", "", func(key string, value interface{}) bool {
291		exhibition.itemsSortedByUpvotes.Remove(key)
292		return false
293	})
294	exhibition.itemsSortedByDownvotes.Iterate("", "", func(key string, value interface{}) bool {
295		exhibition.itemsSortedByDownvotes.Remove(key)
296		return false
297	})
298	exhibition.itemsSortedByCreation.Iterate("", "", func(key string, value interface{}) bool {
299		exhibition.itemsSortedByCreation.Remove(key)
300		return false
301	})
302
303	testing.SkipHeights(10)
304	testing.SetRealm(std.NewCodeRealm(rlmPath3))
305	Register(cross, validTitle, validDesc)
306
307	testing.SkipHeights(10)
308	testing.SetRealm(std.NewCodeRealm(rlmPath4))
309	Register(cross, validTitle, validDesc)
310
311	testing.SkipHeights(10)
312	testing.SetRealm(std.NewCodeRealm(rlmPath5))
313	Register(cross, validTitle, validDesc)
314
315	// We are dispalying data is reverse order in render, so items should be sorted in reverse order
316	_, firstRawValue := exhibition.itemsSortedByCreation.GetByIndex(0)
317
318	firstValue := firstRawValue.(*Item)
319
320	uassert.Equal(t, firstValue.pkgpath, rlmPath3)
321
322	_, secondRawValue := exhibition.itemsSortedByCreation.GetByIndex(1)
323
324	secondValue := secondRawValue.(*Item)
325
326	uassert.Equal(t, secondValue.pkgpath, rlmPath4)
327}
328
329/* XXX fix @moul
330func TestGetScore(t *testing.T) {
331	score, err := h.GetScore(42)
332	uassert.Nil(t, err)
333	uassert.Equal(t, 0, score)
334	uassert.NotPanics(t, func() {
335		uassert.Equal(t, 0, h.MustGetScore(42))
336	})
337}
338*/