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}