eintopf.info@v0.13.16/service/place/testutil/store.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 testutil 17 18 import ( 19 "context" 20 "testing" 21 22 "eintopf.info/internal/crud" 23 "eintopf.info/service/place" 24 ) 25 26 type newStore func() (place.Storer, func(), error) 27 28 // TestStore tests if a given place.Service acts as a place store. 29 func TestStore(t *testing.T, newStore newStore) { 30 ctx := context.Background() 31 t.Helper() 32 t.Run("FindNoMatch", func(tt *testing.T) { 33 store, cleanup, err := newStore() 34 if err != nil { 35 tt.Fatalf("Failed to create a new store: %s", err) 36 } 37 defer cleanup() 38 39 place, err := store.FindByID(ctx, "test") 40 if err != nil { 41 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 42 } 43 if place != nil { 44 tt.Fatalf("expected to place to be nil. got %v", place) 45 } 46 }) 47 48 t.Run("CreateFindByID", func(tt *testing.T) { 49 store, cleanup, err := newStore() 50 if err != nil { 51 tt.Fatalf("Failed to create a new store: %s", err) 52 } 53 defer cleanup() 54 55 place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"}) 56 place, err := store.FindByID(ctx, place1.ID) 57 if err != nil { 58 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 59 } 60 if place.ID != place1.ID || place.Name != place1.Name { 61 tt.Fatalf("expected to find place1. got %v. want %v", place, place1) 62 } 63 }) 64 65 t.Run("CreateFind", func(tt *testing.T) { 66 store, cleanup, err := newStore() 67 if err != nil { 68 tt.Fatalf("Failed to create a new store: %s", err) 69 } 70 defer cleanup() 71 72 _, err = store.Create(ctx, &place.NewPlace{Name: "place1"}) 73 if err != nil { 74 tt.Fatalf("store.Create: %s", err) 75 } 76 _, err = store.Create(ctx, &place.NewPlace{Name: "place2"}) 77 if err != nil { 78 tt.Fatalf("store.Create: %s", err) 79 } 80 places, totalPlaces, err := store.Find(ctx, nil) 81 if err != nil { 82 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 83 } 84 if len(places) != 2 { 85 tt.Fatalf("expected to recieve two places. got %d", len(places)) 86 } 87 if totalPlaces != 2 { 88 tt.Fatalf("expected to recieve a total of two places. got %d", totalPlaces) 89 } 90 }) 91 92 t.Run("CreateFindFilter", func(tt *testing.T) { 93 store, cleanup, err := newStore() 94 if err != nil { 95 tt.Fatalf("Failed to create a new store: %s", err) 96 } 97 defer cleanup() 98 99 place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"}) 100 store.Create(ctx, &place.NewPlace{Name: "place2"}) 101 places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{ 102 Filters: &place.FindFilters{Name: &place1.Name}, 103 }) 104 if err != nil { 105 tt.Fatalf("expected store.FindAll to succeed. got %s", err.Error()) 106 } 107 if len(places) != 1 { 108 tt.Fatalf("expected to recieve one place. got %d", len(places)) 109 } 110 if totalPlaces != 1 { 111 tt.Fatalf("expected to recieve a total of one place. got %d", totalPlaces) 112 } 113 if places[0].ID != place1.ID { 114 tt.Fatalf("expected to find place1. got %v. want %v", places[0], place1) 115 } 116 }) 117 118 t.Run("CreateFindSortedASC", func(tt *testing.T) { 119 store, cleanup, err := newStore() 120 if err != nil { 121 tt.Fatalf("Failed to create a new store: %s", err) 122 } 123 defer cleanup() 124 125 place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"}) 126 place2, _ := store.Create(ctx, &place.NewPlace{Name: "a place2"}) 127 place3, _ := store.Create(ctx, &place.NewPlace{Name: "b place3"}) 128 places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{ 129 Sort: "name", 130 Order: crud.OrderAsc, 131 }) 132 if err != nil { 133 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 134 } 135 if len(places) != 3 { 136 tt.Fatalf("expected to find three place. got %d", len(places)) 137 } 138 if totalPlaces != 3 { 139 tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces) 140 } 141 if places[0].ID != place2.ID { 142 tt.Fatalf("expected to place[0] to be place2 . got %v", places[0]) 143 } 144 if places[1].ID != place3.ID { 145 tt.Fatalf("expected to place[1] to be place3 . got %v", places[1]) 146 } 147 if places[2].ID != place1.ID { 148 tt.Fatalf("expected to place[2] to be place1 . got %v", places[2]) 149 } 150 }) 151 152 t.Run("CreateFindSortedDESC", func(tt *testing.T) { 153 store, cleanup, err := newStore() 154 if err != nil { 155 tt.Fatalf("Failed to create a new store: %s", err) 156 } 157 defer cleanup() 158 159 place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"}) 160 place2, _ := store.Create(ctx, &place.NewPlace{Name: "a place2"}) 161 place3, _ := store.Create(ctx, &place.NewPlace{Name: "b place3"}) 162 places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{ 163 Sort: "name", 164 Order: crud.OrderDesc, 165 }) 166 if err != nil { 167 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 168 } 169 if len(places) != 3 { 170 tt.Fatalf("expected to find three place. got %d", len(places)) 171 } 172 if totalPlaces != 3 { 173 tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces) 174 } 175 if places[0].ID != place1.ID { 176 tt.Fatalf("expected to place[0] to be place1 . got %v", places[0]) 177 } 178 if places[1].ID != place3.ID { 179 tt.Fatalf("expected to place[1] to be place3 . got %v", places[1]) 180 } 181 if places[2].ID != place2.ID { 182 tt.Fatalf("expected to place[2] to be place2 . got %v", places[2]) 183 } 184 }) 185 186 t.Run("CreateFindPaginated", func(tt *testing.T) { 187 store, cleanup, err := newStore() 188 if err != nil { 189 tt.Fatalf("Failed to create a new store: %s", err) 190 } 191 defer cleanup() 192 193 store.Create(ctx, &place.NewPlace{Name: "place1"}) 194 place2, _ := store.Create(ctx, &place.NewPlace{Name: "place2"}) 195 store.Create(ctx, &place.NewPlace{Name: "place3"}) 196 places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{ 197 Limit: 1, 198 Offset: 1, 199 }) 200 if err != nil { 201 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 202 } 203 if len(places) != 1 { 204 tt.Fatalf("expected to find one place. got %d", len(places)) 205 } 206 if totalPlaces != 3 { 207 tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces) 208 } 209 if places[0].ID != place2.ID || places[0].Name != place2.Name { 210 tt.Fatalf("expected to find place2. got %v. want %v", places[0], place2) 211 } 212 }) 213 214 t.Run("CreateFindPaginatedAndSorted", func(tt *testing.T) { 215 store, cleanup, err := newStore() 216 if err != nil { 217 tt.Fatalf("Failed to create a new store: %s", err) 218 } 219 defer cleanup() 220 221 place1, _ := store.Create(ctx, &place.NewPlace{Name: "c place1"}) 222 store.Create(ctx, &place.NewPlace{Name: "a place2"}) 223 store.Create(ctx, &place.NewPlace{Name: "b place3"}) 224 places, totalPlaces, err := store.Find(ctx, &crud.FindParams[place.FindFilters]{ 225 Limit: 1, 226 Offset: 2, 227 Sort: "name", 228 Order: crud.OrderAsc, 229 }) 230 if err != nil { 231 tt.Fatalf("expected store.Find to succeed. got %s", err.Error()) 232 } 233 if len(places) != 1 { 234 tt.Fatalf("expected to find one place. got %d", len(places)) 235 } 236 if totalPlaces != 3 { 237 tt.Fatalf("expected to recieve a total of three places. got %d", totalPlaces) 238 } 239 if places[0].ID != place1.ID { 240 tt.Fatalf("expected to place[0] to be place1 . got %v", places[0]) 241 } 242 }) 243 244 t.Run("CreateUpdate", func(tt *testing.T) { 245 store, cleanup, err := newStore() 246 if err != nil { 247 tt.Fatalf("Failed to create a new store: %s", err) 248 } 249 defer cleanup() 250 251 place1, _ := store.Create(ctx, &place.NewPlace{Name: "place3"}) 252 place1.Name = "place3.1" 253 254 _, err = store.Update(ctx, place1) 255 if err != nil { 256 tt.Fatalf("expected store.Update to succeed. got %s", err.Error()) 257 } 258 259 place, err := store.FindByID(ctx, place1.ID) 260 if place.Name != "place3.1" { 261 tt.Fatalf("expected place.Name to be 'place3.1. got %s", place.Name) 262 } 263 }) 264 265 t.Run("CreateDelete", func(tt *testing.T) { 266 store, cleanup, err := newStore() 267 if err != nil { 268 tt.Fatalf("Failed to create a new store: %s", err) 269 } 270 defer cleanup() 271 272 place1, _ := store.Create(ctx, &place.NewPlace{Name: "place1"}) 273 err = store.Delete(ctx, place1.ID) 274 if err != nil { 275 tt.Fatalf("expected store.Delete to succeed. got %s", err.Error()) 276 } 277 place, err := store.FindByID(ctx, place1.ID) 278 if place != nil { 279 tt.Fatal("expected place1 to be deleted") 280 } 281 }) 282 }