eventreg_test.gno

8.60 Kb ยท 265 lines
  1package eventreg
  2
  3import (
  4	"std"
  5	"strings"
  6	"testing"
  7	"time"
  8
  9	"gno.land/p/demo/urequire"
 10	"gno.land/p/zenao/events"
 11	zenaov1 "gno.land/p/zenao/zenao/v1"
 12)
 13
 14// XXX: Add tests for multiple organizers
 15func TestEvents(t *testing.T) {
 16	initialOwner := std.Address("g1djrkw9tf4px658j85cc6fhsvm50uf9s0g6kfsm") // zenao-dev-admin
 17	std.TestSetRealm(std.NewUserRealm(initialOwner))
 18
 19	nextYearUnix := time.Now().Add(time.Hour * 24 * 365).Unix()
 20	lastYearUnix := time.Now().Add(-time.Hour * 24 * 365).Unix()
 21
 22	// list no events
 23	{
 24		events := listEvents(time.Now().Unix(), nextYearUnix, 10, 0)
 25		urequire.Equal(t, 0, len(events))
 26	}
 27
 28	// inject evts
 29	getters := map[string]events.InfoGetter{}
 30	evts := []*struct {
 31		id         string
 32		organizers []string
 33		endDate    time.Time
 34	}{
 35		{"gno.land/r/zenao/events/1-future-event-month", []string{"alice"}, time.Now().Add(30 * 24 * time.Hour)},
 36		{"gno.land/r/zenao/events/2-future-event-day", []string{"bob"}, time.Now().Add(24 * time.Hour)},
 37		{"gno.land/r/zenao/events/3-past-event-hour", []string{"alice"}, time.Now().Add(-time.Hour)},
 38		{"gno.land/r/zenao/events/4-past-event-day", []string{"bob"}, time.Now().Add(-24 * time.Hour)},
 39		{"gno.land/r/zenao/events/5-past-event-month", []string{"alice"}, time.Now().Add(-30 * 24 * time.Hour)},
 40		{"gno.land/r/zenao/events/6-event-will-change", []string{"bob"}, time.Now().Add(-60 * 24 * time.Hour)},
 41	}
 42	for _, evt := range evts {
 43		// XXX: `ev := evt` and using ev in place of evt will cause "gno.land/r/zenao/eventreg: test pkg: panic: unexpected type heapitem"
 44		std.TestSetRealm(std.NewCodeRealm(evt.id))
 45		getters[evt.id] = func() *zenaov1.EventInfo {
 46			return &zenaov1.EventInfo{
 47				Organizers: evt.organizers,
 48				EndDate:    evt.endDate.Unix(),
 49			}
 50		}
 51		Register(getters[evt.id])
 52		std.TestSetRealm(std.NewUserRealm(initialOwner))
 53
 54		IndexEvent(evt.id)
 55	}
 56
 57	// list upcoming events
 58	{
 59		events := listEvents(time.Now().Unix(), nextYearUnix, 10, 0)
 60		urequire.Equal(t, `2-future-event-day, 1-future-event-month`, eventsString(events), "future events list should match")
 61	}
 62	// list past events
 63	{
 64		events := listEvents(time.Now().Unix(), lastYearUnix, 10, 0)
 65		urequire.Equal(t, `3-past-event-hour, 4-past-event-day, 5-past-event-month, 6-event-will-change`, eventsString(events))
 66	}
 67
 68	// list events by organizer
 69	{
 70		// from future to past
 71		events := listEventsByOrganizer("alice", nextYearUnix, lastYearUnix, 10, 0)
 72		urequire.Equal(t, `1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
 73	}
 74	{
 75		// from past to future
 76		events := listEventsByOrganizer("bob", lastYearUnix, nextYearUnix, 10, 0)
 77		urequire.Equal(t, `6-event-will-change, 4-past-event-day, 2-future-event-day`, eventsString(events))
 78	}
 79	{
 80		// none
 81		events := listEventsByOrganizer("eve", lastYearUnix, nextYearUnix, 10, 0)
 82		urequire.Equal(t, 0, len(events))
 83	}
 84
 85	// inject participants
 86	participants := []struct {
 87		id        string
 88		eventIdxs []int
 89	}{
 90		{"eve", []int{0, 2, 4}},
 91		{"carol", []int{1, 3, 5}},
 92	}
 93	for _, p := range participants {
 94		for _, eventIdx := range p.eventIdxs {
 95			evt := evts[eventIdx]
 96			AddParticipant(evt.id, p.id)
 97		}
 98	}
 99
100	// list events by participant
101	{
102		// from future to past
103		events := listEventsByParticipant("eve", nextYearUnix, lastYearUnix, 10, 0)
104		urequire.Equal(t, `1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
105	}
106	{
107		// from past to future
108		events := listEventsByParticipant("carol", lastYearUnix, nextYearUnix, 10, 0)
109		urequire.Equal(t, `6-event-will-change, 4-past-event-day, 2-future-event-day`, eventsString(events))
110	}
111	{
112		// none
113		events := listEventsByParticipant("alice", lastYearUnix, nextYearUnix, 10, 0)
114		urequire.Equal(t, 0, len(events))
115	}
116
117	// chane event endDate and rerun all tests
118
119	evts[5].endDate = time.Now().Add(60 * 24 * time.Hour)
120	UpdateIndex(evts[5].id)
121
122	// list upcoming events
123	{
124		events := listEvents(time.Now().Unix(), nextYearUnix, 10, 0)
125		urequire.Equal(t, `2-future-event-day, 1-future-event-month, 6-event-will-change`, eventsString(events))
126	}
127	{
128		// list upcoming events with offset 1
129		events := listEvents(time.Now().Unix(), nextYearUnix, 10, 1)
130		urequire.Equal(t, `1-future-event-month, 6-event-will-change`, eventsString(events))
131	}
132	// list past events
133	{
134		events := listEvents(time.Now().Unix(), lastYearUnix, 10, 0)
135		urequire.Equal(t, `3-past-event-hour, 4-past-event-day, 5-past-event-month`, eventsString(events))
136	}
137	// list past events with offset 1 and limit 1
138	{
139		events := listEvents(time.Now().Unix(), lastYearUnix, 1, 1)
140		urequire.Equal(t, `4-past-event-day`, eventsString(events))
141	}
142	// list past event with offset 1
143	{
144		events := listEvents(time.Now().Unix(), lastYearUnix, 10, 1)
145		urequire.Equal(t, `4-past-event-day, 5-past-event-month`, eventsString(events))
146	}
147
148	// list events by organizer
149	{
150		// from future to past
151		events := listEventsByOrganizer("alice", nextYearUnix, lastYearUnix, 10, 0)
152		urequire.Equal(t, `1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
153	}
154	{
155		// from past to future
156		events := listEventsByOrganizer("bob", lastYearUnix, nextYearUnix, 10, 0)
157		urequire.Equal(t, `4-past-event-day, 2-future-event-day, 6-event-will-change`, eventsString(events))
158	}
159
160	// list events by participant
161	{
162		// from future to past
163		events := listEventsByParticipant("eve", nextYearUnix, lastYearUnix, 10, 0)
164		urequire.Equal(t, `1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
165	}
166	{
167		// from future to past with offset 2
168		events := listEventsByParticipant("eve", nextYearUnix, lastYearUnix, 10, 2)
169		urequire.Equal(t, `5-past-event-month`, eventsString(events))
170	}
171	{
172		// from past to future
173		events := listEventsByParticipant("carol", lastYearUnix, nextYearUnix, 10, 0)
174		urequire.Equal(t, `4-past-event-day, 2-future-event-day, 6-event-will-change`, eventsString(events))
175	}
176	{
177		// none
178		events := listEventsByParticipant("alice", lastYearUnix, nextYearUnix, 10, 0)
179		urequire.Equal(t, 0, len(events))
180	}
181
182	// chane event organizer and rerun all tests
183
184	evts[5].organizers = []string{"alice"}
185	UpdateIndex(evts[5].id)
186
187	// list upcoming events
188	{
189		events := listEvents(time.Now().Unix(), nextYearUnix, 10, 0)
190		urequire.Equal(t, `2-future-event-day, 1-future-event-month, 6-event-will-change`, eventsString(events))
191	}
192	// list past events
193	{
194		events := listEvents(time.Now().Unix(), lastYearUnix, 10, 0)
195		urequire.Equal(t, `3-past-event-hour, 4-past-event-day, 5-past-event-month`, eventsString(events))
196	}
197
198	// list events by organizer
199	{
200		// from future to past
201		events := listEventsByOrganizer("alice", nextYearUnix, lastYearUnix, 10, 0)
202		urequire.Equal(t, `6-event-will-change, 1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
203	}
204	{
205		// from future to past with offset 2
206		events := listEventsByOrganizer("alice", nextYearUnix, lastYearUnix, 10, 2)
207		urequire.Equal(t, `3-past-event-hour, 5-past-event-month`, eventsString(events))
208	}
209	{
210		// from past to future
211		events := listEventsByOrganizer("bob", lastYearUnix, nextYearUnix, 10, 0)
212		urequire.Equal(t, `4-past-event-day, 2-future-event-day`, eventsString(events))
213	}
214	{
215		// from past to future with offset 2
216		events := listEventsByOrganizer("bob", lastYearUnix, nextYearUnix, 10, 2)
217		urequire.Equal(t, 0, len(events))
218	}
219
220	// list events by participant
221	{
222		// from future to past
223		events := listEventsByParticipant("eve", nextYearUnix, lastYearUnix, 10, 0)
224		urequire.Equal(t, `1-future-event-month, 3-past-event-hour, 5-past-event-month`, eventsString(events))
225	}
226	{
227		// from past to future
228		events := listEventsByParticipant("carol", lastYearUnix, nextYearUnix, 10, 0)
229		urequire.Equal(t, `4-past-event-day, 2-future-event-day, 6-event-will-change`, eventsString(events))
230	}
231	{
232		// none
233		events := listEventsByParticipant("alice", lastYearUnix, nextYearUnix, 10, 0)
234		urequire.Equal(t, 0, len(events))
235	}
236}
237
238func TestEventsToJSON(t *testing.T) {
239	evts := []*zenaov1.EventInfo{{
240		PkgPath: "foo",
241		Location: &zenaov1.EventLocation{Address: &zenaov1.AddressCustom{
242			Address:  "Paris",
243			Timezone: "Europe/Paris",
244		}},
245	}}
246	urequire.Equal(t, `[{"location":{"custom":{"address":"Paris","timezone":"Europe/Paris"}},"pkgPath":"foo"}]`, eventsToJSON(evts))
247}
248
249func TestLocationToString(t *testing.T) {
250	loc := &zenaov1.EventLocation{Address: &zenaov1.AddressCustom{
251		Address:  "Paris",
252		Timezone: "Europe/Paris",
253	}}
254	str, err := events.LocationString(loc)
255	urequire.NoError(t, err)
256	urequire.Equal(t, "Paris", str)
257}
258
259func eventsString(evts []*zenaov1.EventInfo) string {
260	res := []string{}
261	for _, evt := range evts {
262		res = append(res, strings.TrimPrefix(evt.PkgPath, "gno.land/r/zenao/events/"))
263	}
264	return strings.Join(res, ", ")
265}