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}