Skip to content

Commit 57367d2

Browse files
author
gdgate
authored
Merge pull request #1081 from cipous/1078_list_projects_for_user
1078 List projects for a user Reviewed-by: Libor Ryšavý https://github.com/liry
2 parents 6fbae5f + f733d0c commit 57367d2

5 files changed

Lines changed: 151 additions & 0 deletions

File tree

gooddata-java/src/main/java/com/gooddata/sdk/service/project/ProjectService.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.gooddata.sdk.common.GoodDataException;
99
import com.gooddata.sdk.common.GoodDataRestException;
10+
import com.gooddata.sdk.common.collections.CustomPageRequest;
1011
import com.gooddata.sdk.common.collections.Page;
1112
import com.gooddata.sdk.common.collections.PageBrowser;
1213
import com.gooddata.sdk.common.collections.PageRequest;
@@ -124,6 +125,30 @@ public PageBrowser<Project> listProjects(final PageRequest startPage) {
124125
return new PageBrowser<>(startPage, page -> listProjects(getProjectsUri(userId, page)));
125126
}
126127

128+
/**
129+
* Get defined page of paged list of projects that given user/account has access to.
130+
*
131+
* @param account user whose projects will be returned
132+
* @param startPage page to be retrieved
133+
* @return {@link PageBrowser} list of found projects for given user or empty list
134+
*/
135+
public PageBrowser<Project> listProjects(final Account account, final PageRequest startPage) {
136+
notNull(startPage, "startPage");
137+
notNull(account, "account");
138+
notEmpty(account.getId(), "account.uri");
139+
return new PageBrowser<>(startPage, page -> listProjects(getProjectsUri(account.getId(), page)));
140+
}
141+
142+
/**
143+
* Get browser of projects that given user/account has access to.
144+
*
145+
* @param account user whose projects will be returned
146+
* @return {@link PageBrowser} list of found projects for given user or empty list
147+
*/
148+
public PageBrowser<Project> listProjects(final Account account) {
149+
return listProjects(account, new CustomPageRequest());
150+
}
151+
127152
private Page<Project> listProjects(final URI uri) {
128153
try {
129154
final Projects projects = restTemplate.getForObject(uri, Projects.class);

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceAT.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
import static com.gooddata.sdk.model.project.ProjectEnvironment.TESTING;
3333
import static org.hamcrest.MatcherAssert.assertThat;
34+
import static org.hamcrest.Matchers.contains;
35+
import static org.hamcrest.Matchers.containsInAnyOrder;
3436
import static org.hamcrest.Matchers.empty;
3537
import static org.hamcrest.Matchers.hasSize;
3638
import static org.hamcrest.Matchers.is;
@@ -144,6 +146,26 @@ public void addUsersToProject() {
144146
}
145147

146148
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = "addUsersToProject")
149+
public void listProjectsForUser() {
150+
final ProjectService projectService = gd.getProjectService();
151+
152+
final PageBrowser<Project> projects = projectService.listProjects(account1);
153+
154+
assertThat(projects, is(notNullValue()));
155+
assertThat(projects.getPageItems().get(0).getTitle(), is(title));
156+
}
157+
158+
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = "addUsersToProject")
159+
public void listProjectsForUserSettingStartPage() {
160+
final ProjectService projectService = gd.getProjectService();
161+
162+
final PageBrowser<Project> projects = projectService.listProjects(account1, new CustomPageRequest(10, 1));
163+
164+
assertThat(projects, is(notNullValue()));
165+
assertThat(projects.getPageItems().isEmpty(), is(true));
166+
}
167+
168+
@Test(groups = {"project", "isolated_domain"}, dependsOnMethods = {"listProjectsForUser", "listProjectsForUserSettingStartPage"})
147169
public void disableUserInProject() {
148170
user.setStatus(DISABLED_STATUS);
149171

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceIT.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.gooddata.sdk.common.GoodDataException;
99
import com.gooddata.sdk.common.collections.CustomPageRequest;
10+
import com.gooddata.sdk.common.collections.PageBrowser;
1011
import com.gooddata.sdk.model.account.Account;
1112
import com.gooddata.sdk.model.gdc.AsyncTask;
1213
import com.gooddata.sdk.model.gdc.TaskStatus;
@@ -21,6 +22,8 @@
2122
import com.gooddata.sdk.model.project.Role;
2223
import com.gooddata.sdk.model.project.User;
2324
import com.gooddata.sdk.service.AbstractGoodDataIT;
25+
26+
import org.hamcrest.core.Is;
2427
import org.testng.annotations.BeforeClass;
2528
import org.testng.annotations.Test;
2629

@@ -452,4 +455,23 @@ public void removeUserFromProjectNotFound() {
452455

453456
gd.getProjectService().removeUserFromProject(enabled, account);
454457
}
458+
459+
460+
@Test
461+
public void shouldListProjectsForUser() {
462+
onRequest()
463+
.havingMethodEqualTo("GET")
464+
.havingPathEqualTo(ProjectService.LIST_PROJECTS_TEMPLATE.expand("ID").toString())
465+
.havingQueryStringEqualTo("offset=0&limit=100")
466+
.respond()
467+
.withStatus(200)
468+
.withBody(readFromResource("/project/projects-for-user.json"));
469+
470+
471+
final PageBrowser<Project> projects = gd.getProjectService().listProjects(
472+
account,
473+
new CustomPageRequest(0, 100));
474+
assertThat(projects.getPageItems().isEmpty(), is(false));
475+
assertThat(projects.getPageItems().get(0).getTitle(), Is.is("defaultEmptyProject"));
476+
}
455477
}

gooddata-java/src/test/java/com/gooddata/sdk/service/project/ProjectServiceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,33 @@ public void testListProjectsWithClientException() throws Exception {
117117
service.listProjects();
118118
}
119119

120+
@Test
121+
public void testListProjectsForUserWithPage() throws Exception {
122+
doReturn(new Projects(singletonList(project), new Paging(""))).when(restTemplate)
123+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?offset=1&limit=100"), Projects.class);
124+
final Collection<Project> result = service.listProjects(account, new CustomPageRequest(1, 100)).getPageItems();
125+
126+
assertThat(result, hasSize(1));
127+
assertThat(result, hasItem(project));
128+
}
129+
130+
@Test
131+
public void testListProjectsForUser() throws Exception {
132+
doReturn(new Projects(singletonList(project), new Paging(""))).when(restTemplate)
133+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?limit=100"), Projects.class);
134+
final Collection<Project> result = service.listProjects(account).getPageItems();
135+
136+
assertThat(result, hasSize(1));
137+
assertThat(result, hasItem(project));
138+
}
139+
140+
@Test(expectedExceptions = GoodDataException.class)
141+
public void testListProjectsForuserWithClientException() throws Exception {
142+
doThrow(new GoodDataException("")).when(restTemplate)
143+
.getForObject(new URI(LIST_PROJECTS_TEMPLATE.expand(ACCOUNT_ID) + "?limit=100"), Projects.class);
144+
service.listProjects();
145+
}
146+
120147
@Test(expectedExceptions = IllegalArgumentException.class)
121148
public void testGetProjectByUriWithNullUri() {
122149
service.getProjectByUri(null);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"projects": {
3+
"paging": {
4+
"offset": 0,
5+
"limit": 100,
6+
"count": 1,
7+
"totalCount": 1
8+
},
9+
"items": [
10+
{
11+
"project": {
12+
"content": {
13+
"state": "ENABLED",
14+
"cluster": "",
15+
"environment": "TESTING",
16+
"driver": "Pg",
17+
"isPublic": "0",
18+
"guidedNavigation": "1"
19+
},
20+
"meta": {
21+
"title": "defaultEmptyProject",
22+
"summary": "",
23+
"created": "2018-08-10 23:00:21",
24+
"updated": "2018-08-10 23:00:22",
25+
"author": "/gdc/account/profile/ID",
26+
"contributor": "/gdc/account/profile/ID"
27+
},
28+
"links": {
29+
"self": "/gdc/projects/defaultEmptyProject",
30+
"roles": "/gdc/projects/defaultEmptyProject/roles",
31+
"users": "/gdc/projects/defaultEmptyProject/users?link=1&offset=0&limit=100",
32+
"userRoles": "/gdc/projects/defaultEmptyProject/users/ID/roles",
33+
"userPermissions": "/gdc/projects/defaultEmptyProject/users/ID/permissions",
34+
"invitations": "/gdc/projects/defaultEmptyProject/invitations",
35+
"ldm": "/gdc/projects/defaultEmptyProject/ldm",
36+
"ldm_thumbnail": "/gdc/projects/defaultEmptyProject/ldm?thumbnail=1",
37+
"publicartifacts": "/gdc/projects/defaultEmptyProject/publicartifacts",
38+
"uploads": "/gdc/projects/defaultEmptyProject/uploads/",
39+
"metadata": "/gdc/md/defaultEmptyProject",
40+
"templates": "/gdc/md/defaultEmptyProject/templates",
41+
"connectors": "/gdc/projects/defaultEmptyProject/connectors",
42+
"schedules": "/gdc/projects/defaultEmptyProject/schedules",
43+
"dataload": "/gdc/projects/defaultEmptyProject/dataload",
44+
"eventstores": "/gdc/projects/defaultEmptyProject/dataload/eventstore/stores",
45+
"execute": "/gdc/projects/defaultEmptyProject/execute",
46+
"clearCaches": "/gdc/projects/defaultEmptyProject/clearCaches",
47+
"checkXaeCompatibility": "/gdc/projects/defaultEmptyProject/checkXaeCompatibility",
48+
"projectFeatureFlags": "/gdc/projects/defaultEmptyProject/projectFeatureFlags",
49+
"config": "/gdc/projects/defaultEmptyProject/config"
50+
}
51+
}
52+
}
53+
]
54+
}
55+
}

0 commit comments

Comments
 (0)