eintopf.info@v0.13.16/test/integration/oqueue_indexo_search_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 integration_test 17 18 import ( 19 "context" 20 "os" 21 "testing" 22 "time" 23 24 "eintopf.info/service/auth" 25 "eintopf.info/service/dbmigration" 26 "eintopf.info/service/event" 27 "eintopf.info/service/eventsearch" 28 "eintopf.info/service/group" 29 "eintopf.info/service/oqueue" 30 "eintopf.info/service/place" 31 "eintopf.info/service/revent" 32 "eintopf.info/service/search" 33 "eintopf.info/test" 34 ) 35 36 func TestIndexEventAndEventSearch(t *testing.T) { 37 db, cleanup, err := test.CreateSqliteTestDB(t.Name()) 38 if err != nil { 39 t.Fatal(err) 40 } 41 t.Cleanup(cleanup) 42 43 queue := oqueue.NewQueue() 44 45 migrationStore, err := dbmigration.NewSqlStore(db) 46 if err != nil { 47 t.Fatal(err) 48 } 49 migrationService := dbmigration.NewService(migrationStore) 50 51 eventStore, err := event.NewSqlStore(db, migrationService) 52 if err != nil { 53 t.Fatal(err) 54 } 55 eventService := event.NewService(event.NewOperator(eventStore, queue), nil) 56 57 reventStore, err := revent.NewSqlStore(db, migrationService) 58 if err != nil { 59 t.Fatal(err) 60 } 61 reventService := revent.NewOperator(revent.NewService(reventStore, eventService), queue) 62 63 groupStore, err := group.NewSqlStore(db, migrationService) 64 if err != nil { 65 t.Fatal(err) 66 } 67 groupService := group.NewService(group.NewOperator(groupStore, queue)) 68 69 placeStore, err := place.NewSqlStore(db, migrationService) 70 if err != nil { 71 t.Fatal(err) 72 } 73 placeService := place.NewService(place.NewOperator(placeStore, queue)) 74 75 bleveIndex, cleanupIndex := test.CreateBleveTestIndex("TestIndexingAndSearch") 76 searchService, err := search.NewService(bleveIndex, time.Second, 1, 1, time.UTC) 77 if err != nil { 78 t.Fatalf("seach.NewService: %s", err) 79 } 80 t.Cleanup(cleanupIndex) 81 defer searchService.Stop() 82 83 eventSearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService) 84 queue.AddSubscriber(eventSearchService.ConsumeOperation, 1) 85 86 e, err := eventService.Create( 87 auth.ContextWithID(context.Background(), "foo"), 88 &event.NewEvent{Name: "test", Published: true}, 89 ) 90 if err != nil { 91 t.Fatal(err) 92 } 93 94 queue.Close() 95 96 result, err := eventSearchService.Search(context.Background(), eventsearch.Options{Query: ""}) 97 if err != nil { 98 t.Fatalf("eventSearchService.Search: %s", err) 99 } 100 if len(result.Events) != 1 { 101 t.Errorf("eventSearchService.Search: expected 1 hit. got %d", len(result.Events)) 102 } 103 104 result, err = eventSearchService.Search(context.Background(), eventsearch.Options{ 105 Filters: []eventsearch.Filter{ 106 eventsearch.IDFilter{ID: e.ID}, 107 }, 108 }, 109 ) 110 if err != nil { 111 t.Fatalf("eventSearchService.Search: %s", err) 112 } 113 if len(result.Events) != 1 { 114 t.Errorf("eventSearchService.Search: expected 1 hit. got %d", len(result.Events)) 115 } 116 } 117 118 func TestIndexRepeatingEventAndEventSearch(t *testing.T) { 119 db, cleanup, err := test.CreateSqliteTestDB(t.Name()) 120 if err != nil { 121 t.Fatal(err) 122 } 123 defer cleanup() 124 125 queue := oqueue.NewQueue() 126 127 migrationStore, err := dbmigration.NewSqlStore(db) 128 if err != nil { 129 t.Fatal(err) 130 } 131 migrationService := dbmigration.NewService(migrationStore) 132 133 eventStore, err := event.NewSqlStore(db, migrationService) 134 if err != nil { 135 t.Fatal(err) 136 } 137 eventService := event.NewService(event.NewOperator(eventStore, queue), nil) 138 139 reventStore, err := revent.NewSqlStore(db, migrationService) 140 if err != nil { 141 t.Fatal(err) 142 } 143 reventService := revent.NewOperator(revent.NewService(reventStore, eventService), queue) 144 145 groupStore, err := group.NewSqlStore(db, migrationService) 146 if err != nil { 147 t.Fatal(err) 148 } 149 groupService := group.NewService(group.NewOperator(groupStore, queue)) 150 151 placeStore, err := place.NewSqlStore(db, migrationService) 152 if err != nil { 153 t.Fatal(err) 154 } 155 placeService := place.NewService(place.NewOperator(placeStore, queue)) 156 157 bleveIndex, cleanupIndex := test.CreateBleveTestIndex("TestRepeatingEventAndEventSearch") 158 searchService, err := search.NewService(bleveIndex, time.Second, 1, 1, time.UTC) 159 if err != nil { 160 t.Fatalf("seach.NewService: %s", err) 161 } 162 t.Cleanup(cleanupIndex) 163 defer searchService.Stop() 164 165 eventSearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService) 166 queue.AddSubscriber(eventSearchService.ConsumeOperation, 1) 167 168 e, err := reventService.Create( 169 auth.ContextWithID(context.Background(), "foo"), 170 &revent.NewRepeatingEvent{ 171 Name: "test", 172 Intervals: []revent.Interval{ 173 {Type: revent.IntervalWeek, Interval: 1}, 174 }, 175 }, 176 ) 177 if err != nil { 178 t.Fatal(err) 179 } 180 repeatingEvents, err := reventService.GenerateEvents( 181 auth.ContextWithID(context.Background(), "foo"), 182 e.ID, 183 time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC), 184 time.Date(2022, 3, 1, 0, 0, 0, 0, time.UTC), 185 ) 186 if err != nil { 187 t.Fatal(err) 188 } 189 190 queue.Close() 191 192 result, err := eventSearchService.Search(context.Background(), eventsearch.Options{Query: ""}) 193 if err != nil { 194 t.Fatalf("eventSearchService.Search: %s", err) 195 } 196 if len(result.Events) != len(repeatingEvents) { 197 t.Errorf("eventSearchService.Search: expected %d hit. got %d", len(repeatingEvents), len(result.Events)) 198 } 199 } 200 201 func cleanupIndex(name string) error { 202 return os.RemoveAll(name) 203 }