github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/models/user_test.go (about) 1 package models 2 3 import ( 4 "errors" 5 "testing" 6 "time" 7 8 "github.com/covergates/covergates/core" 9 "github.com/drone/go-scm/scm" 10 "github.com/google/go-cmp/cmp" 11 log "github.com/sirupsen/logrus" 12 "gorm.io/gorm" 13 ) 14 15 func TestUserCreate(t *testing.T) { 16 ctrl, db := getDatabaseService(t) 17 defer ctrl.Finish() 18 store := &UserStore{ 19 DB: db, 20 } 21 user1 := &scm.User{ 22 Login: "create1", 23 Name: "create1", 24 Email: "create1@gmail.com", 25 Avatar: "http://avatar", 26 } 27 token1 := &core.Token{} 28 if err := store.Create(core.Github, user1, token1); err != nil { 29 t.Error(err) 30 return 31 } 32 if err := store.Create(core.Gitea, user1, token1); err == nil { 33 t.Fail() 34 } 35 } 36 37 func TestUserFind(t *testing.T) { 38 ctrl, db := getDatabaseService(t) 39 defer ctrl.Finish() 40 store := &UserStore{ 41 DB: db, 42 } 43 session := store.DB.Session() 44 user1 := &User{ 45 GithubLogin: "user1", 46 GithubEmail: "user1@gmail.com", 47 Email: "user1@gmail.com", 48 Login: "user1", 49 } 50 if err := session.Create(user1).Error; err != nil { 51 t.Error(err) 52 return 53 } 54 scmUser1 := scm.User{ 55 Login: "user1", 56 Email: "user1@gmail.com", 57 } 58 coreUser1, err := store.Find(core.Github, &scmUser1) 59 if err != nil { 60 t.Error(err) 61 return 62 } 63 if coreUser1.Login != "user1" || coreUser1.GithubEmail != "user1@gmail.com" { 64 t.Fail() 65 } 66 scmUser2 := scm.User{ 67 Login: "user2", 68 Email: "user2@gmail.com", 69 } 70 coreUser2, err := store.Find(core.Github, &scmUser2) 71 if err == nil || !errors.Is(err, gorm.ErrRecordNotFound) { 72 t.Fail() 73 } 74 if coreUser2 != nil { 75 t.Fail() 76 } 77 } 78 79 func TestUserBind(t *testing.T) { 80 ctrl, db := getDatabaseService(t) 81 defer ctrl.Finish() 82 store := &UserStore{ 83 DB: db, 84 } 85 user := &User{ 86 GithubLogin: "bindgithub", 87 GithubEmail: "bindgithub@gmail.com", 88 Email: "bindgithub@gmail.com", 89 Login: "bindgithub", 90 } 91 92 giteaUser := &scm.User{ 93 Email: "bindgitea@gmail.com", 94 Login: "bindgitea", 95 } 96 97 expectUser := &core.User{ 98 Login: user.Login, 99 Email: user.GithubEmail, 100 GithubLogin: user.GithubLogin, 101 GithubEmail: user.GithubEmail, 102 GiteaLogin: giteaUser.Login, 103 GiteaEmail: giteaUser.Email, 104 } 105 106 _, err := store.Bind(core.Gitea, user.toCoreUser(), giteaUser, &core.Token{}) 107 if err == nil { 108 log.Info("could not bind with inexistent user") 109 t.Fail() 110 return 111 } 112 113 err = store.Create(core.Github, &scm.User{ 114 Login: user.GithubLogin, 115 Email: user.GithubEmail, 116 }, &core.Token{}) 117 118 if err != nil { 119 t.Fatal(err) 120 } 121 122 newUser, err := store.Bind(core.Gitea, user.toCoreUser(), giteaUser, &core.Token{}) 123 if err != nil { 124 log.Error(err) 125 t.Fatal(err) 126 } 127 128 trans := cmp.Transformer("", func(in *core.User) *core.User { 129 in.GitLabExpire = time.Unix(0, 0) 130 return in 131 }) 132 133 if diff := cmp.Diff(newUser, expectUser, trans); diff != "" { 134 t.Log(diff) 135 t.Fail() 136 } 137 } 138 139 func TestUserBindExist(t *testing.T) { 140 ctrl, db := getDatabaseService(t) 141 defer ctrl.Finish() 142 store := &UserStore{ 143 DB: db, 144 } 145 146 githubUser := &scm.User{ 147 Login: "exists_github", 148 Email: "exists_github@mail", 149 } 150 151 giteaUser := &scm.User{ 152 Login: "exists_gitea", 153 Email: "exists_gitea@mail", 154 } 155 156 err := store.Create(core.Github, githubUser, &core.Token{}) 157 if err != nil { 158 t.Fatal(err) 159 } 160 err = store.Create(core.Gitea, giteaUser, &core.Token{}) 161 if err != nil { 162 t.Fatal(err) 163 } 164 165 user1, err := store.Find(core.Github, githubUser) 166 if err != nil { 167 t.Fatal(err) 168 } 169 if _, err := store.Bind(core.Gitea, user1, giteaUser, &core.Token{}); err != errUserExist { 170 t.Fail() 171 } 172 } 173 174 func newUser(t *testing.T, store *UserStore, provider core.SCMProvider, login string) *core.User { 175 if err := store.Create( 176 provider, 177 &scm.User{Login: login}, 178 &core.Token{}, 179 ); err != nil { 180 t.Fatal(err) 181 } 182 183 user, err := store.FindByLogin(login) 184 if err != nil { 185 t.Fatal(err) 186 } 187 return user 188 } 189 190 func newRepos(t *testing.T, db core.DatabaseService, repos []*Repo) []*core.Repo { 191 coreRepos := make([]*core.Repo, len(repos)) 192 for i, repo := range repos { 193 if err := db.Session().Create(repo).Error; err != nil { 194 t.Fatal(err) 195 } 196 coreRepos[i] = repo.ToCoreRepo() 197 } 198 return coreRepos 199 } 200 201 func TestUserRepositories(t *testing.T) { 202 ctrl, db := getDatabaseService(t) 203 defer ctrl.Finish() 204 205 userStore := &UserStore{DB: db} 206 207 repos := newRepos( 208 t, db, 209 []*Repo{ 210 { 211 URL: "http://testuser/repo1", 212 SCM: string(core.Github), 213 }, 214 { 215 URL: "http://testuser/repo2", 216 SCM: string(core.Github), 217 }, 218 }, 219 ) 220 221 user := newUser(t, userStore, core.Gitea, "test_repo_user1") 222 223 // test new create 224 if err := userStore.UpdateRepositories(user, repos); err != nil { 225 t.Fatal(err) 226 } 227 228 result, err := userStore.ListRepositories(user) 229 if err != nil { 230 t.Fatal(err) 231 } 232 if diff := cmp.Diff(repos, result); diff != "" { 233 t.Fatal(diff) 234 } 235 236 // test update, remove repository 237 if err := userStore.UpdateRepositories(user, repos[0:1]); err != nil { 238 t.Fatal() 239 } 240 241 result, err = userStore.ListRepositories(user) 242 if err != nil { 243 t.Fatal(err) 244 } 245 246 if diff := cmp.Diff(repos[0:1], result); diff != "" { 247 t.Fatal(diff) 248 } 249 250 // test add inexistent repository 251 if err := userStore.UpdateRepositories(user, append(repos, &core.Repo{URL: "fake"})); err == nil { 252 t.Fatal() 253 } 254 255 // test second user 256 user2 := newUser(t, userStore, core.Github, "test_repo_user2") 257 repos2 := newRepos(t, db, []*Repo{ 258 { 259 URL: "http://testuser/github/repo1", 260 SCM: string(core.Github), 261 }, 262 { 263 URL: "http://testuser/github/repo2", 264 SCM: string(core.Github), 265 }, 266 }) 267 if err := userStore.UpdateRepositories(user2, repos2); err != nil { 268 t.Fatal(err) 269 } 270 result, err = userStore.ListRepositories(user2) 271 if err != nil { 272 t.Fatal(err) 273 } 274 if diff := cmp.Diff(repos2, result); diff != "" { 275 t.Fatal(diff) 276 } 277 }