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 }