Search Apps Documentation Source Content File Folder Download Copy Actions Download

events_test.gno

6.51 Kb ยท 201 lines
  1package events
  2
  3import (
  4	"strings"
  5	"testing"
  6	"time"
  7
  8	"gno.land/p/nt/uassert"
  9	"gno.land/p/nt/urequire"
 10)
 11
 12var (
 13	suRealm          = testing.NewUserRealm(address("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"))
 14	now              = "2009-02-13T23:31:30Z" // time.Now() is hardcoded to this value in the gno test machine currently
 15	parsedTimeNow, _ = time.Parse(time.RFC3339, now)
 16)
 17
 18func TestAddEvent(t *testing.T) {
 19	testing.SetRealm(suRealm)
 20
 21	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
 22	e1End := e1Start.Add(time.Hour * 4)
 23
 24	_, err := AddEvent(cross, "Event 1", "this event is upcoming", "gno.land", "gnome land", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
 25
 26	urequire.NoError(t, err)
 27	got := renderHome(false)
 28
 29	if !strings.Contains(got, "Event 1") {
 30		t.Fatalf("Expected to find Event 1 in render")
 31	}
 32
 33	e2Start := parsedTimeNow.Add(-time.Hour * 24 * 5)
 34	e2End := e2Start.Add(time.Hour * 4)
 35
 36	_, err = AddEvent(cross, "Event 2", "this event is in the past", "gno.land", "gnome land", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))
 37	urequire.NoError(t, err)
 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(cross, "", "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(cross, "sample name", "sample desc", "gno.land", "gnome land", "", "2009-02-13T23:33:31Z")
 69	uassert.ErrorContains(t, err, ErrInvalidStartTime.Error())
 70
 71	_, err = AddEvent(cross, "sample name", "sample desc", "gno.land", "gnome land", "2009-02-13T23:31:31Z", "")
 72	uassert.ErrorContains(t, err, ErrInvalidEndTime.Error())
 73
 74	_, err = AddEvent(cross, "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(cross, "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(cross, "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, err := AddEvent(cross, "ToDelete", "description", "gno.land", "gnome land", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
 92	urequire.NoError(t, err)
 93
 94	got := renderHome(false)
 95
 96	if !strings.Contains(got, "ToDelete") {
 97		t.Fatalf("Expected to find ToDelete event in render")
 98	}
 99
100	DeleteEvent(cross, id)
101	got = renderHome(false)
102
103	if strings.Contains(got, "ToDelete") {
104		t.Fatalf("Did not expect to find ToDelete event in render")
105	}
106}
107
108func TestEditEvent(t *testing.T) {
109	testing.SetRealm(suRealm)
110
111	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
112	e1End := e1Start.Add(time.Hour * 4)
113	loc := "gnome land"
114
115	id, err := AddEvent(cross, "ToDelete", "description", "gno.land", loc, e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
116	urequire.NoError(t, err)
117
118	newName := "New Name"
119	newDesc := "Normal description"
120	newLink := "new Link"
121	newST := e1Start.Add(time.Hour)
122	newET := newST.Add(time.Hour)
123
124	EditEvent(cross, id, newName, newDesc, newLink, "", newST.Format(time.RFC3339), newET.Format(time.RFC3339))
125	edited, _, _ := GetEventByID(id)
126
127	// Check updated values
128	uassert.Equal(t, edited.name, newName)
129	uassert.Equal(t, edited.description, newDesc)
130	uassert.Equal(t, edited.link, newLink)
131	uassert.True(t, edited.startTime.Equal(newST))
132	uassert.True(t, edited.endTime.Equal(newET))
133
134	// Check if the old values are the same
135	uassert.Equal(t, edited.location, loc)
136}
137
138func TestInvalidEdit(t *testing.T) {
139	testing.SetRealm(suRealm)
140
141	uassert.AbortsWithMessage(t, ErrNoSuchID.Error(), func() {
142		EditEvent(cross, "123123", "", "", "", "", "", "")
143	})
144}
145
146func TestParseTimes(t *testing.T) {
147	// times not provided
148	// end time before start time
149	// timezone Missmatch
150
151	_, _, err := parseTimes("", "")
152	uassert.ErrorContains(t, err, ErrInvalidStartTime.Error())
153
154	_, _, err = parseTimes(now, "")
155	uassert.ErrorContains(t, err, ErrInvalidEndTime.Error())
156
157	_, _, err = parseTimes("2009-02-13T23:30:30Z", "2009-02-13T21:30:30Z")
158	uassert.ErrorContains(t, err, ErrEndBeforeStart.Error())
159
160	_, _, err = parseTimes("2009-02-10T23:30:30+02:00", "2009-02-13T21:30:33+05:00")
161	uassert.ErrorContains(t, err, ErrStartEndTimezonemMismatch.Error())
162}
163
164func TestRenderEventWidget(t *testing.T) {
165	testing.SetRealm(suRealm)
166
167	// No events yet
168	events = nil
169	out, err := RenderEventWidget(1)
170	uassert.NoError(t, err)
171	uassert.Equal(t, out, "No events.")
172
173	// Too many events
174	out, err = RenderEventWidget(MaxWidgetSize + 1)
175	uassert.ErrorIs(t, err, ErrMaxWidgetSize)
176
177	// Too little events
178	out, err = RenderEventWidget(0)
179	uassert.ErrorIs(t, err, ErrMinWidgetSize)
180
181	// Ordering & if requested amt is larger than the num of events that exist
182	e1Start := parsedTimeNow.Add(time.Hour * 24 * 5)
183	e1End := e1Start.Add(time.Hour * 4)
184
185	e2Start := parsedTimeNow.Add(time.Hour * 24 * 10) // event 2 is after event 1
186	e2End := e2Start.Add(time.Hour * 4)
187
188	_, err = AddEvent(cross, "Event 1", "description", "gno.land", "loc", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))
189	urequire.NoError(t, err)
190
191	_, err = AddEvent(cross, "Event 2", "description", "gno.land", "loc", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))
192	urequire.NoError(t, err)
193
194	out, err = RenderEventWidget(MaxWidgetSize)
195	urequire.NoError(t, err)
196
197	uniqueSequence := "- [" // sequence that is displayed once per each event as per the RenderEventWidget function
198	uassert.Equal(t, 2, strings.Count(out, uniqueSequence))
199
200	uassert.True(t, strings.Index(out, "Event 1") > strings.Index(out, "Event 2"))
201}