Skip to content

Commit ddb7f59

Browse files
Morlinestlafriks
authored andcommitted
Add search mode option to /api/repo/search (#2756)
* Add repo type option to /api/repo/search * Add tests and fix result of collaborative filter in specific condition * Fix/optimize search & tests * Improve integration tests * Fix lint errors * Fix unit tests * Change and improve internal implementation of repo search * Use NonexistentID * Make search api more general * Change mirror and fork search behaviour * Fix tests & typo in comment
1 parent 4d01eca commit ddb7f59

File tree

16 files changed

+505
-142
lines changed

16 files changed

+505
-142
lines changed

integrations/api_repo_test.go

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func TestAPISearchRepo(t *testing.T) {
5151
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 15}).(*models.User)
5252
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 16}).(*models.User)
5353
user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 18}).(*models.User)
54+
user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 20}).(*models.User)
5455
orgUser := models.AssertExistsAndLoadBean(t, &models.User{ID: 17}).(*models.User)
5556

5657
// Map of expected results, where key is user for login
@@ -66,9 +67,9 @@ func TestAPISearchRepo(t *testing.T) {
6667
expectedResults
6768
}{
6869
{name: "RepositoriesMax50", requestURL: "/api/v1/repos/search?limit=50", expectedResults: expectedResults{
69-
nil: {count: 12},
70-
user: {count: 12},
71-
user2: {count: 12}},
70+
nil: {count: 15},
71+
user: {count: 15},
72+
user2: {count: 15}},
7273
},
7374
{name: "RepositoriesMax10", requestURL: "/api/v1/repos/search?limit=10", expectedResults: expectedResults{
7475
nil: {count: 10},
@@ -81,9 +82,9 @@ func TestAPISearchRepo(t *testing.T) {
8182
user2: {count: 10}},
8283
},
8384
{name: "RepositoriesByName", requestURL: fmt.Sprintf("/api/v1/repos/search?q=%s", "big_test_"), expectedResults: expectedResults{
84-
nil: {count: 4, repoName: "big_test_"},
85-
user: {count: 4, repoName: "big_test_"},
86-
user2: {count: 4, repoName: "big_test_"}},
85+
nil: {count: 7, repoName: "big_test_"},
86+
user: {count: 7, repoName: "big_test_"},
87+
user2: {count: 7, repoName: "big_test_"}},
8788
},
8889
{name: "RepositoriesAccessibleAndRelatedToUser", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d", user.ID), expectedResults: expectedResults{
8990
nil: {count: 4},
@@ -106,16 +107,46 @@ func TestAPISearchRepo(t *testing.T) {
106107
user: {count: 2, repoOwnerID: orgUser.ID, includesPrivate: true},
107108
user2: {count: 1, repoOwnerID: orgUser.ID}},
108109
},
110+
{name: "RepositoriesAccessibleAndRelatedToUser4", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d", user4.ID), expectedResults: expectedResults{
111+
nil: {count: 3},
112+
user: {count: 3},
113+
user4: {count: 6, includesPrivate: true}}},
114+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeSource", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s", user4.ID, "source"), expectedResults: expectedResults{
115+
nil: {count: 0},
116+
user: {count: 0},
117+
user4: {count: 0, includesPrivate: true}}},
118+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeFork", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s", user4.ID, "fork"), expectedResults: expectedResults{
119+
nil: {count: 1},
120+
user: {count: 1},
121+
user4: {count: 2, includesPrivate: true}}},
122+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeFork/Exclusive", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s&exclusive=1", user4.ID, "fork"), expectedResults: expectedResults{
123+
nil: {count: 1},
124+
user: {count: 1},
125+
user4: {count: 2, includesPrivate: true}}},
126+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeMirror", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s", user4.ID, "mirror"), expectedResults: expectedResults{
127+
nil: {count: 2},
128+
user: {count: 2},
129+
user4: {count: 4, includesPrivate: true}}},
130+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeMirror/Exclusive", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s&exclusive=1", user4.ID, "mirror"), expectedResults: expectedResults{
131+
nil: {count: 1},
132+
user: {count: 1},
133+
user4: {count: 2, includesPrivate: true}}},
134+
{name: "RepositoriesAccessibleAndRelatedToUser4/SearchModeCollaborative", requestURL: fmt.Sprintf("/api/v1/repos/search?uid=%d&mode=%s", user4.ID, "collaborative"), expectedResults: expectedResults{
135+
nil: {count: 0},
136+
user: {count: 0},
137+
user4: {count: 0, includesPrivate: true}}},
109138
}
110139

111140
for _, testCase := range testCases {
112141
t.Run(testCase.name, func(t *testing.T) {
113142
for userToLogin, expected := range testCase.expectedResults {
114143
var session *TestSession
115144
var testName string
145+
var userID int64
116146
if userToLogin != nil && userToLogin.ID > 0 {
117147
testName = fmt.Sprintf("LoggedUser%d", userToLogin.ID)
118148
session = loginUser(t, userToLogin.Name)
149+
userID = userToLogin.ID
119150
} else {
120151
testName = "AnonymousUser"
121152
session = emptyTestSession(t)
@@ -130,6 +161,11 @@ func TestAPISearchRepo(t *testing.T) {
130161

131162
assert.Len(t, body.Data, expected.count)
132163
for _, repo := range body.Data {
164+
r := getRepo(t, repo.ID)
165+
hasAccess, err := models.HasAccess(userID, r, models.AccessModeRead)
166+
assert.NoError(t, err)
167+
assert.True(t, hasAccess)
168+
133169
assert.NotEmpty(t, repo.Name)
134170

135171
if len(expected.repoName) > 0 {
@@ -150,6 +186,15 @@ func TestAPISearchRepo(t *testing.T) {
150186
}
151187
}
152188

189+
var repoCache = make(map[int64]*models.Repository)
190+
191+
func getRepo(t *testing.T, repoID int64) *models.Repository {
192+
if _, ok := repoCache[repoID]; !ok {
193+
repoCache[repoID] = models.AssertExistsAndLoadBean(t, &models.Repository{ID: repoID}).(*models.Repository)
194+
}
195+
return repoCache[repoID]
196+
}
197+
153198
func TestAPIViewRepo(t *testing.T) {
154199
prepareTestEnv(t)
155200

models/fixtures/access.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,16 @@
6262
id: 11
6363
user_id: 18
6464
repo_id: 21
65-
mode: 2 # write
65+
mode: 2 # write
66+
67+
-
68+
id: 12
69+
user_id: 20
70+
repo_id: 27
71+
mode: 4 # owner
72+
73+
-
74+
id: 13
75+
user_id: 20
76+
repo_id: 28
77+
mode: 4 # owner

models/fixtures/org_user.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,12 @@
4444
org_id: 17
4545
is_public: false
4646
is_owner: true
47+
num_teams: 1
48+
49+
-
50+
id: 7
51+
uid: 20
52+
org_id: 19
53+
is_public: true
54+
is_owner: true
4755
num_teams: 1

models/fixtures/repository.yml

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@
201201
num_closed_pulls: 0
202202
num_watches: 0
203203
is_mirror: false
204+
is_fork: false
204205

205206
-
206207
id: 18
@@ -213,6 +214,7 @@
213214
num_pulls: 0
214215
num_closed_pulls: 0
215216
is_mirror: false
217+
is_fork: false
216218

217219
-
218220
id: 19
@@ -225,6 +227,7 @@
225227
num_pulls: 0
226228
num_closed_pulls: 0
227229
is_mirror: false
230+
is_fork: false
228231

229232
-
230233
id: 20
@@ -237,6 +240,7 @@
237240
num_pulls: 0
238241
num_closed_pulls: 0
239242
is_mirror: false
243+
is_fork: false
240244

241245
-
242246
id: 21
@@ -249,6 +253,7 @@
249253
num_pulls: 0
250254
num_closed_pulls: 0
251255
is_mirror: false
256+
is_fork: false
252257

253258
-
254259
id: 22
@@ -261,6 +266,7 @@
261266
num_pulls: 0
262267
num_closed_pulls: 0
263268
is_mirror: false
269+
is_fork: false
264270

265271
-
266272
id: 23
@@ -273,6 +279,7 @@
273279
num_pulls: 0
274280
num_closed_pulls: 0
275281
is_mirror: false
282+
is_fork: false
276283

277284
-
278285
id: 24
@@ -285,3 +292,90 @@
285292
num_pulls: 0
286293
num_closed_pulls: 0
287294
is_mirror: false
295+
is_fork: false
296+
297+
-
298+
id: 25
299+
owner_id: 20
300+
lower_name: big_test_public_mirror_5
301+
name: big_test_public_mirror_5
302+
is_private: false
303+
num_issues: 0
304+
num_closed_issues: 0
305+
num_pulls: 0
306+
num_closed_pulls: 0
307+
num_watches: 0
308+
is_mirror: true
309+
is_fork: false
310+
311+
-
312+
id: 26
313+
owner_id: 20
314+
lower_name: big_test_private_mirror_5
315+
name: big_test_private_mirror_5
316+
is_private: true
317+
num_issues: 0
318+
num_closed_issues: 0
319+
num_pulls: 0
320+
num_closed_pulls: 0
321+
num_watches: 0
322+
is_mirror: true
323+
is_fork: false
324+
325+
-
326+
id: 27
327+
owner_id: 19
328+
lower_name: big_test_public_mirror_6
329+
name: big_test_public_mirror_6
330+
is_private: false
331+
num_issues: 0
332+
num_closed_issues: 0
333+
num_pulls: 0
334+
num_closed_pulls: 0
335+
num_watches: 0
336+
is_mirror: true
337+
num_forks: 1
338+
is_fork: false
339+
340+
-
341+
id: 28
342+
owner_id: 19
343+
lower_name: big_test_private_mirror_6
344+
name: big_test_private_mirror_6
345+
is_private: true
346+
num_issues: 0
347+
num_closed_issues: 0
348+
num_pulls: 0
349+
num_closed_pulls: 0
350+
num_watches: 0
351+
is_mirror: true
352+
num_forks: 1
353+
is_fork: false
354+
355+
-
356+
id: 29
357+
fork_id: 27
358+
owner_id: 20
359+
lower_name: big_test_public_fork_7
360+
name: big_test_public_fork_7
361+
is_private: false
362+
num_issues: 0
363+
num_closed_issues: 0
364+
num_pulls: 0
365+
num_closed_pulls: 0
366+
is_mirror: false
367+
is_fork: true
368+
369+
-
370+
id: 30
371+
fork_id: 28
372+
owner_id: 20
373+
lower_name: big_test_private_fork_7
374+
name: big_test_private_fork_7
375+
is_private: true
376+
num_issues: 0
377+
num_closed_issues: 0
378+
num_pulls: 0
379+
num_closed_pulls: 0
380+
is_mirror: false
381+
is_fork: true

models/fixtures/team.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
num_repos: 0
3838
num_members: 1
3939
unit_types: '[1,2,3,4,5,6,7]'
40+
4041
-
4142
id: 5
4243
org_id: 17
@@ -45,4 +46,14 @@
4546
authorize: 4 # owner
4647
num_repos: 2
4748
num_members: 2
49+
unit_types: '[1,2,3,4,5,6,7]'
50+
51+
-
52+
id: 6
53+
org_id: 19
54+
lower_name: owners
55+
name: Owners
56+
authorize: 4 # owner
57+
num_repos: 2
58+
num_members: 1
4859
unit_types: '[1,2,3,4,5,6,7]'

models/fixtures/team_repo.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,16 @@
2626
id: 5
2727
org_id: 17
2828
team_id: 5
29-
repo_id: 24
29+
repo_id: 24
30+
31+
-
32+
id: 6
33+
org_id: 19
34+
team_id: 6
35+
repo_id: 27
36+
37+
-
38+
id: 7
39+
org_id: 19
40+
team_id: 6
41+
repo_id: 28

models/fixtures/team_user.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,10 @@
3838
id: 7
3939
org_id: 17
4040
team_id: 5
41-
uid: 18
41+
uid: 18
42+
43+
-
44+
id: 8
45+
org_id: 19
46+
team_id: 6
47+
uid: 20

models/fixtures/user.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,4 +281,36 @@
281281
avatar: avatar18
282282
avatar_email: [email protected]
283283
num_repos: 0
284+
is_active: true
285+
286+
-
287+
id: 19
288+
lower_name: user19
289+
name: user19
290+
full_name: User 19
291+
292+
passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password
293+
type: 1 # organization
294+
salt: ZogKvWdyEx
295+
is_admin: false
296+
avatar: avatar19
297+
avatar_email: [email protected]
298+
num_repos: 2
299+
is_active: true
300+
num_members: 1
301+
num_teams: 1
302+
303+
-
304+
id: 20
305+
lower_name: user20
306+
name: user20
307+
full_name: User 20
308+
309+
passwd: 7d93daa0d1e6f2305cc8fa496847d61dc7320bb16262f9c55dd753480207234cdd96a93194e408341971742f4701772a025a # password
310+
type: 0 # individual
311+
salt: ZogKvWdyEx
312+
is_admin: false
313+
avatar: avatar20
314+
avatar_email: [email protected]
315+
num_repos: 4
284316
is_active: true

0 commit comments

Comments
 (0)