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