code.gitea.io/gitea@v1.22.3/models/git/commit_status_test.go (about)

     1  // Copyright 2017 Gitea. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package git_test
     5  
     6  import (
     7  	"testing"
     8  	"time"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	git_model "code.gitea.io/gitea/models/git"
    12  	repo_model "code.gitea.io/gitea/models/repo"
    13  	"code.gitea.io/gitea/models/unittest"
    14  	user_model "code.gitea.io/gitea/models/user"
    15  	"code.gitea.io/gitea/modules/git"
    16  	"code.gitea.io/gitea/modules/gitrepo"
    17  	"code.gitea.io/gitea/modules/structs"
    18  
    19  	"github.com/stretchr/testify/assert"
    20  )
    21  
    22  func TestGetCommitStatuses(t *testing.T) {
    23  	assert.NoError(t, unittest.PrepareTestDatabase())
    24  
    25  	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
    26  
    27  	sha1 := "1234123412341234123412341234123412341234"
    28  
    29  	statuses, maxResults, err := db.FindAndCount[git_model.CommitStatus](db.DefaultContext, &git_model.CommitStatusOptions{
    30  		ListOptions: db.ListOptions{Page: 1, PageSize: 50},
    31  		RepoID:      repo1.ID,
    32  		SHA:         sha1,
    33  	})
    34  	assert.NoError(t, err)
    35  	assert.Equal(t, int(maxResults), 5)
    36  	assert.Len(t, statuses, 5)
    37  
    38  	assert.Equal(t, "ci/awesomeness", statuses[0].Context)
    39  	assert.Equal(t, structs.CommitStatusPending, statuses[0].State)
    40  	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[0].APIURL(db.DefaultContext))
    41  
    42  	assert.Equal(t, "cov/awesomeness", statuses[1].Context)
    43  	assert.Equal(t, structs.CommitStatusWarning, statuses[1].State)
    44  	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[1].APIURL(db.DefaultContext))
    45  
    46  	assert.Equal(t, "cov/awesomeness", statuses[2].Context)
    47  	assert.Equal(t, structs.CommitStatusSuccess, statuses[2].State)
    48  	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[2].APIURL(db.DefaultContext))
    49  
    50  	assert.Equal(t, "ci/awesomeness", statuses[3].Context)
    51  	assert.Equal(t, structs.CommitStatusFailure, statuses[3].State)
    52  	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[3].APIURL(db.DefaultContext))
    53  
    54  	assert.Equal(t, "deploy/awesomeness", statuses[4].Context)
    55  	assert.Equal(t, structs.CommitStatusError, statuses[4].State)
    56  	assert.Equal(t, "https://try.gitea.io/api/v1/repos/user2/repo1/statuses/1234123412341234123412341234123412341234", statuses[4].APIURL(db.DefaultContext))
    57  
    58  	statuses, maxResults, err = db.FindAndCount[git_model.CommitStatus](db.DefaultContext, &git_model.CommitStatusOptions{
    59  		ListOptions: db.ListOptions{Page: 2, PageSize: 50},
    60  		RepoID:      repo1.ID,
    61  		SHA:         sha1,
    62  	})
    63  	assert.NoError(t, err)
    64  	assert.Equal(t, int(maxResults), 5)
    65  	assert.Empty(t, statuses)
    66  }
    67  
    68  func Test_CalcCommitStatus(t *testing.T) {
    69  	kases := []struct {
    70  		statuses []*git_model.CommitStatus
    71  		expected *git_model.CommitStatus
    72  	}{
    73  		{
    74  			statuses: []*git_model.CommitStatus{
    75  				{
    76  					State: structs.CommitStatusPending,
    77  				},
    78  			},
    79  			expected: &git_model.CommitStatus{
    80  				State: structs.CommitStatusPending,
    81  			},
    82  		},
    83  		{
    84  			statuses: []*git_model.CommitStatus{
    85  				{
    86  					State: structs.CommitStatusSuccess,
    87  				},
    88  				{
    89  					State: structs.CommitStatusPending,
    90  				},
    91  			},
    92  			expected: &git_model.CommitStatus{
    93  				State: structs.CommitStatusPending,
    94  			},
    95  		},
    96  		{
    97  			statuses: []*git_model.CommitStatus{
    98  				{
    99  					State: structs.CommitStatusSuccess,
   100  				},
   101  				{
   102  					State: structs.CommitStatusPending,
   103  				},
   104  				{
   105  					State: structs.CommitStatusSuccess,
   106  				},
   107  			},
   108  			expected: &git_model.CommitStatus{
   109  				State: structs.CommitStatusPending,
   110  			},
   111  		},
   112  		{
   113  			statuses: []*git_model.CommitStatus{
   114  				{
   115  					State: structs.CommitStatusError,
   116  				},
   117  				{
   118  					State: structs.CommitStatusPending,
   119  				},
   120  				{
   121  					State: structs.CommitStatusSuccess,
   122  				},
   123  			},
   124  			expected: &git_model.CommitStatus{
   125  				State: structs.CommitStatusError,
   126  			},
   127  		},
   128  		{
   129  			statuses: []*git_model.CommitStatus{
   130  				{
   131  					State: structs.CommitStatusWarning,
   132  				},
   133  				{
   134  					State: structs.CommitStatusPending,
   135  				},
   136  				{
   137  					State: structs.CommitStatusSuccess,
   138  				},
   139  			},
   140  			expected: &git_model.CommitStatus{
   141  				State: structs.CommitStatusWarning,
   142  			},
   143  		},
   144  		{
   145  			statuses: []*git_model.CommitStatus{
   146  				{
   147  					State: structs.CommitStatusSuccess,
   148  				},
   149  				{
   150  					State: structs.CommitStatusSuccess,
   151  				},
   152  				{
   153  					State: structs.CommitStatusSuccess,
   154  				},
   155  			},
   156  			expected: &git_model.CommitStatus{
   157  				State: structs.CommitStatusSuccess,
   158  			},
   159  		},
   160  		{
   161  			statuses: []*git_model.CommitStatus{
   162  				{
   163  					State: structs.CommitStatusFailure,
   164  				},
   165  				{
   166  					State: structs.CommitStatusError,
   167  				},
   168  				{
   169  					State: structs.CommitStatusWarning,
   170  				},
   171  			},
   172  			expected: &git_model.CommitStatus{
   173  				State: structs.CommitStatusError,
   174  			},
   175  		},
   176  	}
   177  
   178  	for _, kase := range kases {
   179  		assert.Equal(t, kase.expected, git_model.CalcCommitStatus(kase.statuses))
   180  	}
   181  }
   182  
   183  func TestFindRepoRecentCommitStatusContexts(t *testing.T) {
   184  	assert.NoError(t, unittest.PrepareTestDatabase())
   185  
   186  	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
   187  	user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
   188  	gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo2)
   189  	assert.NoError(t, err)
   190  	defer gitRepo.Close()
   191  
   192  	commit, err := gitRepo.GetBranchCommit(repo2.DefaultBranch)
   193  	assert.NoError(t, err)
   194  
   195  	defer func() {
   196  		_, err := db.DeleteByBean(db.DefaultContext, &git_model.CommitStatus{
   197  			RepoID:    repo2.ID,
   198  			CreatorID: user2.ID,
   199  			SHA:       commit.ID.String(),
   200  		})
   201  		assert.NoError(t, err)
   202  	}()
   203  
   204  	err = git_model.NewCommitStatus(db.DefaultContext, git_model.NewCommitStatusOptions{
   205  		Repo:    repo2,
   206  		Creator: user2,
   207  		SHA:     commit.ID,
   208  		CommitStatus: &git_model.CommitStatus{
   209  			State:     structs.CommitStatusFailure,
   210  			TargetURL: "https://example.com/tests/",
   211  			Context:   "compliance/lint-backend",
   212  		},
   213  	})
   214  	assert.NoError(t, err)
   215  
   216  	err = git_model.NewCommitStatus(db.DefaultContext, git_model.NewCommitStatusOptions{
   217  		Repo:    repo2,
   218  		Creator: user2,
   219  		SHA:     commit.ID,
   220  		CommitStatus: &git_model.CommitStatus{
   221  			State:     structs.CommitStatusSuccess,
   222  			TargetURL: "https://example.com/tests/",
   223  			Context:   "compliance/lint-backend",
   224  		},
   225  	})
   226  	assert.NoError(t, err)
   227  
   228  	contexts, err := git_model.FindRepoRecentCommitStatusContexts(db.DefaultContext, repo2.ID, time.Hour)
   229  	assert.NoError(t, err)
   230  	if assert.Len(t, contexts, 1) {
   231  		assert.Equal(t, "compliance/lint-backend", contexts[0])
   232  	}
   233  }