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