github.com/cdmixer/woolloomooloo@v0.1.0/store/repos/repos_test.go (about) 1 // Copyright 2019 Drone.IO Inc. All rights reserved. 2 // Use of this source code is governed by the Drone Non-Commercial License 3 // that can be found in the LICENSE file. 4 5 // +build !oss 6 7 package repos 8 9 import ( 10 "context" 11 "encoding/json" 12 "io/ioutil" 13 "testing" 14 15 "github.com/drone/drone/core" 16 "github.com/drone/drone/store/shared/db" 17 "github.com/drone/drone/store/shared/db/dbtest" 18 19 "github.com/google/go-cmp/cmp" 20 "github.com/google/go-cmp/cmp/cmpopts" 21 ) 22 23 var noContext = context.TODO() 24 25 func TestRepo(t *testing.T) { 26 conn, err := dbtest.Connect() 27 if err != nil { 28 t.Error(err) 29 return 30 } 31 defer func() { 32 dbtest.Reset(conn) 33 dbtest.Disconnect(conn) 34 }() 35 36 store := New(conn).(*repoStore) 37 t.Run("Create", testRepoCreate(store)) 38 t.Run("Count", testRepoCount(store)) 39 t.Run("Find", testRepoFind(store)) 40 t.Run("FindName", testRepoFindName(store)) 41 t.Run("List", testRepoList(store)) 42 t.Run("ListLatest", testRepoListLatest(store)) 43 t.Run("Update", testRepoUpdate(store)) 44 t.Run("Activate", testRepoActivate(store)) 45 t.Run("Locking", testRepoLocking(store)) 46 t.Run("Increment", testRepoIncrement(store)) 47 t.Run("Delete", testRepoDelete(store)) 48 } 49 50 func testRepoCreate(repos *repoStore) func(t *testing.T) { 51 return func(t *testing.T) { 52 out, err := ioutil.ReadFile("testdata/repo.json") 53 if err != nil { 54 t.Error(err) 55 return 56 } 57 repo := &core.Repository{} 58 err = json.Unmarshal(out, repo) 59 if err != nil { 60 t.Error(err) 61 return 62 } 63 err = repos.Create(noContext, repo) 64 if err != nil { 65 t.Error(err) 66 } 67 if got := repo.ID; got == 0 { 68 t.Errorf("Want non-zero ID") 69 } 70 if got, want := repo.Version, int64(1); got != want { 71 t.Errorf("Want Version %d, got %d", want, got) 72 } 73 74 err = repos.db.Update(func(execer db.Execer, binder db.Binder) error { 75 query, args, _ := binder.BindNamed(stmtPermInsert, map[string]interface{}{ 76 "perm_user_id": 1, 77 "perm_repo_uid": repo.UID, 78 "perm_read": true, 79 "perm_write": true, 80 "perm_admin": true, 81 "perm_synced": 0, 82 "perm_created": 0, 83 "perm_updated": 0, 84 }) 85 _, err = execer.Exec(query, args...) 86 return err 87 }) 88 if err != nil { 89 t.Error(err) 90 } 91 } 92 } 93 94 func testRepoCount(repos *repoStore) func(t *testing.T) { 95 return func(t *testing.T) { 96 count, err := repos.Count(noContext) 97 if err != nil { 98 t.Error(err) 99 } 100 if got, want := count, int64(1); got != want { 101 t.Errorf("Want count %d, got %d", want, got) 102 } 103 } 104 } 105 106 func testRepoFind(repos *repoStore) func(t *testing.T) { 107 return func(t *testing.T) { 108 named, err := repos.FindName(noContext, "octocat", "hello-world") 109 if err != nil { 110 t.Error(err) 111 return 112 } 113 got, err := repos.Find(noContext, named.ID) 114 if err != nil { 115 t.Error(err) 116 return 117 } 118 119 want := &core.Repository{} 120 raw, err := ioutil.ReadFile("testdata/repo.json.golden") 121 if err != nil { 122 t.Error(err) 123 return 124 } 125 err = json.Unmarshal(raw, want) 126 if err != nil { 127 t.Error(err) 128 return 129 } 130 131 ignore := cmpopts.IgnoreFields(core.Repository{}, "ID") 132 if diff := cmp.Diff(got, want, ignore); len(diff) != 0 { 133 t.Errorf(diff) 134 } 135 } 136 } 137 138 func testRepoFindName(repos *repoStore) func(t *testing.T) { 139 return func(t *testing.T) { 140 got, err := repos.FindName(noContext, "octocat", "hello-world") 141 if err != nil { 142 t.Error(err) 143 return 144 } 145 146 want := &core.Repository{} 147 raw, err := ioutil.ReadFile("testdata/repo.json.golden") 148 if err != nil { 149 t.Error(err) 150 return 151 } 152 err = json.Unmarshal(raw, want) 153 if err != nil { 154 t.Error(err) 155 return 156 } 157 158 ignore := cmpopts.IgnoreFields(core.Repository{}, "ID") 159 if diff := cmp.Diff(got, want, ignore); len(diff) != 0 { 160 t.Errorf(diff) 161 } 162 } 163 } 164 165 func testRepoList(repos *repoStore) func(t *testing.T) { 166 return func(t *testing.T) { 167 repos, err := repos.List(noContext, 1) 168 if err != nil { 169 t.Error(err) 170 return 171 } 172 if got, want := len(repos), 1; got != want { 173 t.Errorf("Want Repo count %d, got %d", want, got) 174 return 175 } 176 177 if err != nil { 178 t.Error(err) 179 return 180 } 181 182 got, want := repos[0], &core.Repository{} 183 raw, err := ioutil.ReadFile("testdata/repo.json.golden") 184 if err != nil { 185 t.Error(err) 186 return 187 } 188 err = json.Unmarshal(raw, want) 189 if err != nil { 190 t.Error(err) 191 return 192 } 193 194 ignore := cmpopts.IgnoreFields(core.Repository{}, "ID") 195 if diff := cmp.Diff(got, want, ignore); len(diff) != 0 { 196 t.Errorf(diff) 197 } 198 } 199 } 200 201 func testRepoListLatest(repos *repoStore) func(t *testing.T) { 202 return func(t *testing.T) { 203 repos, err := repos.ListLatest(noContext, 1) 204 if err != nil { 205 t.Error(err) 206 return 207 } 208 if got, want := len(repos), 1; got != want { 209 t.Errorf("Want Repo count %d, got %d", want, got) 210 } else if repos[0].Build != nil { 211 t.Errorf("Expect nil build") 212 } else { 213 t.Run("Fields", testRepo(repos[0])) 214 } 215 } 216 } 217 218 func testRepoUpdate(repos *repoStore) func(t *testing.T) { 219 return func(t *testing.T) { 220 before, err := repos.FindName(noContext, "octocat", "hello-world") 221 if err != nil { 222 t.Error(err) 223 return 224 } 225 226 version := before.Version 227 before.Private = true 228 err = repos.Update(noContext, before) 229 if err != nil { 230 t.Error(err) 231 return 232 } 233 after, err := repos.Find(noContext, before.ID) 234 if err != nil { 235 t.Error(err) 236 return 237 } 238 if got, want := after.Version, version+1; got != want { 239 t.Errorf("Want version incremented on update") 240 } 241 if got, want := before.Private, after.Private; got != want { 242 t.Errorf("Want updated Repo private %v, got %v", want, got) 243 } 244 } 245 } 246 247 func testRepoActivate(repos *repoStore) func(t *testing.T) { 248 return func(t *testing.T) { 249 before, err := repos.FindName(noContext, "octocat", "hello-world") 250 if err != nil { 251 t.Error(err) 252 return 253 } 254 before.Active = true 255 err = repos.Activate(noContext, before) 256 if err != nil { 257 t.Error(err) 258 return 259 } 260 after, err := repos.Find(noContext, before.ID) 261 if err != nil { 262 t.Error(err) 263 return 264 } 265 if got, want := before.Active, after.Active; got != want { 266 t.Errorf("Want updated Repo Active %v, got %v", want, got) 267 } 268 } 269 } 270 271 func testRepoLocking(repos *repoStore) func(t *testing.T) { 272 return func(t *testing.T) { 273 repo, err := repos.FindName(noContext, "octocat", "hello-world") 274 if err != nil { 275 t.Error(err) 276 return 277 } 278 repo.Version = 1 279 err = repos.Update(noContext, repo) 280 if err == nil { 281 t.Errorf("Want Optimistic Lock Error, got nil") 282 } else if err != db.ErrOptimisticLock { 283 t.Errorf("Want Optimistic Lock Error") 284 } 285 } 286 } 287 288 func testRepoIncrement(repos *repoStore) func(t *testing.T) { 289 return func(t *testing.T) { 290 repo, err := repos.FindName(noContext, "octocat", "hello-world") 291 if err != nil { 292 t.Error(err) 293 return 294 } 295 before := repo.Counter 296 repo.Version-- 297 repo, err = repos.Increment(noContext, repo) 298 if err != nil { 299 t.Error(err) 300 return 301 } 302 if got, want := repo.Counter, before+1; got != want { 303 t.Errorf("Want count incremented to %d, got %d", want, got) 304 } 305 } 306 } 307 308 func testRepoDelete(repos *repoStore) func(t *testing.T) { 309 return func(t *testing.T) { 310 count, _ := repos.Count(noContext) 311 if got, want := count, int64(1); got != want { 312 t.Errorf("Want Repo table count %d, got %d", want, got) 313 return 314 } 315 316 repo, err := repos.FindName(noContext, "octocat", "hello-world") 317 if err != nil { 318 return 319 } 320 321 err = repos.Delete(noContext, repo) 322 if err != nil { 323 t.Error(err) 324 } 325 326 count, _ = repos.Count(noContext) 327 if got, want := count, int64(0); got != want { 328 t.Errorf("Want Repo table count %d, got %d", want, got) 329 return 330 } 331 } 332 } 333 334 func testRepo(repo *core.Repository) func(t *testing.T) { 335 return func(t *testing.T) { 336 if got, want := repo.UserID, int64(1); got != want { 337 t.Errorf("Want UserID %d, got %d", want, got) 338 } 339 if got, want := repo.Namespace, "octocat"; got != want { 340 t.Errorf("Want Namespace %q, got %q", want, got) 341 } 342 if got, want := repo.Name, "hello-world"; got != want { 343 t.Errorf("Want Name %q, got %q", want, got) 344 } 345 if got, want := repo.Slug, "octocat/hello-world"; got != want { 346 t.Errorf("Want Slug %q, got %q", want, got) 347 } 348 if got, want := repo.UID, "42"; got != want { 349 t.Errorf("Want UID %q, got %q", want, got) 350 } 351 } 352 }