blob: 1e5157196d02dcd00401dd13ec110cb2c3138636 [file] [log] [blame]
// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.acceptance.rest.project;
import static com.google.common.truth.Truth.assertThat;
import static com.google.gerrit.acceptance.rest.project.ProjectAssert.assertThatNameList;
import static com.google.gerrit.server.group.SystemGroupBackend.REGISTERED_USERS;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.gerrit.acceptance.AbstractDaemonTest;
import com.google.gerrit.acceptance.NoHttpd;
import com.google.gerrit.acceptance.TestProjectInput;
import com.google.gerrit.common.data.Permission;
import com.google.gerrit.extensions.api.projects.Projects.ListRequest;
import com.google.gerrit.extensions.api.projects.Projects.ListRequest.FilterType;
import com.google.gerrit.extensions.common.ProjectInfo;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.Util;
import com.google.inject.Inject;
import org.junit.Test;
import java.util.List;
import java.util.Map;
@NoHttpd
public class ListProjectsIT extends AbstractDaemonTest {
@Inject
private AllUsersName allUsers;
@Test
public void listProjects() throws Exception {
Project.NameKey someProject = createProject("some-project");
assertThatNameList(filter(gApi.projects().list().get()))
.containsExactly(allProjects, allUsers, project, someProject).inOrder();
}
@Test
public void listProjectsFiltersInvisibleProjects() throws Exception {
setApiUser(user);
assertThatNameList(gApi.projects().list().get()).contains(project);
ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
Util.block(cfg, Permission.READ, REGISTERED_USERS, "refs/*");
saveProjectConfig(project, cfg);
assertThatNameList(filter(gApi.projects().list().get()))
.doesNotContain(project);
}
@Test
public void listProjectsWithBranch() throws Exception {
Map<String, ProjectInfo> result = gApi.projects().list()
.addShowBranch("master").getAsMap();
assertThat(result).containsKey(project.get());
ProjectInfo info = result.get(project.get());
assertThat(info.branches).isNotNull();
assertThat(info.branches).hasSize(1);
assertThat(info.branches.get("master")).isNotNull();
}
@Test
@TestProjectInput(description = "Description of some-project")
public void listProjectWithDescription() throws Exception {
// description not be included in the results by default.
Map<String, ProjectInfo> result = gApi.projects().list().getAsMap();
assertThat(result).containsKey(project.get());
assertThat(result.get(project.get()).description).isNull();
result = gApi.projects().list().withDescription(true).getAsMap();
assertThat(result).containsKey(project.get());
assertThat(result.get(project.get()).description).isEqualTo(
"Description of some-project");
}
@Test
public void listProjectsWithLimit() throws Exception {
for (int i = 0; i < 5; i++) {
createProject("someProject" + i);
}
String p = name("");
// 5, plus p which was automatically created.
int n = 6;
for (int i = 1; i <= n + 2; i++) {
assertThatNameList(gApi.projects().list().withPrefix(p)
.withLimit(i).get())
.hasSize(Math.min(i, n));
}
}
@Test
public void listProjectsWithPrefix() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
createProject("project-awesome");
String p = name("some");
assertBadRequest(gApi.projects().list().withPrefix(p).withRegex(".*"));
assertBadRequest(gApi.projects().list().withPrefix(p).withSubstring(p));
assertThatNameList(filter(gApi.projects().list().withPrefix(p).get()))
.containsExactly(someOtherProject, someProject).inOrder();
}
@Test
public void listProjectsWithRegex() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
Project.NameKey projectAwesome = createProject("project-awesome");
assertBadRequest(gApi.projects().list().withRegex("[.*"));
assertBadRequest(gApi.projects().list().withRegex(".*").withPrefix("p"));
assertBadRequest(gApi.projects().list().withRegex(".*").withSubstring("p"));
assertThatNameList(filter(gApi.projects().list().withRegex(".*some").get()))
.containsExactly(projectAwesome);
String r = name("some-project$").replace(".", "\\.");
assertThatNameList(filter(gApi.projects().list().withRegex(r).get()))
.containsExactly(someProject);
assertThatNameList(filter(gApi.projects().list().withRegex(".*").get()))
.containsExactly(allProjects, allUsers, project, projectAwesome,
someOtherProject, someProject)
.inOrder();
}
@Test
public void listProjectsWithStart() throws Exception {
for (int i = 0; i < 5; i++) {
createProject(new Project.NameKey("someProject" + i).get());
}
String p = name("");
List<ProjectInfo> all = gApi.projects().list().withPrefix(p).get();
// 5, plus p which was automatically created.
int n = 6;
assertThat(all).hasSize(n);
assertThatNameList(gApi.projects().list().withPrefix(p)
.withStart(n - 1).get())
.containsExactly(new Project.NameKey(Iterables.getLast(all).name));
}
@Test
public void listProjectsWithSubstring() throws Exception {
Project.NameKey someProject = createProject("some-project");
Project.NameKey someOtherProject = createProject("some-other-project");
Project.NameKey projectAwesome = createProject("project-awesome");
assertBadRequest(gApi.projects().list().withSubstring("some")
.withRegex(".*"));
assertBadRequest(gApi.projects().list().withSubstring("some")
.withPrefix("some"));
assertThatNameList(filter(gApi.projects().list().withSubstring("some")
.get()))
.containsExactly(projectAwesome, someOtherProject, someProject)
.inOrder();
}
@Test
public void listProjectsWithTree() throws Exception {
Project.NameKey someParentProject = createProject("some-parent-project");
Project.NameKey someChildProject =
createProject("some-child-project", someParentProject);
Map<String, ProjectInfo> result = gApi.projects().list().withTree(true)
.getAsMap();
assertThat(result).containsKey(someChildProject.get());
assertThat(result.get(someChildProject.get()).parent)
.isEqualTo(someParentProject.get());
}
@Test
public void listProjectWithType() throws Exception {
Map<String, ProjectInfo> result = gApi.projects().list()
.withType(FilterType.PERMISSIONS).getAsMap();
assertThat(result).hasSize(1);
assertThat(result).containsKey(allProjects.get());
assertThatNameList(filter(gApi.projects().list().withType(FilterType.ALL)
.get()))
.containsExactly(allProjects, allUsers, project).inOrder();
}
private static void assertBadRequest(ListRequest req) throws Exception {
try {
req.get();
} catch (BadRequestException expected) {
// Expected.
}
}
private Iterable<ProjectInfo> filter(Iterable<ProjectInfo> infos) {
final String prefix = name("");
return Iterables.filter(infos, new Predicate<ProjectInfo>() {
@Override
public boolean apply(ProjectInfo in) {
return in.name != null && (
in.name.equals(allProjects.get())
|| in.name.equals(allUsers.get())
|| in.name.startsWith(prefix));
}
});
}
}