|
4 | 4 | package integration |
5 | 5 |
|
6 | 6 | import ( |
| 7 | + "encoding/base64" |
7 | 8 | "fmt" |
8 | 9 | "net/http" |
9 | 10 | "net/url" |
10 | 11 | "testing" |
| 12 | + "time" |
11 | 13 |
|
12 | 14 | auth_model "code.gitea.io/gitea/models/auth" |
| 15 | + "code.gitea.io/gitea/models/db" |
13 | 16 | repo_model "code.gitea.io/gitea/models/repo" |
14 | 17 | "code.gitea.io/gitea/models/unittest" |
15 | 18 | user_model "code.gitea.io/gitea/models/user" |
16 | 19 | "code.gitea.io/gitea/modules/git" |
17 | 20 | "code.gitea.io/gitea/modules/gitrepo" |
| 21 | + "code.gitea.io/gitea/modules/setting" |
18 | 22 | api "code.gitea.io/gitea/modules/structs" |
19 | 23 | repo_service "code.gitea.io/gitea/services/repository" |
20 | 24 |
|
@@ -142,4 +146,94 @@ func testAPIGetRequestedFiles(t *testing.T, u *url.URL) { |
142 | 146 | req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/files", org3.Name, repo3.Name), &filesOptions). |
143 | 147 | AddTokenAuth(token2) |
144 | 148 | MakeRequest(t, req, http.StatusOK) |
| 149 | + |
| 150 | + // Test pagination |
| 151 | + for i := 0; i < 40; i++ { |
| 152 | + filesOptions.Files = append(filesOptions.Files, filesOptions.Files[0]) |
| 153 | + } |
| 154 | + req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/files", user2.Name, repo1.Name), &filesOptions) |
| 155 | + resp = MakeRequest(t, req, http.StatusOK) |
| 156 | + DecodeJSON(t, resp, &contentsListResponse) |
| 157 | + assert.NotNil(t, contentsListResponse) |
| 158 | + assert.Equal(t, setting.API.DefaultPagingNum, len(contentsListResponse)) |
| 159 | + |
| 160 | + // create new repo for large file tests |
| 161 | + baseRepo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{ |
| 162 | + Name: "repo-test-files-api", |
| 163 | + Description: "test files api", |
| 164 | + AutoInit: true, |
| 165 | + Gitignores: "Go", |
| 166 | + License: "MIT", |
| 167 | + Readme: "Default", |
| 168 | + DefaultBranch: "main", |
| 169 | + IsPrivate: false, |
| 170 | + }) |
| 171 | + assert.NoError(t, err) |
| 172 | + assert.NotEmpty(t, baseRepo) |
| 173 | + |
| 174 | + // Test file size limit |
| 175 | + largeFile := make([]byte, 15728640) // 15 MiB -> over max blob size |
| 176 | + for i := range largeFile { |
| 177 | + largeFile[i] = byte(i % 256) |
| 178 | + } |
| 179 | + user2APICtx := NewAPITestContext(t, baseRepo.OwnerName, baseRepo.Name, auth_model.AccessTokenScopeWriteRepository) |
| 180 | + doAPICreateFile(user2APICtx, "large-file.txt", &api.CreateFileOptions{ |
| 181 | + FileOptions: api.FileOptions{ |
| 182 | + Message: "create large-file.txt", |
| 183 | + Author: api.Identity{ |
| 184 | + Name: user2.Name, |
| 185 | + Email: user2.Email, |
| 186 | + }, |
| 187 | + Committer: api.Identity{ |
| 188 | + Name: user2.Name, |
| 189 | + Email: user2.Email, |
| 190 | + }, |
| 191 | + Dates: api.CommitDateOptions{ |
| 192 | + Author: time.Now(), |
| 193 | + Committer: time.Now(), |
| 194 | + }, |
| 195 | + }, |
| 196 | + ContentBase64: base64.StdEncoding.EncodeToString(largeFile), |
| 197 | + })(t) |
| 198 | + |
| 199 | + filesOptions.Files = []string{"large-file.txt"} |
| 200 | + req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/files", user2.Name, baseRepo.Name), &filesOptions) |
| 201 | + resp = MakeRequest(t, req, http.StatusOK) |
| 202 | + DecodeJSON(t, resp, &contentsListResponse) |
| 203 | + assert.NotNil(t, contentsListResponse) |
| 204 | + assert.Equal(t, int64(15728640), contentsListResponse[0].Size) |
| 205 | + assert.Equal(t, "", *contentsListResponse[0].Content) |
| 206 | + |
| 207 | + // Test response size limit |
| 208 | + smallFile := make([]byte, 5242880) // 5 MiB -> under max blob size |
| 209 | + for i := range smallFile { |
| 210 | + smallFile[i] = byte(i % 256) |
| 211 | + } |
| 212 | + doAPICreateFile(user2APICtx, "small-file.txt", &api.CreateFileOptions{ |
| 213 | + FileOptions: api.FileOptions{ |
| 214 | + Message: "create small-file.txt", |
| 215 | + Author: api.Identity{ |
| 216 | + Name: user2.Name, |
| 217 | + Email: user2.Email, |
| 218 | + }, |
| 219 | + Committer: api.Identity{ |
| 220 | + Name: user2.Name, |
| 221 | + Email: user2.Email, |
| 222 | + }, |
| 223 | + Dates: api.CommitDateOptions{ |
| 224 | + Author: time.Now(), |
| 225 | + Committer: time.Now(), |
| 226 | + }, |
| 227 | + }, |
| 228 | + ContentBase64: base64.StdEncoding.EncodeToString(smallFile), |
| 229 | + })(t) |
| 230 | + filesOptions.Files = []string{"small-file.txt"} |
| 231 | + for i := 0; i < 40; i++ { |
| 232 | + filesOptions.Files = append(filesOptions.Files, filesOptions.Files[0]) |
| 233 | + } |
| 234 | + req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/%s/%s/files", user2.Name, baseRepo.Name), &filesOptions) |
| 235 | + resp = MakeRequest(t, req, http.StatusOK) |
| 236 | + DecodeJSON(t, resp, &contentsListResponse) |
| 237 | + assert.NotNil(t, contentsListResponse) |
| 238 | + assert.Equal(t, 20, len(contentsListResponse)) |
145 | 239 | } |
0 commit comments