events_test.gno

6.24 Kb ยท 199 lines
  1package events
  2
  3import (
  4	"std"
  5	"strings"
  6	"testing"
  7	"time"
  8
  9	"gno.land/p/demo/uassert"
 10	"gno.land/p/demo/urequire"
 11)
 12
 13var (
 14	suRealm = std.NewUserRealm(su)
 15
 16	now              = "2009-02-13T23:31:30Z" // time.Now() is hardcoded to this value in the gno test machine currently
 17	parsedTimeNow, _ = time.Parse(time.RFC3339, now)
 18)
 19
 20func TestAddEvent(t *testing.T) {
 21	testing.SetRealm(suRealm)
 22
 23	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
 24	e1End := e1Start.Add(time.Hour * 4)
 25
 26	AddEvent("Event 1", "this event is upcoming", "gno.land", "gnome land", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
 27
 28	got := renderHome(false)
 29
 30	if !strings.Contains(got, "Event 1") {
 31		t.Fatalf("Expected to find Event 1 in render")
 32	}
 33
 34	e2Start := parsedTimeNow.Add(-time.Hour * 24 * 5)
 35	e2End := e2Start.Add(time.Hour * 4)
 36
 37	AddEvent("Event 2", "this event is in the past", "gno.land", "gnome land", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))
 38
 39	got = renderHome(false)
 40
 41	upcomingPos := strings.Index(got, "## Upcoming events")
 42	pastPos := strings.Index(got, "## Past events")
 43
 44	e1Pos := strings.Index(got, "Event 1")
 45	e2Pos := strings.Index(got, "Event 2")
 46
 47	// expected index ordering: upcoming < e1 < past < e2
 48	if e1Pos < upcomingPos || e1Pos > pastPos {
 49		t.Fatalf("Expected to find Event 1 in Upcoming events")
 50	}
 51
 52	if e2Pos < upcomingPos || e2Pos < pastPos || e2Pos < e1Pos {
 53		t.Fatalf("Expected to find Event 2 on auth different pos")
 54	}
 55
 56	// larger index => smaller startTime (future => past)
 57	if events[0].startTime.Unix() < events[1].startTime.Unix() {
 58		t.Fatalf("expected ordering to be different")
 59	}
 60}
 61
 62func TestAddEventErrors(t *testing.T) {
 63	testing.SetRealm(suRealm)
 64
 65	_, err := AddEvent("", "sample desc", "gno.land", "gnome land", "2009-02-13T23:31:31Z", "2009-02-13T23:33:31Z")
 66	uassert.ErrorIs(t, err, ErrEmptyName)
 67
 68	_, err = AddEvent("sample name", "sample desc", "gno.land", "gnome land", "", "2009-02-13T23:33:31Z")
 69	uassert.ErrorContains(t, err, ErrInvalidStartTime.Error())
 70
 71	_, err = AddEvent("sample name", "sample desc", "gno.land", "gnome land", "2009-02-13T23:31:31Z", "")
 72	uassert.ErrorContains(t, err, ErrInvalidEndTime.Error())
 73
 74	_, err = AddEvent("sample name", "sample desc", "gno.land", "gnome land", "2009-02-13T23:31:31Z", "2009-02-13T23:30:31Z")
 75	uassert.ErrorIs(t, err, ErrEndBeforeStart)
 76
 77	_, err = AddEvent("sample name", "sample desc", "gno.land", "gnome land", "2009-02-13T23:31:31+06:00", "2009-02-13T23:33:31+02:00")
 78	uassert.ErrorIs(t, err, ErrStartEndTimezonemMismatch)
 79
 80	tooLongDesc := `Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean ma`
 81	_, err = AddEvent("sample name", tooLongDesc, "gno.land", "gnome land", "2009-02-13T23:31:31Z", "2009-02-13T23:33:31Z")
 82	uassert.ErrorContains(t, err, ErrDescriptionTooLong.Error())
 83}
 84
 85func TestDeleteEvent(t *testing.T) {
 86	testing.SetRealm(suRealm)
 87
 88	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
 89	e1End := e1Start.Add(time.Hour * 4)
 90
 91	id, _ := AddEvent("ToDelete", "description", "gno.land", "gnome land", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
 92
 93	got := renderHome(false)
 94
 95	if !strings.Contains(got, "ToDelete") {
 96		t.Fatalf("Expected to find ToDelete event in render")
 97	}
 98
 99	DeleteEvent(id)
100	got = renderHome(false)
101
102	if strings.Contains(got, "ToDelete") {
103		t.Fatalf("Did not expect to find ToDelete event in render")
104	}
105}
106
107func TestEditEvent(t *testing.T) {
108	testing.SetRealm(suRealm)
109
110	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
111	e1End := e1Start.Add(time.Hour * 4)
112	loc := "gnome land"
113
114	id, _ := AddEvent("ToDelete", "description", "gno.land", loc, e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
115
116	newName := "New Name"
117	newDesc := "Normal description"
118	newLink := "new Link"
119	newST := e1Start.Add(time.Hour)
120	newET := newST.Add(time.Hour)
121
122	EditEvent(id, newName, newDesc, newLink, "", newST.Format(time.RFC3339), newET.Format(time.RFC3339))
123	edited, _, _ := GetEventByID(id)
124
125	// Check updated values
126	uassert.Equal(t, edited.name, newName)
127	uassert.Equal(t, edited.description, newDesc)
128	uassert.Equal(t, edited.link, newLink)
129	uassert.True(t, edited.startTime.Equal(newST))
130	uassert.True(t, edited.endTime.Equal(newET))
131
132	// Check if the old values are the same
133	uassert.Equal(t, edited.location, loc)
134}
135
136func TestInvalidEdit(t *testing.T) {
137	testing.SetRealm(suRealm)
138
139	uassert.PanicsWithMessage(t, ErrNoSuchID.Error(), func() {
140		EditEvent("123123", "", "", "", "", "", "")
141	})
142}
143
144func TestParseTimes(t *testing.T) {
145	// times not provided
146	// end time before start time
147	// timezone Missmatch
148
149	_, _, err := parseTimes("", "")
150	uassert.ErrorContains(t, err, ErrInvalidStartTime.Error())
151
152	_, _, err = parseTimes(now, "")
153	uassert.ErrorContains(t, err, ErrInvalidEndTime.Error())
154
155	_, _, err = parseTimes("2009-02-13T23:30:30Z", "2009-02-13T21:30:30Z")
156	uassert.ErrorContains(t, err, ErrEndBeforeStart.Error())
157
158	_, _, err = parseTimes("2009-02-10T23:30:30+02:00", "2009-02-13T21:30:33+05:00")
159	uassert.ErrorContains(t, err, ErrStartEndTimezonemMismatch.Error())
160}
161
162func TestRenderEventWidget(t *testing.T) {
163	testing.SetRealm(suRealm)
164
165	// No events yet
166	events = nil
167	out, err := RenderEventWidget(1)
168	uassert.NoError(t, err)
169	uassert.Equal(t, out, "No events.")
170
171	// Too many events
172	out, err = RenderEventWidget(MaxWidgetSize + 1)
173	uassert.ErrorIs(t, err, ErrMaxWidgetSize)
174
175	// Too little events
176	out, err = RenderEventWidget(0)
177	uassert.ErrorIs(t, err, ErrMinWidgetSize)
178
179	// Ordering & if requested amt is larger than the num of events that exist
180	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
181	e1End := e1Start.Add(time.Hour * 4)
182
183	e2Start := parsedTimeNow.Add(time.Hour * 24 * 10) // event 2 is after event 1
184	e2End := e2Start.Add(time.Hour * 4)
185
186	_, err = AddEvent("Event 1", "description", "gno.land", "loc", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
187	urequire.NoError(t, err)
188
189	_, err = AddEvent("Event 2", "description", "gno.land", "loc", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))
190	urequire.NoError(t, err)
191
192	out, err = RenderEventWidget(MaxWidgetSize)
193	urequire.NoError(t, err)
194
195	uniqueSequence := "- [" // sequence that is displayed once per each event as per the RenderEventWidget function
196	uassert.Equal(t, 2, strings.Count(out, uniqueSequence))
197
198	uassert.True(t, strings.Index(out, "Event 1") > strings.Index(out, "Event 2"))
199}