5
5
package integrations
6
6
7
7
import (
8
+ "fmt"
8
9
"net/http"
9
10
"testing"
10
11
@@ -32,7 +33,7 @@ func TestAPIUserReposNotLogin(t *testing.T) {
32
33
}
33
34
}
34
35
35
- func TestAPISearchRepoNotLogin (t * testing.T ) {
36
+ func TestAPISearchRepo (t * testing.T ) {
36
37
prepareTestEnv (t )
37
38
const keyword = "test"
38
39
@@ -47,218 +48,109 @@ func TestAPISearchRepoNotLogin(t *testing.T) {
47
48
assert .False (t , repo .Private )
48
49
}
49
50
50
- // Should return all (max 50) public repositories
51
- req = NewRequest (t , "GET" , "/api/v1/repos/search?limit=50" )
52
- resp = MakeRequest (t , req , http .StatusOK )
53
-
54
- DecodeJSON (t , resp , & body )
55
- assert .Len (t , body .Data , 12 )
56
- for _ , repo := range body .Data {
57
- assert .NotEmpty (t , repo .Name )
58
- assert .False (t , repo .Private )
59
- }
60
-
61
- // Should return (max 10) public repositories
62
- req = NewRequest (t , "GET" , "/api/v1/repos/search?limit=10" )
63
- resp = MakeRequest (t , req , http .StatusOK )
64
-
65
- DecodeJSON (t , resp , & body )
66
- assert .Len (t , body .Data , 10 )
67
- for _ , repo := range body .Data {
68
- assert .NotEmpty (t , repo .Name )
69
- assert .False (t , repo .Private )
70
- }
71
-
72
- const keyword2 = "big_test_"
73
- // Should return all public repositories which (partial) match keyword
74
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?q=%s" , keyword2 )
75
- resp = MakeRequest (t , req , http .StatusOK )
76
-
77
- DecodeJSON (t , resp , & body )
78
- assert .Len (t , body .Data , 4 )
79
- for _ , repo := range body .Data {
80
- assert .Contains (t , repo .Name , keyword2 )
81
- assert .False (t , repo .Private )
82
- }
83
-
84
- // Should return all public repositories accessible and related to user
85
- const userID = int64 (15 )
86
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , userID )
87
- resp = MakeRequest (t , req , http .StatusOK )
88
-
89
- DecodeJSON (t , resp , & body )
90
- assert .Len (t , body .Data , 4 )
91
- for _ , repo := range body .Data {
92
- assert .NotEmpty (t , repo .Name )
93
- assert .False (t , repo .Private )
94
- }
95
-
96
- // Should return all public repositories accessible and related to user
97
- const user2ID = int64 (16 )
98
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , user2ID )
99
- resp = MakeRequest (t , req , http .StatusOK )
100
-
101
- DecodeJSON (t , resp , & body )
102
- assert .Len (t , body .Data , 1 )
103
- for _ , repo := range body .Data {
104
- assert .NotEmpty (t , repo .Name )
105
- assert .False (t , repo .Private )
106
- }
107
-
108
- // Should return all public repositories owned by organization
109
- const orgID = int64 (17 )
110
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , orgID )
111
- resp = MakeRequest (t , req , http .StatusOK )
112
-
113
- DecodeJSON (t , resp , & body )
114
- assert .Len (t , body .Data , 1 )
115
- for _ , repo := range body .Data {
116
- assert .NotEmpty (t , repo .Name )
117
- assert .Equal (t , repo .Owner .ID , orgID )
118
- assert .False (t , repo .Private )
119
- }
120
- }
121
-
122
- func TestAPISearchRepoLoggedUser (t * testing.T ) {
123
- prepareTestEnv (t )
124
-
125
51
user := models .AssertExistsAndLoadBean (t , & models.User {ID : 15 }).(* models.User )
126
52
user2 := models .AssertExistsAndLoadBean (t , & models.User {ID : 16 }).(* models.User )
127
- session := loginUser (t , user .Name )
128
- session2 := loginUser (t , user2 .Name )
129
-
130
- var body api.SearchResults
131
-
132
- // Get public repositories accessible and not related to logged in user that match the keyword
133
- // Should return all public repositories which (partial) match keyword
134
- const keyword = "big_test_"
135
- req := NewRequestf (t , "GET" , "/api/v1/repos/search?q=%s" , keyword )
136
- resp := session .MakeRequest (t , req , http .StatusOK )
137
-
138
- DecodeJSON (t , resp , & body )
139
- assert .Len (t , body .Data , 4 )
140
- for _ , repo := range body .Data {
141
- assert .Contains (t , repo .Name , keyword )
142
- assert .False (t , repo .Private )
143
- }
144
- // Test when user2 is logged in
145
- resp = session2 .MakeRequest (t , req , http .StatusOK )
146
-
147
- DecodeJSON (t , resp , & body )
148
- assert .Len (t , body .Data , 4 )
149
- for _ , repo := range body .Data {
150
- assert .Contains (t , repo .Name , keyword )
151
- assert .False (t , repo .Private )
152
- }
153
-
154
- // Get all public repositories accessible and not related to logged in user
155
- // Should return all (max 50) public repositories
156
- req = NewRequest (t , "GET" , "/api/v1/repos/search?limit=50" )
157
- resp = session .MakeRequest (t , req , http .StatusOK )
158
-
159
- DecodeJSON (t , resp , & body )
160
- assert .Len (t , body .Data , 12 )
161
- for _ , repo := range body .Data {
162
- assert .NotEmpty (t , repo .Name )
163
- assert .False (t , repo .Private )
164
- }
165
- // Test when user2 is logged in
166
- resp = session2 .MakeRequest (t , req , http .StatusOK )
167
-
168
- DecodeJSON (t , resp , & body )
169
- assert .Len (t , body .Data , 12 )
170
- for _ , repo := range body .Data {
171
- assert .NotEmpty (t , repo .Name )
172
- assert .False (t , repo .Private )
173
- }
174
-
175
- // Get all public repositories accessible and not related to logged in user
176
- // Should return all (max 10) public repositories
177
- req = NewRequest (t , "GET" , "/api/v1/repos/search?limit=10" )
178
- resp = session .MakeRequest (t , req , http .StatusOK )
179
-
180
- DecodeJSON (t , resp , & body )
181
- assert .Len (t , body .Data , 10 )
182
- for _ , repo := range body .Data {
183
- assert .NotEmpty (t , repo .Name )
184
- assert .False (t , repo .Private )
185
- }
186
- // Test when user2 is logged in
187
- resp = session2 .MakeRequest (t , req , http .StatusOK )
188
-
189
- DecodeJSON (t , resp , & body )
190
- assert .Len (t , body .Data , 10 )
191
- for _ , repo := range body .Data {
192
- assert .NotEmpty (t , repo .Name )
193
- assert .False (t , repo .Private )
194
- }
195
-
196
- // Get repositories of logged in user
197
- // Should return all public and private repositories accessible and related to user
198
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , user .ID )
199
- resp = session .MakeRequest (t , req , http .StatusOK )
200
-
201
- DecodeJSON (t , resp , & body )
202
- assert .Len (t , body .Data , 8 )
203
- for _ , repo := range body .Data {
204
- assert .NotEmpty (t , repo .Name )
205
- }
206
- // Test when user2 is logged in
207
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , user2 .ID )
208
- resp = session2 .MakeRequest (t , req , http .StatusOK )
209
-
210
- DecodeJSON (t , resp , & body )
211
- assert .Len (t , body .Data , 2 )
212
- for _ , repo := range body .Data {
213
- assert .NotEmpty (t , repo .Name )
214
- }
215
-
216
- // Get repositories of another user
217
- // Should return all public repositories accessible and related to user
218
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , user2 .ID )
219
- resp = session .MakeRequest (t , req , http .StatusOK )
220
-
221
- DecodeJSON (t , resp , & body )
222
- assert .Len (t , body .Data , 1 )
223
- for _ , repo := range body .Data {
224
- assert .NotEmpty (t , repo .Name )
225
- assert .False (t , repo .Private )
226
- }
227
- // Test when user2 is logged in
228
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , user .ID )
229
- resp = session2 .MakeRequest (t , req , http .StatusOK )
230
-
231
- DecodeJSON (t , resp , & body )
232
- assert .Len (t , body .Data , 4 )
233
- for _ , repo := range body .Data {
234
- assert .NotEmpty (t , repo .Name )
235
- assert .False (t , repo .Private )
236
- }
237
-
238
- // Get repositories of organization owned by logged in user
239
- // Should return all public and private repositories owned by organization
240
- const orgID = int64 (17 )
241
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , orgID )
242
- resp = session .MakeRequest (t , req , http .StatusOK )
243
-
244
- DecodeJSON (t , resp , & body )
245
- assert .Len (t , body .Data , 2 )
246
- for _ , repo := range body .Data {
247
- assert .NotEmpty (t , repo .Name )
248
- assert .Equal (t , repo .Owner .ID , orgID )
249
- }
250
-
251
- // Get repositories of organization owned by another user
252
- // Should return all public repositories owned by organization
253
- req = NewRequestf (t , "GET" , "/api/v1/repos/search?uid=%d" , orgID )
254
- resp = session2 .MakeRequest (t , req , http .StatusOK )
255
-
256
- DecodeJSON (t , resp , & body )
257
- assert .Len (t , body .Data , 1 )
258
- for _ , repo := range body .Data {
259
- assert .NotEmpty (t , repo .Name )
260
- assert .Equal (t , repo .Owner .ID , orgID )
261
- assert .False (t , repo .Private )
53
+ orgUser := models .AssertExistsAndLoadBean (t , & models.User {ID : 17 }).(* models.User )
54
+
55
+ type privacyType int
56
+
57
+ const (
58
+ _ privacyType = iota
59
+ privacyTypePrivate
60
+ privacyTypePublic
61
+ )
62
+
63
+ // Map of expected results, where key is user for login
64
+ type expectedResults map [* models.User ]struct {
65
+ count int
66
+ repoOwnerID int64
67
+ repoName string
68
+ privacy privacyType
69
+ }
70
+
71
+ testCases := []struct {
72
+ name , requestURL string
73
+ expectedResults
74
+ }{
75
+ {name : "RepositoriesMax50" , requestURL : "/api/v1/repos/search?limit=50" , expectedResults : expectedResults {
76
+ nil : {count : 12 , privacy : privacyTypePublic },
77
+ user : {count : 12 , privacy : privacyTypePublic },
78
+ user2 : {count : 12 , privacy : privacyTypePublic }},
79
+ },
80
+ {name : "RepositoriesMax10" , requestURL : "/api/v1/repos/search?limit=10" , expectedResults : expectedResults {
81
+ nil : {count : 10 , privacy : privacyTypePublic },
82
+ user : {count : 10 , privacy : privacyTypePublic },
83
+ user2 : {count : 10 , privacy : privacyTypePublic }},
84
+ },
85
+ {name : "RepositoriesDefaultMax10" , requestURL : "/api/v1/repos/search" , expectedResults : expectedResults {
86
+ nil : {count : 10 , privacy : privacyTypePublic },
87
+ user : {count : 10 , privacy : privacyTypePublic },
88
+ user2 : {count : 10 , privacy : privacyTypePublic }},
89
+ },
90
+ {name : "RepositoriesByName" , requestURL : fmt .Sprintf ("/api/v1/repos/search?q=%s" , "big_test_" ), expectedResults : expectedResults {
91
+ nil : {count : 4 , repoName : "big_test_" , privacy : privacyTypePublic },
92
+ user : {count : 4 , repoName : "big_test_" , privacy : privacyTypePublic },
93
+ user2 : {count : 4 , repoName : "big_test_" , privacy : privacyTypePublic }},
94
+ },
95
+ {name : "RepositoriesAccessibleAndRelatedToUser" , requestURL : fmt .Sprintf ("/api/v1/repos/search?uid=%d" , user .ID ), expectedResults : expectedResults {
96
+ nil : {count : 4 , privacy : privacyTypePublic },
97
+ user : {count : 8 },
98
+ user2 : {count : 4 , privacy : privacyTypePublic }},
99
+ },
100
+ {name : "RepositoriesAccessibleAndRelatedToUser2" , requestURL : fmt .Sprintf ("/api/v1/repos/search?uid=%d" , user2 .ID ), expectedResults : expectedResults {
101
+ nil : {count : 1 , privacy : privacyTypePublic },
102
+ user : {count : 1 , privacy : privacyTypePublic },
103
+ user2 : {count : 2 }},
104
+ },
105
+ {name : "RepositoriesOwnedByOrganization" , requestURL : fmt .Sprintf ("/api/v1/repos/search?uid=%d" , orgUser .ID ), expectedResults : expectedResults {
106
+ nil : {count : 1 , repoOwnerID : orgUser .ID , privacy : privacyTypePublic },
107
+ user : {count : 2 , repoOwnerID : orgUser .ID },
108
+ user2 : {count : 1 , repoOwnerID : orgUser .ID , privacy : privacyTypePublic }},
109
+ },
110
+ }
111
+
112
+ for _ , testCase := range testCases {
113
+ t .Run (testCase .name , func (t * testing.T ) {
114
+ for userToLogin , expected := range testCase .expectedResults {
115
+ var session * TestSession
116
+ var testName string
117
+ if userToLogin != nil && userToLogin .ID > 0 {
118
+ testName = fmt .Sprintf ("LoggedUser%d" , userToLogin .ID )
119
+ session = loginUser (t , userToLogin .Name )
120
+ } else {
121
+ testName = "AnonymousUser"
122
+ session = emptyTestSession (t )
123
+ }
124
+
125
+ t .Run (testName , func (t * testing.T ) {
126
+ request := NewRequest (t , "GET" , testCase .requestURL )
127
+ response := session .MakeRequest (t , request , http .StatusOK )
128
+
129
+ var body api.SearchResults
130
+ DecodeJSON (t , response , & body )
131
+
132
+ assert .Len (t , body .Data , expected .count )
133
+ for _ , repo := range body .Data {
134
+ assert .NotEmpty (t , repo .Name )
135
+
136
+ if len (expected .repoName ) > 0 {
137
+ assert .Contains (t , repo .Name , expected .repoName )
138
+ }
139
+
140
+ if expected .repoOwnerID > 0 {
141
+ assert .Equal (t , expected .repoOwnerID , repo .Owner .ID )
142
+ }
143
+
144
+ switch expected .privacy {
145
+ case privacyTypePrivate :
146
+ assert .True (t , repo .Private )
147
+ case privacyTypePublic :
148
+ assert .False (t , repo .Private )
149
+ }
150
+ }
151
+ })
152
+ }
153
+ })
262
154
}
263
155
}
264
156
0 commit comments