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  }