1// Copyright 2017 The Gitea Authors. All rights reserved.
2// Use of this source code is governed by a MIT-style
3// license that can be found in the LICENSE file.
4
5package models
6
7import (
8	"testing"
9
10	"code.gitea.io/gitea/models/db"
11	repo_model "code.gitea.io/gitea/models/repo"
12	"code.gitea.io/gitea/models/unit"
13	"code.gitea.io/gitea/models/unittest"
14	user_model "code.gitea.io/gitea/models/user"
15	"code.gitea.io/gitea/modules/markup"
16
17	"github.com/stretchr/testify/assert"
18)
19
20func TestCheckRepoStats(t *testing.T) {
21	assert.NoError(t, unittest.PrepareTestDatabase())
22	assert.NoError(t, CheckRepoStats(db.DefaultContext))
23}
24
25func TestWatchRepo(t *testing.T) {
26	assert.NoError(t, unittest.PrepareTestDatabase())
27	const repoID = 3
28	const userID = 2
29
30	assert.NoError(t, repo_model.WatchRepo(userID, repoID, true))
31	unittest.AssertExistsAndLoadBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID})
32	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID})
33
34	assert.NoError(t, repo_model.WatchRepo(userID, repoID, false))
35	unittest.AssertNotExistsBean(t, &repo_model.Watch{RepoID: repoID, UserID: userID})
36	unittest.CheckConsistencyFor(t, &repo_model.Repository{ID: repoID})
37}
38
39func TestMetas(t *testing.T) {
40	assert.NoError(t, unittest.PrepareTestDatabase())
41
42	repo := &repo_model.Repository{Name: "testRepo"}
43	repo.Owner = &user_model.User{Name: "testOwner"}
44	repo.OwnerName = repo.Owner.Name
45
46	repo.Units = nil
47
48	metas := repo.ComposeMetas()
49	assert.Equal(t, "testRepo", metas["repo"])
50	assert.Equal(t, "testOwner", metas["user"])
51
52	externalTracker := repo_model.RepoUnit{
53		Type: unit.TypeExternalTracker,
54		Config: &repo_model.ExternalTrackerConfig{
55			ExternalTrackerFormat: "https://someurl.com/{user}/{repo}/{issue}",
56		},
57	}
58
59	testSuccess := func(expectedStyle string) {
60		repo.Units = []*repo_model.RepoUnit{&externalTracker}
61		repo.RenderingMetas = nil
62		metas := repo.ComposeMetas()
63		assert.Equal(t, expectedStyle, metas["style"])
64		assert.Equal(t, "testRepo", metas["repo"])
65		assert.Equal(t, "testOwner", metas["user"])
66		assert.Equal(t, "https://someurl.com/{user}/{repo}/{issue}", metas["format"])
67	}
68
69	testSuccess(markup.IssueNameStyleNumeric)
70
71	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleAlphanumeric
72	testSuccess(markup.IssueNameStyleAlphanumeric)
73
74	externalTracker.ExternalTrackerConfig().ExternalTrackerStyle = markup.IssueNameStyleNumeric
75	testSuccess(markup.IssueNameStyleNumeric)
76
77	repo, err := repo_model.GetRepositoryByID(3)
78	assert.NoError(t, err)
79
80	metas = repo.ComposeMetas()
81	assert.Contains(t, metas, "org")
82	assert.Contains(t, metas, "teams")
83	assert.Equal(t, "user3", metas["org"])
84	assert.Equal(t, ",owners,team1,", metas["teams"])
85}
86
87func TestUpdateRepositoryVisibilityChanged(t *testing.T) {
88	assert.NoError(t, unittest.PrepareTestDatabase())
89
90	// Get sample repo and change visibility
91	repo, err := repo_model.GetRepositoryByID(9)
92	assert.NoError(t, err)
93	repo.IsPrivate = true
94
95	// Update it
96	err = UpdateRepository(repo, true)
97	assert.NoError(t, err)
98
99	// Check visibility of action has become private
100	act := Action{}
101	_, err = db.GetEngine(db.DefaultContext).ID(3).Get(&act)
102
103	assert.NoError(t, err)
104	assert.True(t, act.IsPrivate)
105}
106
107func TestDoctorUserStarNum(t *testing.T) {
108	assert.NoError(t, unittest.PrepareTestDatabase())
109
110	assert.NoError(t, DoctorUserStarNum())
111}
112
113func TestRepoGetReviewers(t *testing.T) {
114	assert.NoError(t, unittest.PrepareTestDatabase())
115
116	// test public repo
117	repo1 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
118
119	reviewers, err := GetReviewers(repo1, 2, 2)
120	assert.NoError(t, err)
121	assert.Len(t, reviewers, 4)
122
123	// test private repo
124	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
125	reviewers, err = GetReviewers(repo2, 2, 2)
126	assert.NoError(t, err)
127	assert.Empty(t, reviewers)
128}
129
130func TestRepoGetReviewerTeams(t *testing.T) {
131	assert.NoError(t, unittest.PrepareTestDatabase())
132
133	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
134	teams, err := GetReviewerTeams(repo2)
135	assert.NoError(t, err)
136	assert.Empty(t, teams)
137
138	repo3 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 3}).(*repo_model.Repository)
139	teams, err = GetReviewerTeams(repo3)
140	assert.NoError(t, err)
141	assert.Len(t, teams, 2)
142}
143
144func TestLinkedRepository(t *testing.T) {
145	assert.NoError(t, unittest.PrepareTestDatabase())
146	testCases := []struct {
147		name             string
148		attachID         int64
149		expectedRepo     *repo_model.Repository
150		expectedUnitType unit.Type
151	}{
152		{"LinkedIssue", 1, &repo_model.Repository{ID: 1}, unit.TypeIssues},
153		{"LinkedComment", 3, &repo_model.Repository{ID: 1}, unit.TypePullRequests},
154		{"LinkedRelease", 9, &repo_model.Repository{ID: 1}, unit.TypeReleases},
155		{"Notlinked", 10, nil, -1},
156	}
157	for _, tc := range testCases {
158		t.Run(tc.name, func(t *testing.T) {
159			attach, err := repo_model.GetAttachmentByID(tc.attachID)
160			assert.NoError(t, err)
161			repo, unitType, err := LinkedRepository(attach)
162			assert.NoError(t, err)
163			if tc.expectedRepo != nil {
164				assert.Equal(t, tc.expectedRepo.ID, repo.ID)
165			}
166			assert.Equal(t, tc.expectedUnitType, unitType)
167		})
168	}
169}
170
171func TestRepoAssignees(t *testing.T) {
172	assert.NoError(t, unittest.PrepareTestDatabase())
173
174	repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
175	users, err := GetRepoAssignees(repo2)
176	assert.NoError(t, err)
177	assert.Len(t, users, 1)
178	assert.Equal(t, users[0].ID, int64(2))
179
180	repo21 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 21}).(*repo_model.Repository)
181	users, err = GetRepoAssignees(repo21)
182	assert.NoError(t, err)
183	assert.Len(t, users, 3)
184	assert.Equal(t, users[0].ID, int64(15))
185	assert.Equal(t, users[1].ID, int64(18))
186	assert.Equal(t, users[2].ID, int64(16))
187}
188