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  }