eintopf.info@v0.13.16/service/eventsearch/index_test.go (about) 1 // Copyright (C) 2022 The Eintopf authors 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <https://www.gnu.org/licenses/>. 15 16 package eventsearch_test 17 18 import ( 19 "context" 20 "testing" 21 "time" 22 23 "github.com/google/go-cmp/cmp" 24 "github.com/google/go-cmp/cmp/cmpopts" 25 26 "eintopf.info/service/auth" 27 "eintopf.info/service/event" 28 "eintopf.info/service/eventsearch" 29 "eintopf.info/service/group" 30 "eintopf.info/service/place" 31 "eintopf.info/service/revent" 32 "eintopf.info/service/search" 33 "eintopf.info/test" 34 ) 35 36 func TestEventDocumentsFromEvent(t *testing.T) { 37 tests := []struct { 38 name string 39 40 events []*event.NewEvent 41 groups []*group.NewGroup 42 places []*place.NewPlace 43 44 event *event.Event 45 wantDocs []*eventsearch.EventDocument 46 }{ 47 { 48 name: "basics", 49 event: &event.Event{ 50 Name: "foo", 51 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 52 }, 53 wantDocs: []*eventsearch.EventDocument{ 54 { 55 Name: "foo", 56 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 57 Date: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 58 MultiDay: -1, 59 Organizers: []eventsearch.Organizer{}, 60 }, 61 }, 62 }, 63 { 64 name: "multi day", 65 event: &event.Event{ 66 Name: "foo", 67 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 68 End: tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)), 69 }, 70 wantDocs: []*eventsearch.EventDocument{ 71 { 72 Name: "foo", 73 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 74 End: tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)), 75 MultiDay: -2, 76 Organizers: []eventsearch.Organizer{}, 77 }, 78 { 79 Name: "foo", 80 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 81 End: tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)), 82 Date: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 83 MultiDay: 1, 84 Organizers: []eventsearch.Organizer{}, 85 }, 86 { 87 Name: "foo", 88 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 89 End: tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)), 90 Date: time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC), 91 MultiDay: 2, 92 Organizers: []eventsearch.Organizer{}, 93 }, 94 }, 95 }, 96 { 97 name: "sub event", 98 events: []*event.NewEvent{ 99 { 100 Name: "bar", 101 Published: true, 102 Parent: "id:abcd", 103 Start: time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC), 104 }, 105 }, 106 event: &event.Event{ 107 ID: "abcd", 108 Name: "foo", 109 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 110 }, 111 wantDocs: []*eventsearch.EventDocument{ 112 { 113 ID: "abcd", 114 Name: "foo", 115 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 116 Date: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 117 MultiDay: -1, 118 Organizers: []eventsearch.Organizer{}, 119 Children: []*eventsearch.EventDocument{ 120 { 121 ID: "0", 122 Published: true, 123 Name: "bar", 124 Start: time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC), 125 Date: time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC), 126 MultiDay: -1, 127 Organizers: []eventsearch.Organizer{}, 128 }, 129 }, 130 }, 131 }, 132 }, 133 { 134 name: "multiday sub event", 135 events: []*event.NewEvent{ 136 { 137 Name: "bar", 138 Published: true, 139 Parent: "id:abcd", 140 Start: time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC), 141 }, 142 { 143 Name: "bar2", 144 Published: true, 145 Parent: "id:abcd", 146 Start: time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC), 147 }, 148 }, 149 event: &event.Event{ 150 ID: "abcd", 151 Name: "foo", 152 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 153 End: tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)), 154 }, 155 wantDocs: []*eventsearch.EventDocument{ 156 { 157 ID: "abcd", 158 Name: "foo", 159 Organizers: []eventsearch.Organizer{}, 160 MultiDay: -2, 161 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 162 End: tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)), 163 Children: []*eventsearch.EventDocument{ 164 { 165 ID: "0", 166 Published: true, 167 Name: "bar", 168 Start: time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC), 169 Date: time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC), 170 MultiDay: -1, 171 Organizers: []eventsearch.Organizer{}, 172 }, 173 { 174 ID: "1", 175 Published: true, 176 Name: "bar2", 177 Start: time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC), 178 Date: time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC), 179 MultiDay: -1, 180 Organizers: []eventsearch.Organizer{}, 181 }, 182 }, 183 }, 184 { 185 ID: "abcd", 186 Name: "foo", 187 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 188 End: tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)), 189 Date: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 190 MultiDay: 1, 191 Organizers: []eventsearch.Organizer{}, 192 Children: []*eventsearch.EventDocument{}, 193 }, 194 { 195 ID: "abcd", 196 Name: "foo", 197 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 198 End: tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)), 199 Date: time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC), 200 MultiDay: 2, 201 Organizers: []eventsearch.Organizer{}, 202 Children: []*eventsearch.EventDocument{ 203 { 204 ID: "0", 205 Published: true, 206 Name: "bar", 207 Start: time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC), 208 Date: time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC), 209 MultiDay: -1, 210 Organizers: []eventsearch.Organizer{}, 211 }, 212 }, 213 }, 214 { 215 ID: "abcd", 216 Name: "foo", 217 Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC), 218 End: tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)), 219 Date: time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC), 220 MultiDay: 3, 221 Organizers: []eventsearch.Organizer{}, 222 Children: []*eventsearch.EventDocument{ 223 { 224 ID: "1", 225 Published: true, 226 Name: "bar2", 227 Start: time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC), 228 Date: time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC), 229 MultiDay: -1, 230 Organizers: []eventsearch.Organizer{}, 231 }, 232 }, 233 }, 234 }, 235 }, 236 } 237 238 for _, tc := range tests { 239 t.Run(tc.name, func(t *testing.T) { 240 index, cleanupIndex := test.CreateBleveTestIndex(tc.name) 241 t.Cleanup(cleanupIndex) 242 searchService, err := search.NewService(index, time.Second, 1, 1, time.UTC) 243 if err != nil { 244 t.Fatalf("search.NewService: %s", err) 245 } 246 247 eventService := event.NewService(event.NewMemoryStore(), nil) 248 groupService := group.NewService(group.NewMemoryStore()) 249 placeService := place.NewService(place.NewMemoryStore()) 250 reventService := revent.NewService(revent.NewMemoryStore(), eventService) 251 252 ctx := auth.ContextWithID(context.Background(), "my_id") 253 for _, e := range tc.events { 254 if _, err := eventService.Create(ctx, e); err != nil { 255 t.Fatalf("create events: %s", err) 256 } 257 } 258 for _, g := range tc.groups { 259 if _, err := groupService.Create(ctx, g); err != nil { 260 t.Fatalf("create group: %s", err) 261 } 262 } 263 for _, p := range tc.places { 264 if _, err := placeService.Create(ctx, p); err != nil { 265 t.Fatalf("create place: %s", err) 266 } 267 } 268 269 eventsearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService) 270 docs := eventsearchService.EventDocumentsFromEvent(tc.event) 271 272 if diff := cmp.Diff(tc.wantDocs, docs, cmpopts.IgnoreUnexported(eventsearch.EventDocument{})); diff != "" { 273 t.Errorf("docs mismatch (-want +got):\n%s", diff) 274 } 275 }) 276 } 277 } 278 279 func TestEventDocumentSearchFields(t *testing.T) { 280 doc := &eventsearch.EventDocument{ 281 ID: "1", 282 Name: "foo", 283 Organizers: []eventsearch.Organizer{ 284 {Name: "oar"}, 285 {Group: &group.Group{ID: "aaa", Name: "foo"}}, 286 }, 287 Involved: []event.Involved{ 288 {Name: "foo", Description: "foo bar foo"}, 289 }, 290 Location: &eventsearch.Location{Name: "lar"}, 291 Description: "one two three", 292 Date: time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC), 293 Start: time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC), 294 End: tptr(time.Date(2021, 4, 7, 11, 0, 0, 0, time.UTC)), 295 Tags: []string{"a", "b"}, 296 Published: true, 297 Listed: false, 298 } 299 searchFields := doc.SearchFields() 300 want := map[string]interface{}{ 301 "is": []string{"a", "b", "event"}, 302 "id": "1", 303 "organizers": []string{"oar", "foo"}, 304 "groupID": []string{"aaa"}, 305 "involved": []string{`{"name":"foo","description":"foo bar foo"}`}, 306 "location": "lar", 307 "location2": "", 308 "placeID": "", 309 "tag": []string{"a", "b"}, 310 "name": "foo", 311 "start": time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC), 312 "end": tptr(time.Date(2021, 4, 7, 11, 0, 0, 0, time.UTC)), 313 "date": time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC), 314 "day": time.Date(2021, 4, 4, 0, 0, 0, 0, time.UTC), 315 "multiday": 0, 316 "listed": false, 317 "published": true, 318 "ownedBy": []string(nil), 319 "children": false, 320 } 321 322 if diff := cmp.Diff(want, searchFields); diff != "" { 323 t.Errorf("searchFields mismatch (-want +got):\n%s", diff) 324 } 325 } 326 327 func tptr(t time.Time) *time.Time { 328 return &t 329 }